diff options
author | Leo Famulari <leo@famulari.name> | 2017-01-06 17:14:41 -0500 |
---|---|---|
committer | Leo Famulari <leo@famulari.name> | 2017-01-06 17:14:41 -0500 |
commit | 74288230ea8b2310495dc2739f39ceadcc143fd0 (patch) | |
tree | 73ba6c7c13d59c5f92b409c94dccfff159e08f4d | |
parent | 92e779592d269ca1924f184496eb4ca832997b12 (diff) | |
parent | aa21c764d65068783ae31febee2a92eb3d138a24 (diff) | |
download | patches-74288230ea8b2310495dc2739f39ceadcc143fd0.tar patches-74288230ea8b2310495dc2739f39ceadcc143fd0.tar.gz |
Merge branch 'master' into core-updates
385 files changed, 35999 insertions, 25083 deletions
@@ -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> +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> -Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
\ No newline at end of file +Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr> @@ -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. diff --git a/Makefile.am b/Makefile.am index 9d62f48024..3e147df2e0 100644 --- a/Makefile.am +++ b/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 \ @@ -112,6 +116,7 @@ MODULES = \ guix/build/graft.scm \ guix/build/bournish.scm \ guix/build/qt-utils.scm \ + guix/build/make-bootstrap.scm \ guix/search-paths.scm \ guix/packages.scm \ guix/import/utils.scm \ @@ -155,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 \ @@ -165,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 += \ @@ -279,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 @@ -376,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 \ @@ -457,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= \ @@ -499,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 ; \ @@ -539,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" $@; @@ -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 diff --git a/build-aux/build-self.scm b/build-aux/build-self.scm index 485f91b4c0..cc702490df 100644 --- a/build-aux/build-self.scm +++ b/build-aux/build-self.scm @@ -114,6 +114,13 @@ files." (string-append #$guile-ssh "/lib/guile/2.0/site-ccache") %load-compiled-path))) + ;; XXX: The 'guile-ssh' package prior to Guix commit 92b7258 was + ;; broken: libguile-ssh could not be found. Work around that. + ;; FIXME: We want Guile-SSH 0.10.2 or later anyway. + #$(if (string-prefix? "0.9." (package-version guile-ssh)) + #~(setenv "LTDL_LIBRARY_PATH" (string-append #$guile-ssh "/lib")) + #t) + (build-guix #$output #$source #:system #$%system diff --git a/build-aux/check-final-inputs-self-contained.scm b/build-aux/check-final-inputs-self-contained.scm index 255286be29..dc44c4b636 100644 --- a/build-aux/check-final-inputs-self-contained.scm +++ b/build-aux/check-final-inputs-self-contained.scm @@ -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)) diff --git a/build-aux/hydra/demo-os.scm b/build-aux/hydra/demo-os.scm deleted file mode 100644 index d933bc8b25..0000000000 --- a/build-aux/hydra/demo-os.scm +++ /dev/null @@ -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))) diff --git a/build-aux/hydra/gnu-system.scm b/build-aux/hydra/gnu-system.scm index 10e0f89c4c..f5a37a2ca4 100644 --- a/build-aux/hydra/gnu-system.scm +++ b/build-aux/hydra/gnu-system.scm @@ -54,7 +54,6 @@ (gnu packages compression) (gnu packages multiprecision) (gnu packages make-bootstrap) - (gnu packages commencement) (gnu packages package-management) (gnu system) (gnu system vm) @@ -112,7 +111,7 @@ SYSTEM." gawk gnu-gettext hello guile-2.0 zlib gzip xz %bootstrap-binaries-tarball %binutils-bootstrap-tarball - %glibc-bootstrap-tarball + (%glibc-bootstrap-tarball) %gcc-bootstrap-tarball %guile-bootstrap-tarball %bootstrap-tarballs)) @@ -124,14 +123,9 @@ SYSTEM." '("mips64el-linux-gnu" "mips64el-linux-gnuabi64" "arm-linux-gnueabihf" + "i686-w64-mingw32" "powerpc-linux-gnu")) -(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")) @@ -157,14 +151,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)) @@ -241,7 +228,7 @@ all its dependencies, and ready to be installed on non-GuixSD distributions.") (match (package-transitive-inputs package) (((_ inputs _ ...) ...) inputs)))) - %final-inputs)))) + (%final-inputs))))) (lambda (store package system) "Return a job for PACKAGE on SYSTEM, or #f if this combination is not valid." @@ -279,16 +266,22 @@ valid." ;; 'mips64el-linux'. (string-contains target system)) - (define (either proc1 proc2) + (define (pointless? target) + ;; Return #t if it makes no sense to cross-build to TARGET from SYSTEM. + (and (string-contains target "mingw") + (not (string=? "x86_64-linux" system)))) + + (define (either proc1 proc2 proc3) (lambda (x) - (or (proc1 x) (proc2 x)))) + (or (proc1 x) (proc2 x) (proc3 x)))) (append-map (lambda (target) (map (lambda (package) (package-cross-job store (job-name package) package target system)) %packages-to-cross-build)) - (remove (either from-32-to-64? same?) %cross-targets))) + (remove (either from-32-to-64? same? pointless?) + %cross-targets))) ;; Turn off grafts. Grafting is meant to happen on the user's machines. (parameterize ((%graft? #f)) diff --git a/configure.ac b/configure.ac index 34f1323792..676f600111 100644 --- a/configure.ac +++ b/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]) @@ -237,14 +242,4 @@ 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_OUTPUT diff --git a/d3.v3.js b/d3.v3.js new file mode 100644 index 0000000000..d234c4ec86 --- /dev/null +++ b/d3.v3.js @@ -0,0 +1,9584 @@ +// Downloaded from http://d3js.org/d3.v3.js +// +// Copyright 2010-2016 Mike Bostock +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of contributors may be used to +// endorse or promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +!function() { + var d3 = { + version: "3.5.17" + }; + var d3_arraySlice = [].slice, d3_array = function(list) { + return d3_arraySlice.call(list); + }; + var d3_document = this.document; + function d3_documentElement(node) { + return node && (node.ownerDocument || node.document || node).documentElement; + } + function d3_window(node) { + return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView); + } + if (d3_document) { + try { + d3_array(d3_document.documentElement.childNodes)[0].nodeType; + } catch (e) { + d3_array = function(list) { + var i = list.length, array = new Array(i); + while (i--) array[i] = list[i]; + return array; + }; + } + } + if (!Date.now) Date.now = function() { + return +new Date(); + }; + if (d3_document) { + try { + d3_document.createElement("DIV").style.setProperty("opacity", 0, ""); + } catch (error) { + var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; + d3_element_prototype.setAttribute = function(name, value) { + d3_element_setAttribute.call(this, name, value + ""); + }; + d3_element_prototype.setAttributeNS = function(space, local, value) { + d3_element_setAttributeNS.call(this, space, local, value + ""); + }; + d3_style_prototype.setProperty = function(name, value, priority) { + d3_style_setProperty.call(this, name, value + "", priority); + }; + } + } + d3.ascending = d3_ascending; + function d3_ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + d3.descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + d3.min = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; + } + return a; + }; + d3.max = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; + } + return a; + }; + d3.extent = function(array, f) { + var i = -1, n = array.length, a, b, c; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + return [ a, c ]; + }; + function d3_number(x) { + return x === null ? NaN : +x; + } + function d3_numeric(x) { + return !isNaN(x); + } + d3.sum = function(array, f) { + var s = 0, n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = +array[i])) s += a; + } else { + while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a; + } + return s; + }; + d3.mean = function(array, f) { + var s = 0, n = array.length, a, i = -1, j = n; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j; + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j; + } + if (j) return s / j; + }; + d3.quantile = function(values, p) { + var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; + return e ? v + e * (values[h] - v) : v; + }; + d3.median = function(array, f) { + var numbers = [], n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a); + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a); + } + if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5); + }; + d3.variance = function(array, f) { + var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0; + if (arguments.length === 1) { + while (++i < n) { + if (d3_numeric(a = d3_number(array[i]))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } else { + while (++i < n) { + if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + if (j > 1) return s / (j - 1); + }; + d3.deviation = function() { + var v = d3.variance.apply(this, arguments); + return v ? Math.sqrt(v) : v; + }; + function d3_bisector(compare) { + return { + left: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1; + } + return lo; + } + }; + } + var d3_bisect = d3_bisector(d3_ascending); + d3.bisectLeft = d3_bisect.left; + d3.bisect = d3.bisectRight = d3_bisect.right; + d3.bisector = function(f) { + return d3_bisector(f.length === 1 ? function(d, x) { + return d3_ascending(f(d), x); + } : f); + }; + d3.shuffle = function(array, i0, i1) { + if ((m = arguments.length) < 3) { + i1 = array.length; + if (m < 2) i0 = 0; + } + var m = i1 - i0, t, i; + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t; + } + return array; + }; + d3.permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + }; + d3.pairs = function(array) { + var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ]; + return pairs; + }; + d3.transpose = function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) { + row[j] = matrix[j][i]; + } + } + return transpose; + }; + function d3_transposeLength(d) { + return d.length; + } + d3.zip = function() { + return d3.transpose(arguments); + }; + d3.keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + }; + d3.values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + }; + d3.entries = function(map) { + var entries = []; + for (var key in map) entries.push({ + key: key, + value: map[key] + }); + return entries; + }; + d3.merge = function(arrays) { + var n = arrays.length, m, i = -1, j = 0, merged, array; + while (++i < n) j += arrays[i].length; + merged = new Array(j); + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + return merged; + }; + var abs = Math.abs; + d3.range = function(start, stop, step) { + if (arguments.length < 3) { + step = 1; + if (arguments.length < 2) { + stop = start; + start = 0; + } + } + if ((stop - start) / step === Infinity) throw new Error("infinite range"); + var range = [], k = d3_range_integerScale(abs(step)), i = -1, j; + start *= k, stop *= k, step *= k; + if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); + return range; + }; + function d3_range_integerScale(x) { + var k = 1; + while (x * k % 1) k *= 10; + return k; + } + function d3_class(ctor, properties) { + for (var key in properties) { + Object.defineProperty(ctor.prototype, key, { + value: properties[key], + enumerable: false + }); + } + } + d3.map = function(object, f) { + var map = new d3_Map(); + if (object instanceof d3_Map) { + object.forEach(function(key, value) { + map.set(key, value); + }); + } else if (Array.isArray(object)) { + var i = -1, n = object.length, o; + if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o); + } else { + for (var key in object) map.set(key, object[key]); + } + return map; + }; + function d3_Map() { + this._ = Object.create(null); + } + var d3_map_proto = "__proto__", d3_map_zero = "\x00"; + d3_class(d3_Map, { + has: d3_map_has, + get: function(key) { + return this._[d3_map_escape(key)]; + }, + set: function(key, value) { + return this._[d3_map_escape(key)] = value; + }, + remove: d3_map_remove, + keys: d3_map_keys, + values: function() { + var values = []; + for (var key in this._) values.push(this._[key]); + return values; + }, + entries: function() { + var entries = []; + for (var key in this._) entries.push({ + key: d3_map_unescape(key), + value: this._[key] + }); + return entries; + }, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]); + } + }); + function d3_map_escape(key) { + return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key; + } + function d3_map_unescape(key) { + return (key += "")[0] === d3_map_zero ? key.slice(1) : key; + } + function d3_map_has(key) { + return d3_map_escape(key) in this._; + } + function d3_map_remove(key) { + return (key = d3_map_escape(key)) in this._ && delete this._[key]; + } + function d3_map_keys() { + var keys = []; + for (var key in this._) keys.push(d3_map_unescape(key)); + return keys; + } + function d3_map_size() { + var size = 0; + for (var key in this._) ++size; + return size; + } + function d3_map_empty() { + for (var key in this._) return false; + return true; + } + d3.nest = function() { + var nest = {}, keys = [], sortKeys = [], sortValues, rollup; + function map(mapType, array, depth) { + if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; + var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values; + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(object = array[i]))) { + values.push(object); + } else { + valuesByKey.set(keyValue, [ object ]); + } + } + if (mapType) { + object = mapType(); + setter = function(keyValue, values) { + object.set(keyValue, map(mapType, values, depth)); + }; + } else { + object = {}; + setter = function(keyValue, values) { + object[keyValue] = map(mapType, values, depth); + }; + } + valuesByKey.forEach(setter); + return object; + } + function entries(map, depth) { + if (depth >= keys.length) return map; + var array = [], sortKey = sortKeys[depth++]; + map.forEach(function(key, keyMap) { + array.push({ + key: key, + values: entries(keyMap, depth) + }); + }); + return sortKey ? array.sort(function(a, b) { + return sortKey(a.key, b.key); + }) : array; + } + nest.map = function(array, mapType) { + return map(mapType, array, 0); + }; + nest.entries = function(array) { + return entries(map(d3.map, array, 0), 0); + }; + nest.key = function(d) { + keys.push(d); + return nest; + }; + nest.sortKeys = function(order) { + sortKeys[keys.length - 1] = order; + return nest; + }; + nest.sortValues = function(order) { + sortValues = order; + return nest; + }; + nest.rollup = function(f) { + rollup = f; + return nest; + }; + return nest; + }; + d3.set = function(array) { + var set = new d3_Set(); + if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); + return set; + }; + function d3_Set() { + this._ = Object.create(null); + } + d3_class(d3_Set, { + has: d3_map_has, + add: function(key) { + this._[d3_map_escape(key += "")] = true; + return key; + }, + remove: d3_map_remove, + values: d3_map_keys, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key)); + } + }); + d3.behavior = {}; + function d3_identity(d) { + return d; + } + d3.rebind = function(target, source) { + var i = 1, n = arguments.length, method; + while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); + return target; + }; + function d3_rebind(target, source, method) { + return function() { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; + } + function d3_vendorSymbol(object, name) { + if (name in object) return name; + name = name.charAt(0).toUpperCase() + name.slice(1); + for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { + var prefixName = d3_vendorPrefixes[i] + name; + if (prefixName in object) return prefixName; + } + } + var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ]; + function d3_noop() {} + d3.dispatch = function() { + var dispatch = new d3_dispatch(), i = -1, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + return dispatch; + }; + function d3_dispatch() {} + d3_dispatch.prototype.on = function(type, listener) { + var i = type.indexOf("."), name = ""; + if (i >= 0) { + name = type.slice(i + 1); + type = type.slice(0, i); + } + if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); + if (arguments.length === 2) { + if (listener == null) for (type in this) { + if (this.hasOwnProperty(type)) this[type].on(name, null); + } + return this; + } + }; + function d3_dispatch_event(dispatch) { + var listeners = [], listenerByName = new d3_Map(); + function event() { + var z = listeners, i = -1, n = z.length, l; + while (++i < n) if (l = z[i].on) l.apply(this, arguments); + return dispatch; + } + event.on = function(name, listener) { + var l = listenerByName.get(name), i; + if (arguments.length < 2) return l && l.on; + if (l) { + l.on = null; + listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); + listenerByName.remove(name); + } + if (listener) listeners.push(listenerByName.set(name, { + on: listener + })); + return dispatch; + }; + return event; + } + d3.event = null; + function d3_eventPreventDefault() { + d3.event.preventDefault(); + } + function d3_eventSource() { + var e = d3.event, s; + while (s = e.sourceEvent) e = s; + return e; + } + function d3_eventDispatch(target) { + var dispatch = new d3_dispatch(), i = 0, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + dispatch.of = function(thiz, argumentz) { + return function(e1) { + try { + var e0 = e1.sourceEvent = d3.event; + e1.target = target; + d3.event = e1; + dispatch[e1.type].apply(thiz, argumentz); + } finally { + d3.event = e0; + } + }; + }; + return dispatch; + } + d3.requote = function(s) { + return s.replace(d3_requote_re, "\\$&"); + }; + var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + var d3_subclass = {}.__proto__ ? function(object, prototype) { + object.__proto__ = prototype; + } : function(object, prototype) { + for (var property in prototype) object[property] = prototype[property]; + }; + function d3_selection(groups) { + d3_subclass(groups, d3_selectionPrototype); + return groups; + } + var d3_select = function(s, n) { + return n.querySelector(s); + }, d3_selectAll = function(s, n) { + return n.querySelectorAll(s); + }, d3_selectMatches = function(n, s) { + var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")]; + d3_selectMatches = function(n, s) { + return d3_selectMatcher.call(n, s); + }; + return d3_selectMatches(n, s); + }; + if (typeof Sizzle === "function") { + d3_select = function(s, n) { + return Sizzle(s, n)[0] || null; + }; + d3_selectAll = Sizzle; + d3_selectMatches = Sizzle.matchesSelector; + } + d3.selection = function() { + return d3.select(d3_document.documentElement); + }; + var d3_selectionPrototype = d3.selection.prototype = []; + d3_selectionPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, group, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(subnode = selector.call(node, node.__data__, i, j)); + if (subnode && "__data__" in node) subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selector(selector) { + return typeof selector === "function" ? selector : function() { + return d3_select(selector, this); + }; + } + d3_selectionPrototype.selectAll = function(selector) { + var subgroups = [], subgroup, node; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); + subgroup.parentNode = node; + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selectorAll(selector) { + return typeof selector === "function" ? selector : function() { + return d3_selectAll(selector, this); + }; + } + var d3_nsXhtml = "http://www.w3.org/1999/xhtml"; + var d3_nsPrefix = { + svg: "http://www.w3.org/2000/svg", + xhtml: d3_nsXhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + d3.ns = { + prefix: d3_nsPrefix, + qualify: function(name) { + var i = name.indexOf(":"), prefix = name; + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return d3_nsPrefix.hasOwnProperty(prefix) ? { + space: d3_nsPrefix[prefix], + local: name + } : name; + } + }; + d3_selectionPrototype.attr = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(); + name = d3.ns.qualify(name); + return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); + } + for (value in name) this.each(d3_selection_attr(value, name[value])); + return this; + } + return this.each(d3_selection_attr(name, value)); + }; + function d3_selection_attr(name, value) { + name = d3.ns.qualify(name); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrConstant() { + this.setAttribute(name, value); + } + function attrConstantNS() { + this.setAttributeNS(name.space, name.local, value); + } + function attrFunction() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); + } + function attrFunctionNS() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); + } + return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; + } + function d3_collapse(s) { + return s.trim().replace(/\s+/g, " "); + } + d3_selectionPrototype.classed = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1; + if (value = node.classList) { + while (++i < n) if (!value.contains(name[i])) return false; + } else { + value = node.getAttribute("class"); + while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; + } + return true; + } + for (value in name) this.each(d3_selection_classed(value, name[value])); + return this; + } + return this.each(d3_selection_classed(name, value)); + }; + function d3_selection_classedRe(name) { + return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); + } + function d3_selection_classes(name) { + return (name + "").trim().split(/^|\s+/); + } + function d3_selection_classed(name, value) { + name = d3_selection_classes(name).map(d3_selection_classedName); + var n = name.length; + function classedConstant() { + var i = -1; + while (++i < n) name[i](this, value); + } + function classedFunction() { + var i = -1, x = value.apply(this, arguments); + while (++i < n) name[i](this, x); + } + return typeof value === "function" ? classedFunction : classedConstant; + } + function d3_selection_classedName(name) { + var re = d3_selection_classedRe(name); + return function(node, value) { + if (c = node.classList) return value ? c.add(name) : c.remove(name); + var c = node.getAttribute("class") || ""; + if (value) { + re.lastIndex = 0; + if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); + } else { + node.setAttribute("class", d3_collapse(c.replace(re, " "))); + } + }; + } + d3_selectionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); + return this; + } + if (n < 2) { + var node = this.node(); + return d3_window(node).getComputedStyle(node, null).getPropertyValue(name); + } + priority = ""; + } + return this.each(d3_selection_style(name, value, priority)); + }; + function d3_selection_style(name, value, priority) { + function styleNull() { + this.style.removeProperty(name); + } + function styleConstant() { + this.style.setProperty(name, value, priority); + } + function styleFunction() { + var x = value.apply(this, arguments); + if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); + } + return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; + } + d3_selectionPrototype.property = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") return this.node()[name]; + for (value in name) this.each(d3_selection_property(value, name[value])); + return this; + } + return this.each(d3_selection_property(name, value)); + }; + function d3_selection_property(name, value) { + function propertyNull() { + delete this[name]; + } + function propertyConstant() { + this[name] = value; + } + function propertyFunction() { + var x = value.apply(this, arguments); + if (x == null) delete this[name]; else this[name] = x; + } + return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; + } + d3_selectionPrototype.text = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + } : value == null ? function() { + this.textContent = ""; + } : function() { + this.textContent = value; + }) : this.node().textContent; + }; + d3_selectionPrototype.html = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + } : value == null ? function() { + this.innerHTML = ""; + } : function() { + this.innerHTML = value; + }) : this.node().innerHTML; + }; + d3_selectionPrototype.append = function(name) { + name = d3_selection_creator(name); + return this.select(function() { + return this.appendChild(name.apply(this, arguments)); + }); + }; + function d3_selection_creator(name) { + function create() { + var document = this.ownerDocument, namespace = this.namespaceURI; + return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name); + } + function createNS() { + return this.ownerDocument.createElementNS(name.space, name.local); + } + return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? createNS : create; + } + d3_selectionPrototype.insert = function(name, before) { + name = d3_selection_creator(name); + before = d3_selection_selector(before); + return this.select(function() { + return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null); + }); + }; + d3_selectionPrototype.remove = function() { + return this.each(d3_selectionRemove); + }; + function d3_selectionRemove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + d3_selectionPrototype.data = function(value, key) { + var i = -1, n = this.length, group, node; + if (!arguments.length) { + value = new Array(n = (group = this[0]).length); + while (++i < n) { + if (node = group[i]) { + value[i] = node.__data__; + } + } + return value; + } + function bind(group, groupData) { + var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData; + if (key) { + var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue; + for (i = -1; ++i < n; ) { + if (node = group[i]) { + if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) { + exitNodes[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + keyValues[i] = keyValue; + } + } + for (i = -1; ++i < m; ) { + if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { + enterNodes[i] = d3_selection_dataNode(nodeData); + } else if (node !== true) { + updateNodes[i] = node; + node.__data__ = nodeData; + } + nodeByKeyValue.set(keyValue, true); + } + for (i = -1; ++i < n; ) { + if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) { + exitNodes[i] = group[i]; + } + } + } else { + for (i = -1; ++i < n0; ) { + node = group[i]; + nodeData = groupData[i]; + if (node) { + node.__data__ = nodeData; + updateNodes[i] = node; + } else { + enterNodes[i] = d3_selection_dataNode(nodeData); + } + } + for (;i < m; ++i) { + enterNodes[i] = d3_selection_dataNode(groupData[i]); + } + for (;i < n; ++i) { + exitNodes[i] = group[i]; + } + } + enterNodes.update = updateNodes; + enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; + enter.push(enterNodes); + update.push(updateNodes); + exit.push(exitNodes); + } + var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); + if (typeof value === "function") { + while (++i < n) { + bind(group = this[i], value.call(group, group.parentNode.__data__, i)); + } + } else { + while (++i < n) { + bind(group = this[i], value); + } + } + update.enter = function() { + return enter; + }; + update.exit = function() { + return exit; + }; + return update; + }; + function d3_selection_dataNode(data) { + return { + __data__: data + }; + } + d3_selectionPrototype.datum = function(value) { + return arguments.length ? this.property("__data__", value) : this.property("__data__"); + }; + d3_selectionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_filter(selector) { + return function() { + return d3_selectMatches(this, selector); + }; + } + d3_selectionPrototype.order = function() { + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; + }; + d3_selectionPrototype.sort = function(comparator) { + comparator = d3_selection_sortComparator.apply(this, arguments); + for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); + return this.order(); + }; + function d3_selection_sortComparator(comparator) { + if (!arguments.length) comparator = d3_ascending; + return function(a, b) { + return a && b ? comparator(a.__data__, b.__data__) : !a - !b; + }; + } + d3_selectionPrototype.each = function(callback) { + return d3_selection_each(this, function(node, i, j) { + callback.call(node, node.__data__, i, j); + }); + }; + function d3_selection_each(groups, callback) { + for (var j = 0, m = groups.length; j < m; j++) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { + if (node = group[i]) callback(node, i, j); + } + } + return groups; + } + d3_selectionPrototype.call = function(callback) { + var args = d3_array(arguments); + callback.apply(args[0] = this, args); + return this; + }; + d3_selectionPrototype.empty = function() { + return !this.node(); + }; + d3_selectionPrototype.node = function() { + for (var j = 0, m = this.length; j < m; j++) { + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + var node = group[i]; + if (node) return node; + } + } + return null; + }; + d3_selectionPrototype.size = function() { + var n = 0; + d3_selection_each(this, function() { + ++n; + }); + return n; + }; + function d3_selection_enter(selection) { + d3_subclass(selection, d3_selection_enterPrototype); + return selection; + } + var d3_selection_enterPrototype = []; + d3.selection.enter = d3_selection_enter; + d3.selection.enter.prototype = d3_selection_enterPrototype; + d3_selection_enterPrototype.append = d3_selectionPrototype.append; + d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; + d3_selection_enterPrototype.node = d3_selectionPrototype.node; + d3_selection_enterPrototype.call = d3_selectionPrototype.call; + d3_selection_enterPrototype.size = d3_selectionPrototype.size; + d3_selection_enterPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, upgroup, group, node; + for (var j = -1, m = this.length; ++j < m; ) { + upgroup = (group = this[j]).update; + subgroups.push(subgroup = []); + subgroup.parentNode = group.parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); + subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + d3_selection_enterPrototype.insert = function(name, before) { + if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); + return d3_selectionPrototype.insert.call(this, name, before); + }; + function d3_selection_enterInsertBefore(enter) { + var i0, j0; + return function(d, i, j) { + var group = enter[j].update, n = group.length, node; + if (j != j0) j0 = j, i0 = 0; + if (i >= i0) i0 = i + 1; + while (!(node = group[i0]) && ++i0 < n) ; + return node; + }; + } + d3.select = function(node) { + var group; + if (typeof node === "string") { + group = [ d3_select(node, d3_document) ]; + group.parentNode = d3_document.documentElement; + } else { + group = [ node ]; + group.parentNode = d3_documentElement(node); + } + return d3_selection([ group ]); + }; + d3.selectAll = function(nodes) { + var group; + if (typeof nodes === "string") { + group = d3_array(d3_selectAll(nodes, d3_document)); + group.parentNode = d3_document.documentElement; + } else { + group = d3_array(nodes); + group.parentNode = null; + } + return d3_selection([ group ]); + }; + d3_selectionPrototype.on = function(type, listener, capture) { + var n = arguments.length; + if (n < 3) { + if (typeof type !== "string") { + if (n < 2) listener = false; + for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); + return this; + } + if (n < 2) return (n = this.node()["__on" + type]) && n._; + capture = false; + } + return this.each(d3_selection_on(type, listener, capture)); + }; + function d3_selection_on(type, listener, capture) { + var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener; + if (i > 0) type = type.slice(0, i); + var filter = d3_selection_onFilters.get(type); + if (filter) type = filter, wrap = d3_selection_onFilter; + function onRemove() { + var l = this[name]; + if (l) { + this.removeEventListener(type, l, l.$); + delete this[name]; + } + } + function onAdd() { + var l = wrap(listener, d3_array(arguments)); + onRemove.call(this); + this.addEventListener(type, this[name] = l, l.$ = capture); + l._ = listener; + } + function removeAll() { + var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match; + for (var name in this) { + if (match = name.match(re)) { + var l = this[name]; + this.removeEventListener(match[1], l, l.$); + delete this[name]; + } + } + } + return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll; + } + var d3_selection_onFilters = d3.map({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }); + if (d3_document) { + d3_selection_onFilters.forEach(function(k) { + if ("on" + k in d3_document) d3_selection_onFilters.remove(k); + }); + } + function d3_selection_onListener(listener, argumentz) { + return function(e) { + var o = d3.event; + d3.event = e; + argumentz[0] = this.__data__; + try { + listener.apply(this, argumentz); + } finally { + d3.event = o; + } + }; + } + function d3_selection_onFilter(listener, argumentz) { + var l = d3_selection_onListener(listener, argumentz); + return function(e) { + var target = this, related = e.relatedTarget; + if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) { + l.call(target, e); + } + }; + } + var d3_event_dragSelect, d3_event_dragId = 0; + function d3_event_dragSuppress(node) { + var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window(node)).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault); + if (d3_event_dragSelect == null) { + d3_event_dragSelect = "onselectstart" in node ? false : d3_vendorSymbol(node.style, "userSelect"); + } + if (d3_event_dragSelect) { + var style = d3_documentElement(node).style, select = style[d3_event_dragSelect]; + style[d3_event_dragSelect] = "none"; + } + return function(suppressClick) { + w.on(name, null); + if (d3_event_dragSelect) style[d3_event_dragSelect] = select; + if (suppressClick) { + var off = function() { + w.on(click, null); + }; + w.on(click, function() { + d3_eventPreventDefault(); + off(); + }, true); + setTimeout(off, 0); + } + }; + } + d3.mouse = function(container) { + return d3_mousePoint(container, d3_eventSource()); + }; + var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0; + function d3_mousePoint(container, e) { + if (e.changedTouches) e = e.changedTouches[0]; + var svg = container.ownerSVGElement || container; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + if (d3_mouse_bug44083 < 0) { + var window = d3_window(container); + if (window.scrollX || window.scrollY) { + svg = d3.select("body").append("svg").style({ + position: "absolute", + top: 0, + left: 0, + margin: 0, + padding: 0, + border: "none" + }, "important"); + var ctm = svg[0][0].getScreenCTM(); + d3_mouse_bug44083 = !(ctm.f || ctm.e); + svg.remove(); + } + } + if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, + point.y = e.clientY; + point = point.matrixTransform(container.getScreenCTM().inverse()); + return [ point.x, point.y ]; + } + var rect = container.getBoundingClientRect(); + return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; + } + d3.touch = function(container, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; + if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return d3_mousePoint(container, touch); + } + } + }; + d3.behavior.drag = function() { + var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, "touchmove", "touchend"); + function drag() { + this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart); + } + function dragstart(id, position, subject, move, end) { + return function() { + var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId); + if (origin) { + dragOffset = origin.apply(that, arguments); + dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ]; + } else { + dragOffset = [ 0, 0 ]; + } + dispatch({ + type: "dragstart" + }); + function moved() { + var position1 = position(parent, dragId), dx, dy; + if (!position1) return; + dx = position1[0] - position0[0]; + dy = position1[1] - position0[1]; + dragged |= dx | dy; + position0 = position1; + dispatch({ + type: "drag", + x: position1[0] + dragOffset[0], + y: position1[1] + dragOffset[1], + dx: dx, + dy: dy + }); + } + function ended() { + if (!position(parent, dragId)) return; + dragSubject.on(move + dragName, null).on(end + dragName, null); + dragRestore(dragged); + dispatch({ + type: "dragend" + }); + } + }; + } + drag.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return drag; + }; + return d3.rebind(drag, event, "on"); + }; + function d3_behavior_dragTouchId() { + return d3.event.changedTouches[0].identifier; + } + d3.touches = function(container, touches) { + if (arguments.length < 2) touches = d3_eventSource().touches; + return touches ? d3_array(touches).map(function(touch) { + var point = d3_mousePoint(container, touch); + point.identifier = touch.identifier; + return point; + }) : []; + }; + var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π; + function d3_sgn(x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + function d3_cross2d(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + function d3_acos(x) { + return x > 1 ? 0 : x < -1 ? π : Math.acos(x); + } + function d3_asin(x) { + return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x); + } + function d3_sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + function d3_cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + function d3_tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + function d3_haversin(x) { + return (x = Math.sin(x / 2)) * x; + } + var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4; + d3.interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < ε2) { + S = Math.log(w1 / w0) / ρ; + i = function(t) { + return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / ρ; + i = function(t) { + var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); + return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ]; + }; + } + i.duration = S * 1e3; + return i; + }; + d3.behavior.zoom = function() { + var view = { + x: 0, + y: 0, + k: 1 + }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1; + if (!d3_behavior_zoomWheel) { + d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); + }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return d3.event.wheelDelta; + }, "mousewheel") : (d3_behavior_zoomDelta = function() { + return -d3.event.detail; + }, "MozMousePixelScroll"); + } + function zoom(g) { + g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted); + } + zoom.event = function(g) { + g.each(function() { + var dispatch = event.of(this, arguments), view1 = view; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.zoom", function() { + view = this.__chart__ || { + x: 0, + y: 0, + k: 1 + }; + zoomstarted(dispatch); + }).tween("zoom:zoom", function() { + var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]); + return function(t) { + var l = i(t), k = dx / l[2]; + this.__chart__ = view = { + x: cx - l[0] * k, + y: cy - l[1] * k, + k: k + }; + zoomed(dispatch); + }; + }).each("interrupt.zoom", function() { + zoomended(dispatch); + }).each("end.zoom", function() { + zoomended(dispatch); + }); + } else { + this.__chart__ = view; + zoomstarted(dispatch); + zoomed(dispatch); + zoomended(dispatch); + } + }); + }; + zoom.translate = function(_) { + if (!arguments.length) return [ view.x, view.y ]; + view = { + x: +_[0], + y: +_[1], + k: view.k + }; + rescale(); + return zoom; + }; + zoom.scale = function(_) { + if (!arguments.length) return view.k; + view = { + x: view.x, + y: view.y, + k: null + }; + scaleTo(+_); + rescale(); + return zoom; + }; + zoom.scaleExtent = function(_) { + if (!arguments.length) return scaleExtent; + scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ]; + return zoom; + }; + zoom.center = function(_) { + if (!arguments.length) return center; + center = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.size = function(_) { + if (!arguments.length) return size; + size = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.duration = function(_) { + if (!arguments.length) return duration; + duration = +_; + return zoom; + }; + zoom.x = function(z) { + if (!arguments.length) return x1; + x1 = z; + x0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + zoom.y = function(z) { + if (!arguments.length) return y1; + y1 = z; + y0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + function location(p) { + return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ]; + } + function point(l) { + return [ l[0] * view.k + view.x, l[1] * view.k + view.y ]; + } + function scaleTo(s) { + view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); + } + function translateTo(p, l) { + l = point(l); + view.x += p[0] - l[0]; + view.y += p[1] - l[1]; + } + function zoomTo(that, p, l, k) { + that.__chart__ = { + x: view.x, + y: view.y, + k: view.k + }; + scaleTo(Math.pow(2, k)); + translateTo(center0 = p, l); + that = d3.select(that); + if (duration > 0) that = that.transition().duration(duration); + that.call(zoom.event); + } + function rescale() { + if (x1) x1.domain(x0.range().map(function(x) { + return (x - view.x) / view.k; + }).map(x0.invert)); + if (y1) y1.domain(y0.range().map(function(y) { + return (y - view.y) / view.k; + }).map(y0.invert)); + } + function zoomstarted(dispatch) { + if (!zooming++) dispatch({ + type: "zoomstart" + }); + } + function zoomed(dispatch) { + rescale(); + dispatch({ + type: "zoom", + scale: view.k, + translate: [ view.x, view.y ] + }); + } + function zoomended(dispatch) { + if (!--zooming) dispatch({ + type: "zoomend" + }), center0 = null; + } + function mousedowned() { + var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that); + d3_selection_interrupt.call(that); + zoomstarted(dispatch); + function moved() { + dragged = 1; + translateTo(d3.mouse(that), location0); + zoomed(dispatch); + } + function ended() { + subject.on(mousemove, null).on(mouseup, null); + dragRestore(dragged); + zoomended(dispatch); + } + } + function touchstarted() { + var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that); + started(); + zoomstarted(dispatch); + subject.on(mousedown, null).on(touchstart, started); + function relocate() { + var touches = d3.touches(that); + scale0 = view.k; + touches.forEach(function(t) { + if (t.identifier in locations0) locations0[t.identifier] = location(t); + }); + return touches; + } + function started() { + var target = d3.event.target; + d3.select(target).on(touchmove, moved).on(touchend, ended); + targets.push(target); + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + locations0[changed[i].identifier] = null; + } + var touches = relocate(), now = Date.now(); + if (touches.length === 1) { + if (now - touchtime < 500) { + var p = touches[0]; + zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1); + d3_eventPreventDefault(); + } + touchtime = now; + } else if (touches.length > 1) { + var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1]; + distance0 = dx * dx + dy * dy; + } + } + function moved() { + var touches = d3.touches(that), p0, l0, p1, l1; + d3_selection_interrupt.call(that); + for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { + p1 = touches[i]; + if (l1 = locations0[p1.identifier]) { + if (l0) break; + p0 = p1, l0 = l1; + } + } + if (l1) { + var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0); + p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; + l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; + scaleTo(scale1 * scale0); + } + touchtime = null; + translateTo(p0, l0); + zoomed(dispatch); + } + function ended() { + if (d3.event.touches.length) { + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + delete locations0[changed[i].identifier]; + } + for (var identifier in locations0) { + return void relocate(); + } + } + d3.selectAll(targets).on(zoomName, null); + subject.on(mousedown, mousedowned).on(touchstart, touchstarted); + dragRestore(); + zoomended(dispatch); + } + } + function mousewheeled() { + var dispatch = event.of(this, arguments); + if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), + translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch); + mousewheelTimer = setTimeout(function() { + mousewheelTimer = null; + zoomended(dispatch); + }, 50); + d3_eventPreventDefault(); + scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); + translateTo(center0, translate0); + zoomed(dispatch); + } + function dblclicked() { + var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2; + zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1); + } + return d3.rebind(zoom, event, "on"); + }; + var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel; + d3.color = d3_color; + function d3_color() {} + d3_color.prototype.toString = function() { + return this.rgb() + ""; + }; + d3.hsl = d3_hsl; + function d3_hsl(h, s, l) { + return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l); + } + var d3_hslPrototype = d3_hsl.prototype = new d3_color(); + d3_hslPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, this.l / k); + }; + d3_hslPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, k * this.l); + }; + d3_hslPrototype.rgb = function() { + return d3_hsl_rgb(this.h, this.s, this.l); + }; + function d3_hsl_rgb(h, s, l) { + var m1, m2; + h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; + s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; + l = l < 0 ? 0 : l > 1 ? 1 : l; + m2 = l <= .5 ? l * (1 + s) : l + s - l * s; + m1 = 2 * l - m2; + function v(h) { + if (h > 360) h -= 360; else if (h < 0) h += 360; + if (h < 60) return m1 + (m2 - m1) * h / 60; + if (h < 180) return m2; + if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; + return m1; + } + function vv(h) { + return Math.round(v(h) * 255); + } + return new d3_rgb(vv(h + 120), vv(h), vv(h - 120)); + } + d3.hcl = d3_hcl; + function d3_hcl(h, c, l) { + return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l); + } + var d3_hclPrototype = d3_hcl.prototype = new d3_color(); + d3_hclPrototype.brighter = function(k) { + return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.darker = function(k) { + return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.rgb = function() { + return d3_hcl_lab(this.h, this.c, this.l).rgb(); + }; + function d3_hcl_lab(h, c, l) { + if (isNaN(h)) h = 0; + if (isNaN(c)) c = 0; + return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); + } + d3.lab = d3_lab; + function d3_lab(l, a, b) { + return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b); + } + var d3_lab_K = 18; + var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; + var d3_labPrototype = d3_lab.prototype = new d3_color(); + d3_labPrototype.brighter = function(k) { + return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.darker = function(k) { + return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.rgb = function() { + return d3_lab_rgb(this.l, this.a, this.b); + }; + function d3_lab_rgb(l, a, b) { + var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; + x = d3_lab_xyz(x) * d3_lab_X; + y = d3_lab_xyz(y) * d3_lab_Y; + z = d3_lab_xyz(z) * d3_lab_Z; + return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); + } + function d3_lab_hcl(l, a, b) { + return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l); + } + function d3_lab_xyz(x) { + return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; + } + function d3_xyz_lab(x) { + return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; + } + function d3_xyz_rgb(r) { + return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); + } + d3.rgb = d3_rgb; + function d3_rgb(r, g, b) { + return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b); + } + function d3_rgbNumber(value) { + return new d3_rgb(value >> 16, value >> 8 & 255, value & 255); + } + function d3_rgbString(value) { + return d3_rgbNumber(value) + ""; + } + var d3_rgbPrototype = d3_rgb.prototype = new d3_color(); + d3_rgbPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + var r = this.r, g = this.g, b = this.b, i = 30; + if (!r && !g && !b) return new d3_rgb(i, i, i); + if (r && r < i) r = i; + if (g && g < i) g = i; + if (b && b < i) b = i; + return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k)); + }; + d3_rgbPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_rgb(k * this.r, k * this.g, k * this.b); + }; + d3_rgbPrototype.hsl = function() { + return d3_rgb_hsl(this.r, this.g, this.b); + }; + d3_rgbPrototype.toString = function() { + return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); + }; + function d3_rgb_hex(v) { + return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); + } + function d3_rgb_parse(format, rgb, hsl) { + var r = 0, g = 0, b = 0, m1, m2, color; + m1 = /([a-z]+)\((.*)\)/.exec(format = format.toLowerCase()); + if (m1) { + m2 = m1[2].split(","); + switch (m1[1]) { + case "hsl": + { + return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); + } + + case "rgb": + { + return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); + } + } + } + if (color = d3_rgb_names.get(format)) { + return rgb(color.r, color.g, color.b); + } + if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) { + if (format.length === 4) { + r = (color & 3840) >> 4; + r = r >> 4 | r; + g = color & 240; + g = g >> 4 | g; + b = color & 15; + b = b << 4 | b; + } else if (format.length === 7) { + r = (color & 16711680) >> 16; + g = (color & 65280) >> 8; + b = color & 255; + } + } + return rgb(r, g, b); + } + function d3_rgb_hsl(r, g, b) { + var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; + if (d) { + s = l < .5 ? d / (max + min) : d / (2 - max - min); + if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; + h *= 60; + } else { + h = NaN; + s = l > 0 && l < 1 ? 0 : h; + } + return new d3_hsl(h, s, l); + } + function d3_rgb_lab(r, g, b) { + r = d3_rgb_xyz(r); + g = d3_rgb_xyz(g); + b = d3_rgb_xyz(b); + var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); + return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); + } + function d3_rgb_xyz(r) { + return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); + } + function d3_rgb_parseNumber(c) { + var f = parseFloat(c); + return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; + } + var d3_rgb_names = d3.map({ + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + rebeccapurple: 6697881, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 + }); + d3_rgb_names.forEach(function(key, value) { + d3_rgb_names.set(key, d3_rgbNumber(value)); + }); + function d3_functor(v) { + return typeof v === "function" ? v : function() { + return v; + }; + } + d3.functor = d3_functor; + d3.xhr = d3_xhrType(d3_identity); + function d3_xhrType(response) { + return function(url, mimeType, callback) { + if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, + mimeType = null; + return d3_xhr(url, mimeType, response, callback); + }; + } + function d3_xhr(url, mimeType, response, callback) { + var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null; + if (this.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest(); + "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { + request.readyState > 3 && respond(); + }; + function respond() { + var status = request.status, result; + if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) { + try { + result = response.call(xhr, request); + } catch (e) { + dispatch.error.call(xhr, e); + return; + } + dispatch.load.call(xhr, result); + } else { + dispatch.error.call(xhr, request); + } + } + request.onprogress = function(event) { + var o = d3.event; + d3.event = event; + try { + dispatch.progress.call(xhr, request); + } finally { + d3.event = o; + } + }; + xhr.header = function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers[name]; + if (value == null) delete headers[name]; else headers[name] = value + ""; + return xhr; + }; + xhr.mimeType = function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return xhr; + }; + xhr.responseType = function(value) { + if (!arguments.length) return responseType; + responseType = value; + return xhr; + }; + xhr.response = function(value) { + response = value; + return xhr; + }; + [ "get", "post" ].forEach(function(method) { + xhr[method] = function() { + return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); + }; + }); + xhr.send = function(method, data, callback) { + if (arguments.length === 2 && typeof data === "function") callback = data, data = null; + request.open(method, url, true); + if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; + if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); + if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); + if (responseType != null) request.responseType = responseType; + if (callback != null) xhr.on("error", callback).on("load", function(request) { + callback(null, request); + }); + dispatch.beforesend.call(xhr, request); + request.send(data == null ? null : data); + return xhr; + }; + xhr.abort = function() { + request.abort(); + return xhr; + }; + d3.rebind(xhr, dispatch, "on"); + return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); + } + function d3_xhr_fixCallback(callback) { + return callback.length === 1 ? function(error, request) { + callback(error == null ? request : null); + } : callback; + } + function d3_xhrHasResponse(request) { + var type = request.responseType; + return type && type !== "text" ? request.response : request.responseText; + } + d3.dsv = function(delimiter, mimeType) { + var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); + function dsv(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback); + xhr.row = function(_) { + return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row; + }; + return xhr; + } + function response(request) { + return dsv.parse(request.responseText); + } + function typedResponse(f) { + return function(request) { + return dsv.parse(request.responseText, f); + }; + } + dsv.parse = function(text, f) { + var o; + return dsv.parseRows(text, function(row, i) { + if (o) return o(row, i - 1); + var a = new Function("d", "return {" + row.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); + o = f ? function(row, i) { + return f(a(row), i); + } : a; + }); + }; + dsv.parseRows = function(text, f) { + var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; + function token() { + if (I >= N) return EOF; + if (eol) return eol = false, EOL; + var j = I; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + var c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.slice(j + 1, i).replace(/""/g, '"'); + } + while (I < N) { + var c = text.charCodeAt(I++), k = 1; + if (c === 10) eol = true; else if (c === 13) { + eol = true; + if (text.charCodeAt(I) === 10) ++I, ++k; + } else if (c !== delimiterCode) continue; + return text.slice(j, I - k); + } + return text.slice(j); + } + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && (a = f(a, n++)) == null) continue; + rows.push(a); + } + return rows; + }; + dsv.format = function(rows) { + if (Array.isArray(rows[0])) return dsv.formatRows(rows); + var fieldSet = new d3_Set(), fields = []; + rows.forEach(function(row) { + for (var field in row) { + if (!fieldSet.has(field)) { + fields.push(fieldSet.add(field)); + } + } + }); + return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) { + return fields.map(function(field) { + return formatValue(row[field]); + }).join(delimiter); + })).join("\n"); + }; + dsv.formatRows = function(rows) { + return rows.map(formatRow).join("\n"); + }; + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + function formatValue(text) { + return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; + } + return dsv; + }; + d3.csv = d3.dsv(",", "text/csv"); + d3.tsv = d3.dsv(" ", "text/tab-separated-values"); + var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { + setTimeout(callback, 17); + }; + d3.timer = function() { + d3_timer.apply(this, arguments); + }; + function d3_timer(callback, delay, then) { + var n = arguments.length; + if (n < 2) delay = 0; + if (n < 3) then = Date.now(); + var time = then + delay, timer = { + c: callback, + t: time, + n: null + }; + if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer; + d3_timer_queueTail = timer; + if (!d3_timer_interval) { + d3_timer_timeout = clearTimeout(d3_timer_timeout); + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + return timer; + } + function d3_timer_step() { + var now = d3_timer_mark(), delay = d3_timer_sweep() - now; + if (delay > 24) { + if (isFinite(delay)) { + clearTimeout(d3_timer_timeout); + d3_timer_timeout = setTimeout(d3_timer_step, delay); + } + d3_timer_interval = 0; + } else { + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + } + d3.timer.flush = function() { + d3_timer_mark(); + d3_timer_sweep(); + }; + function d3_timer_mark() { + var now = Date.now(), timer = d3_timer_queueHead; + while (timer) { + if (now >= timer.t && timer.c(now - timer.t)) timer.c = null; + timer = timer.n; + } + return now; + } + function d3_timer_sweep() { + var t0, t1 = d3_timer_queueHead, time = Infinity; + while (t1) { + if (t1.c) { + if (t1.t < time) time = t1.t; + t1 = (t0 = t1).n; + } else { + t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; + } + } + d3_timer_queueTail = t0; + return time; + } + function d3_format_precision(x, p) { + return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); + } + d3.round = function(x, n) { + return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); + }; + var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); + d3.formatPrefix = function(value, precision) { + var i = 0; + if (value = +value) { + if (value < 0) value *= -1; + if (precision) value = d3.round(value, d3_format_precision(value, precision)); + i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); + i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3)); + } + return d3_formatPrefixes[8 + i / 3]; + }; + function d3_formatPrefix(d, i) { + var k = Math.pow(10, abs(8 - i) * 3); + return { + scale: i > 8 ? function(d) { + return d / k; + } : function(d) { + return d * k; + }, + symbol: d + }; + } + function d3_locale_numberFormat(locale) { + var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) { + var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0; + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = locale_grouping[j = (j + 1) % locale_grouping.length]; + } + return t.reverse().join(locale_thousands); + } : d3_identity; + return function(specifier) { + var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true; + if (precision) precision = +precision.substring(1); + if (zfill || fill === "0" && align === "=") { + zfill = fill = "0"; + align = "="; + } + switch (type) { + case "n": + comma = true; + type = "g"; + break; + + case "%": + scale = 100; + suffix = "%"; + type = "f"; + break; + + case "p": + scale = 100; + suffix = "%"; + type = "r"; + break; + + case "b": + case "o": + case "x": + case "X": + if (symbol === "#") prefix = "0" + type.toLowerCase(); + + case "c": + exponent = false; + + case "d": + integer = true; + precision = 0; + break; + + case "s": + scale = -1; + type = "r"; + break; + } + if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1]; + if (type == "r" && !precision) type = "g"; + if (precision != null) { + if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision)); + } + type = d3_format_types.get(type) || d3_format_typeDefault; + var zcomma = zfill && comma; + return function(value) { + var fullSuffix = suffix; + if (integer && value % 1) return ""; + var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign; + if (scale < 0) { + var unit = d3.formatPrefix(value, precision); + value = unit.scale(value); + fullSuffix = unit.symbol + suffix; + } else { + value *= scale; + } + value = type(value, precision); + var i = value.lastIndexOf("."), before, after; + if (i < 0) { + var j = exponent ? value.lastIndexOf("e") : -1; + if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j); + } else { + before = value.substring(0, i); + after = locale_decimal + value.substring(i + 1); + } + if (!zfill && comma) before = formatGroup(before, Infinity); + var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; + if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity); + negative += prefix; + value = before + after; + return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix; + }; + }; + } + var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; + var d3_format_types = d3.map({ + b: function(x) { + return x.toString(2); + }, + c: function(x) { + return String.fromCharCode(x); + }, + o: function(x) { + return x.toString(8); + }, + x: function(x) { + return x.toString(16); + }, + X: function(x) { + return x.toString(16).toUpperCase(); + }, + g: function(x, p) { + return x.toPrecision(p); + }, + e: function(x, p) { + return x.toExponential(p); + }, + f: function(x, p) { + return x.toFixed(p); + }, + r: function(x, p) { + return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); + } + }); + function d3_format_typeDefault(x) { + return x + ""; + } + var d3_time = d3.time = {}, d3_date = Date; + function d3_date_utc() { + this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); + } + d3_date_utc.prototype = { + getDate: function() { + return this._.getUTCDate(); + }, + getDay: function() { + return this._.getUTCDay(); + }, + getFullYear: function() { + return this._.getUTCFullYear(); + }, + getHours: function() { + return this._.getUTCHours(); + }, + getMilliseconds: function() { + return this._.getUTCMilliseconds(); + }, + getMinutes: function() { + return this._.getUTCMinutes(); + }, + getMonth: function() { + return this._.getUTCMonth(); + }, + getSeconds: function() { + return this._.getUTCSeconds(); + }, + getTime: function() { + return this._.getTime(); + }, + getTimezoneOffset: function() { + return 0; + }, + valueOf: function() { + return this._.valueOf(); + }, + setDate: function() { + d3_time_prototype.setUTCDate.apply(this._, arguments); + }, + setDay: function() { + d3_time_prototype.setUTCDay.apply(this._, arguments); + }, + setFullYear: function() { + d3_time_prototype.setUTCFullYear.apply(this._, arguments); + }, + setHours: function() { + d3_time_prototype.setUTCHours.apply(this._, arguments); + }, + setMilliseconds: function() { + d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); + }, + setMinutes: function() { + d3_time_prototype.setUTCMinutes.apply(this._, arguments); + }, + setMonth: function() { + d3_time_prototype.setUTCMonth.apply(this._, arguments); + }, + setSeconds: function() { + d3_time_prototype.setUTCSeconds.apply(this._, arguments); + }, + setTime: function() { + d3_time_prototype.setTime.apply(this._, arguments); + } + }; + var d3_time_prototype = Date.prototype; + function d3_time_interval(local, step, number) { + function round(date) { + var d0 = local(date), d1 = offset(d0, 1); + return date - d0 < d1 - date ? d0 : d1; + } + function ceil(date) { + step(date = local(new d3_date(date - 1)), 1); + return date; + } + function offset(date, k) { + step(date = new d3_date(+date), k); + return date; + } + function range(t0, t1, dt) { + var time = ceil(t0), times = []; + if (dt > 1) { + while (time < t1) { + if (!(number(time) % dt)) times.push(new Date(+time)); + step(time, 1); + } + } else { + while (time < t1) times.push(new Date(+time)), step(time, 1); + } + return times; + } + function range_utc(t0, t1, dt) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = t0; + return range(utc, t1, dt); + } finally { + d3_date = Date; + } + } + local.floor = local; + local.round = round; + local.ceil = ceil; + local.offset = offset; + local.range = range; + var utc = local.utc = d3_time_interval_utc(local); + utc.floor = utc; + utc.round = d3_time_interval_utc(round); + utc.ceil = d3_time_interval_utc(ceil); + utc.offset = d3_time_interval_utc(offset); + utc.range = range_utc; + return local; + } + function d3_time_interval_utc(method) { + return function(date, k) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = date; + return method(utc, k)._; + } finally { + d3_date = Date; + } + }; + } + d3_time.year = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setMonth(0, 1); + return date; + }, function(date, offset) { + date.setFullYear(date.getFullYear() + offset); + }, function(date) { + return date.getFullYear(); + }); + d3_time.years = d3_time.year.range; + d3_time.years.utc = d3_time.year.utc.range; + d3_time.day = d3_time_interval(function(date) { + var day = new d3_date(2e3, 0); + day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); + return day; + }, function(date, offset) { + date.setDate(date.getDate() + offset); + }, function(date) { + return date.getDate() - 1; + }); + d3_time.days = d3_time.day.range; + d3_time.days.utc = d3_time.day.utc.range; + d3_time.dayOfYear = function(date) { + var year = d3_time.year(date); + return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); + }; + [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) { + i = 7 - i; + var interval = d3_time[day] = d3_time_interval(function(date) { + (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); + return date; + }, function(date, offset) { + date.setDate(date.getDate() + Math.floor(offset) * 7); + }, function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); + }); + d3_time[day + "s"] = interval.range; + d3_time[day + "s"].utc = interval.utc.range; + d3_time[day + "OfYear"] = function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7); + }; + }); + d3_time.week = d3_time.sunday; + d3_time.weeks = d3_time.sunday.range; + d3_time.weeks.utc = d3_time.sunday.utc.range; + d3_time.weekOfYear = d3_time.sundayOfYear; + function d3_locale_timeFormat(locale) { + var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths; + function d3_time_format(template) { + var n = template.length; + function format(date) { + var string = [], i = -1, j = 0, c, p, f; + while (++i < n) { + if (template.charCodeAt(i) === 37) { + string.push(template.slice(j, i)); + if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); + if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); + string.push(c); + j = i + 1; + } + } + string.push(template.slice(j, i)); + return string.join(""); + } + format.parse = function(string) { + var d = { + y: 1900, + m: 0, + d: 1, + H: 0, + M: 0, + S: 0, + L: 0, + Z: null + }, i = d3_time_parse(d, template, string, 0); + if (i != string.length) return null; + if ("p" in d) d.H = d.H % 12 + d.p * 12; + var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)(); + if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + date.setFullYear(d.y, 0, 1); + date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7); + } else date.setFullYear(d.y, d.m, d.d); + date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L); + return localZ ? date._ : date; + }; + format.toString = function() { + return template; + }; + return format; + } + function d3_time_parse(date, template, string, j) { + var c, p, t, i = 0, n = template.length, m = string.length; + while (i < n) { + if (j >= m) return -1; + c = template.charCodeAt(i++); + if (c === 37) { + t = template.charAt(i++); + p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t]; + if (!p || (j = p(date, string, j)) < 0) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + return j; + } + d3_time_format.utc = function(template) { + var local = d3_time_format(template); + function format(date) { + try { + d3_date = d3_date_utc; + var utc = new d3_date(); + utc._ = date; + return local(utc); + } finally { + d3_date = Date; + } + } + format.parse = function(string) { + try { + d3_date = d3_date_utc; + var date = local.parse(string); + return date && date._; + } finally { + d3_date = Date; + } + }; + format.toString = local.toString; + return format; + }; + d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti; + var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths); + locale_periods.forEach(function(p, i) { + d3_time_periodLookup.set(p.toLowerCase(), i); + }); + var d3_time_formats = { + a: function(d) { + return locale_shortDays[d.getDay()]; + }, + A: function(d) { + return locale_days[d.getDay()]; + }, + b: function(d) { + return locale_shortMonths[d.getMonth()]; + }, + B: function(d) { + return locale_months[d.getMonth()]; + }, + c: d3_time_format(locale_dateTime), + d: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + e: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + H: function(d, p) { + return d3_time_formatPad(d.getHours(), p, 2); + }, + I: function(d, p) { + return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); + }, + j: function(d, p) { + return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); + }, + L: function(d, p) { + return d3_time_formatPad(d.getMilliseconds(), p, 3); + }, + m: function(d, p) { + return d3_time_formatPad(d.getMonth() + 1, p, 2); + }, + M: function(d, p) { + return d3_time_formatPad(d.getMinutes(), p, 2); + }, + p: function(d) { + return locale_periods[+(d.getHours() >= 12)]; + }, + S: function(d, p) { + return d3_time_formatPad(d.getSeconds(), p, 2); + }, + U: function(d, p) { + return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); + }, + w: function(d) { + return d.getDay(); + }, + W: function(d, p) { + return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); + }, + x: d3_time_format(locale_date), + X: d3_time_format(locale_time), + y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 100, p, 2); + }, + Y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); + }, + Z: d3_time_zone, + "%": function() { + return "%"; + } + }; + var d3_time_parsers = { + a: d3_time_parseWeekdayAbbrev, + A: d3_time_parseWeekday, + b: d3_time_parseMonthAbbrev, + B: d3_time_parseMonth, + c: d3_time_parseLocaleFull, + d: d3_time_parseDay, + e: d3_time_parseDay, + H: d3_time_parseHour24, + I: d3_time_parseHour24, + j: d3_time_parseDayOfYear, + L: d3_time_parseMilliseconds, + m: d3_time_parseMonthNumber, + M: d3_time_parseMinutes, + p: d3_time_parseAmPm, + S: d3_time_parseSeconds, + U: d3_time_parseWeekNumberSunday, + w: d3_time_parseWeekdayNumber, + W: d3_time_parseWeekNumberMonday, + x: d3_time_parseLocaleDate, + X: d3_time_parseLocaleTime, + y: d3_time_parseYear, + Y: d3_time_parseFullYear, + Z: d3_time_parseZone, + "%": d3_time_parseLiteralPercent + }; + function d3_time_parseWeekdayAbbrev(date, string, i) { + d3_time_dayAbbrevRe.lastIndex = 0; + var n = d3_time_dayAbbrevRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseWeekday(date, string, i) { + d3_time_dayRe.lastIndex = 0; + var n = d3_time_dayRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonthAbbrev(date, string, i) { + d3_time_monthAbbrevRe.lastIndex = 0; + var n = d3_time_monthAbbrevRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonth(date, string, i) { + d3_time_monthRe.lastIndex = 0; + var n = d3_time_monthRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseLocaleFull(date, string, i) { + return d3_time_parse(date, d3_time_formats.c.toString(), string, i); + } + function d3_time_parseLocaleDate(date, string, i) { + return d3_time_parse(date, d3_time_formats.x.toString(), string, i); + } + function d3_time_parseLocaleTime(date, string, i) { + return d3_time_parse(date, d3_time_formats.X.toString(), string, i); + } + function d3_time_parseAmPm(date, string, i) { + var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase()); + return n == null ? -1 : (date.p = n, i); + } + return d3_time_format; + } + var d3_time_formatPads = { + "-": "", + _: " ", + "0": "0" + }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/; + function d3_time_formatPad(value, fill, width) { + var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + function d3_time_formatRe(names) { + return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); + } + function d3_time_formatLookup(names) { + var map = new d3_Map(), i = -1, n = names.length; + while (++i < n) map.set(names[i].toLowerCase(), i); + return map; + } + function d3_time_parseWeekdayNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 1)); + return n ? (date.w = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberSunday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.U = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberMonday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.W = +n[0], i + n[0].length) : -1; + } + function d3_time_parseFullYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 4)); + return n ? (date.y = +n[0], i + n[0].length) : -1; + } + function d3_time_parseYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1; + } + function d3_time_parseZone(date, string, i) { + return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, + i + 5) : -1; + } + function d3_time_expandYear(d) { + return d + (d > 68 ? 1900 : 2e3); + } + function d3_time_parseMonthNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.m = n[0] - 1, i + n[0].length) : -1; + } + function d3_time_parseDay(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.d = +n[0], i + n[0].length) : -1; + } + function d3_time_parseDayOfYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.j = +n[0], i + n[0].length) : -1; + } + function d3_time_parseHour24(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.H = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMinutes(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.M = +n[0], i + n[0].length) : -1; + } + function d3_time_parseSeconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.S = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMilliseconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.L = +n[0], i + n[0].length) : -1; + } + function d3_time_zone(d) { + var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60; + return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); + } + function d3_time_parseLiteralPercent(date, string, i) { + d3_time_percentRe.lastIndex = 0; + var n = d3_time_percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + function d3_time_formatMulti(formats) { + var n = formats.length, i = -1; + while (++i < n) formats[i][0] = this(formats[i][0]); + return function(date) { + var i = 0, f = formats[i]; + while (!f[1](date)) f = formats[++i]; + return f[0](date); + }; + } + d3.locale = function(locale) { + return { + numberFormat: d3_locale_numberFormat(locale), + timeFormat: d3_locale_timeFormat(locale) + }; + }; + var d3_locale_enUS = d3.locale({ + decimal: ".", + thousands: ",", + grouping: [ 3 ], + currency: [ "$", "" ], + dateTime: "%a %b %e %X %Y", + date: "%m/%d/%Y", + time: "%H:%M:%S", + periods: [ "AM", "PM" ], + days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], + months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], + shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ] + }); + d3.format = d3_locale_enUS.numberFormat; + d3.geo = {}; + function d3_adder() {} + d3_adder.prototype = { + s: 0, + t: 0, + add: function(y) { + d3_adderSum(y, this.t, d3_adderTemp); + d3_adderSum(d3_adderTemp.s, this.s, this); + if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t; + }, + reset: function() { + this.s = this.t = 0; + }, + valueOf: function() { + return this.s; + } + }; + var d3_adderTemp = new d3_adder(); + function d3_adderSum(a, b, o) { + var x = o.s = a + b, bv = x - a, av = x - bv; + o.t = a - av + (b - bv); + } + d3.geo.stream = function(object, listener) { + if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { + d3_geo_streamObjectType[object.type](object, listener); + } else { + d3_geo_streamGeometry(object, listener); + } + }; + function d3_geo_streamGeometry(geometry, listener) { + if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { + d3_geo_streamGeometryType[geometry.type](geometry, listener); + } + } + var d3_geo_streamObjectType = { + Feature: function(feature, listener) { + d3_geo_streamGeometry(feature.geometry, listener); + }, + FeatureCollection: function(object, listener) { + var features = object.features, i = -1, n = features.length; + while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); + } + }; + var d3_geo_streamGeometryType = { + Sphere: function(object, listener) { + listener.sphere(); + }, + Point: function(object, listener) { + object = object.coordinates; + listener.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); + }, + LineString: function(object, listener) { + d3_geo_streamLine(object.coordinates, listener, 0); + }, + MultiLineString: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); + }, + Polygon: function(object, listener) { + d3_geo_streamPolygon(object.coordinates, listener); + }, + MultiPolygon: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); + }, + GeometryCollection: function(object, listener) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) d3_geo_streamGeometry(geometries[i], listener); + } + }; + function d3_geo_streamLine(coordinates, listener, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + listener.lineStart(); + while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); + listener.lineEnd(); + } + function d3_geo_streamPolygon(coordinates, listener) { + var i = -1, n = coordinates.length; + listener.polygonStart(); + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); + listener.polygonEnd(); + } + d3.geo.area = function(object) { + d3_geo_areaSum = 0; + d3.geo.stream(object, d3_geo_area); + return d3_geo_areaSum; + }; + var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder(); + var d3_geo_area = { + sphere: function() { + d3_geo_areaSum += 4 * π; + }, + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_areaRingSum.reset(); + d3_geo_area.lineStart = d3_geo_areaRingStart; + }, + polygonEnd: function() { + var area = 2 * d3_geo_areaRingSum; + d3_geo_areaSum += area < 0 ? 4 * π + area : area; + d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; + } + }; + function d3_geo_areaRingStart() { + var λ00, φ00, λ0, cosφ0, sinφ0; + d3_geo_area.point = function(λ, φ) { + d3_geo_area.point = nextPoint; + λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), + sinφ0 = Math.sin(φ); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + φ = φ * d3_radians / 2 + π / 4; + var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ); + d3_geo_areaRingSum.add(Math.atan2(v, u)); + λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; + } + d3_geo_area.lineEnd = function() { + nextPoint(λ00, φ00); + }; + } + function d3_geo_cartesian(spherical) { + var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); + return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; + } + function d3_geo_cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + function d3_geo_cartesianCross(a, b) { + return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; + } + function d3_geo_cartesianAdd(a, b) { + a[0] += b[0]; + a[1] += b[1]; + a[2] += b[2]; + } + function d3_geo_cartesianScale(vector, k) { + return [ vector[0] * k, vector[1] * k, vector[2] * k ]; + } + function d3_geo_cartesianNormalize(d) { + var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l; + d[1] /= l; + d[2] /= l; + } + function d3_geo_spherical(cartesian) { + return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ]; + } + function d3_geo_sphericalEqual(a, b) { + return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε; + } + d3.geo.bounds = function() { + var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range; + var bound = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + bound.point = ringPoint; + bound.lineStart = ringStart; + bound.lineEnd = ringEnd; + dλSum = 0; + d3_geo_area.polygonStart(); + }, + polygonEnd: function() { + d3_geo_area.polygonEnd(); + bound.point = point; + bound.lineStart = lineStart; + bound.lineEnd = lineEnd; + if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90; + range[0] = λ0, range[1] = λ1; + } + }; + function point(λ, φ) { + ranges.push(range = [ λ0 = λ, λ1 = λ ]); + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + function linePoint(λ, φ) { + var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]); + if (p0) { + var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal); + d3_geo_cartesianNormalize(inflection); + inflection = d3_geo_spherical(inflection); + var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180; + if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = inflection[1] * d3_degrees; + if (φi > φ1) φ1 = φi; + } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = -inflection[1] * d3_degrees; + if (φi < φ0) φ0 = φi; + } else { + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + if (antimeridian) { + if (λ < λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } else { + if (λ1 >= λ0) { + if (λ < λ0) λ0 = λ; + if (λ > λ1) λ1 = λ; + } else { + if (λ > λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } + } + } else { + point(λ, φ); + } + p0 = p, λ_ = λ; + } + function lineStart() { + bound.point = linePoint; + } + function lineEnd() { + range[0] = λ0, range[1] = λ1; + bound.point = point; + p0 = null; + } + function ringPoint(λ, φ) { + if (p0) { + var dλ = λ - λ_; + dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; + } else λ__ = λ, φ__ = φ; + d3_geo_area.point(λ, φ); + linePoint(λ, φ); + } + function ringStart() { + d3_geo_area.lineStart(); + } + function ringEnd() { + ringPoint(λ__, φ__); + d3_geo_area.lineEnd(); + if (abs(dλSum) > ε) λ0 = -(λ1 = 180); + range[0] = λ0, range[1] = λ1; + p0 = null; + } + function angle(λ0, λ1) { + return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; + } + function compareRanges(a, b) { + return a[0] - b[0]; + } + function withinRange(x, range) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + return function(feature) { + φ1 = λ1 = -(λ0 = φ0 = Infinity); + ranges = []; + d3.geo.stream(feature, bound); + var n = ranges.length; + if (n) { + ranges.sort(compareRanges); + for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) { + b = ranges[i]; + if (withinRange(b[0], a) || withinRange(b[1], a)) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + var best = -Infinity, dλ; + for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { + b = merged[i]; + if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; + } + } + ranges = range = null; + return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ]; + }; + }(); + d3.geo.centroid = function(object) { + d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, d3_geo_centroid); + var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z; + if (m < ε2) { + x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; + if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; + m = x * x + y * y + z * z; + if (m < ε2) return [ NaN, NaN ]; + } + return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ]; + }; + var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2; + var d3_geo_centroid = { + sphere: d3_noop, + point: d3_geo_centroidPoint, + lineStart: d3_geo_centroidLineStart, + lineEnd: d3_geo_centroidLineEnd, + polygonStart: function() { + d3_geo_centroid.lineStart = d3_geo_centroidRingStart; + }, + polygonEnd: function() { + d3_geo_centroid.lineStart = d3_geo_centroidLineStart; + } + }; + function d3_geo_centroidPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); + } + function d3_geo_centroidPointXYZ(x, y, z) { + ++d3_geo_centroidW0; + d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; + d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; + d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; + } + function d3_geo_centroidLineStart() { + var x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroid.point = nextPoint; + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_centroidLineEnd() { + d3_geo_centroid.point = d3_geo_centroidPoint; + } + function d3_geo_centroidRingStart() { + var λ00, φ00, x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ00 = λ, φ00 = φ; + d3_geo_centroid.point = nextPoint; + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + d3_geo_centroid.lineEnd = function() { + nextPoint(λ00, φ00); + d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; + d3_geo_centroid.point = d3_geo_centroidPoint; + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u); + d3_geo_centroidX2 += v * cx; + d3_geo_centroidY2 += v * cy; + d3_geo_centroidZ2 += v * cz; + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_compose(a, b) { + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + return compose; + } + function d3_true() { + return true; + } + function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) { + var subject = [], clip = []; + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n]; + if (d3_geo_sphericalEqual(p0, p1)) { + listener.lineStart(); + for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); + listener.lineEnd(); + return; + } + var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false); + a.o = b; + subject.push(a); + clip.push(b); + a = new d3_geo_clipPolygonIntersection(p1, segment, null, false); + b = new d3_geo_clipPolygonIntersection(p1, null, a, true); + a.o = b; + subject.push(a); + clip.push(b); + }); + clip.sort(compare); + d3_geo_clipPolygonLinkCircular(subject); + d3_geo_clipPolygonLinkCircular(clip); + if (!subject.length) return; + for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) { + clip[i].e = entry = !entry; + } + var start = subject[0], points, point; + while (1) { + var current = start, isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + listener.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, listener); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, listener); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + listener.lineEnd(); + } + } + function d3_geo_clipPolygonLinkCircular(array) { + if (!(n = array.length)) return; + var n, i = 0, a = array[0], b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + function d3_geo_clipPolygonIntersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; + this.e = entry; + this.v = false; + this.n = this.p = null; + } + function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { + return function(rotate, listener) { + var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]); + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3.merge(segments); + var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); + if (segments.length) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); + } else if (clipStartInside) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (polygonStarted) listener.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + listener.polygonStart(); + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + listener.polygonEnd(); + } + }; + function point(λ, φ) { + var point = rotate(λ, φ); + if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ); + } + function pointLine(λ, φ) { + var point = rotate(λ, φ); + line.point(point[0], point[1]); + } + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + var segments; + var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring; + function pointRing(λ, φ) { + ring.push([ λ, φ ]); + var point = rotate(λ, φ); + ringListener.point(point[0], point[1]); + } + function ringStart() { + ringListener.lineStart(); + ring = []; + } + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringListener.lineEnd(); + var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; + ring.pop(); + polygon.push(ring); + ring = null; + if (!n) return; + if (clean & 1) { + segment = ringSegments[0]; + var n = segment.length - 1, i = -1, point; + if (n > 0) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + while (++i < n) listener.point((point = segment[i])[0], point[1]); + listener.lineEnd(); + } + return; + } + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); + } + return clip; + }; + } + function d3_geo_clipSegmentLength1(segment) { + return segment.length > 1; + } + function d3_geo_clipBufferListener() { + var lines = [], line; + return { + lineStart: function() { + lines.push(line = []); + }, + point: function(λ, φ) { + line.push([ λ, φ ]); + }, + lineEnd: d3_noop, + buffer: function() { + var buffer = lines; + lines = []; + line = null; + return buffer; + }, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + } + }; + } + function d3_geo_clipSort(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]); + } + var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]); + function d3_geo_clipAntimeridianLine(listener) { + var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; + return { + lineStart: function() { + listener.lineStart(); + clean = 1; + }, + point: function(λ1, φ1) { + var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0); + if (abs(dλ - π) < ε) { + listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + listener.point(λ1, φ0); + clean = 0; + } else if (sλ0 !== sλ1 && dλ >= π) { + if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; + if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; + φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + clean = 0; + } + listener.point(λ0 = λ1, φ0 = φ1); + sλ0 = sλ1; + }, + lineEnd: function() { + listener.lineEnd(); + λ0 = φ0 = NaN; + }, + clean: function() { + return 2 - clean; + } + }; + } + function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { + var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); + return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; + } + function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { + var φ; + if (from == null) { + φ = direction * halfπ; + listener.point(-π, φ); + listener.point(0, φ); + listener.point(π, φ); + listener.point(π, 0); + listener.point(π, -φ); + listener.point(0, -φ); + listener.point(-π, -φ); + listener.point(-π, 0); + listener.point(-π, φ); + } else if (abs(from[0] - to[0]) > ε) { + var s = from[0] < to[0] ? π : -π; + φ = direction * s / 2; + listener.point(-s, φ); + listener.point(0, φ); + listener.point(s, φ); + } else { + listener.point(to[0], to[1]); + } + } + function d3_geo_pointInPolygon(point, polygon) { + var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0; + d3_geo_areaRingSum.reset(); + for (var i = 0, n = polygon.length; i < n; ++i) { + var ring = polygon[i], m = ring.length; + if (!m) continue; + var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1; + while (true) { + if (j === m) j = 0; + point = ring[j]; + var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ; + d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); + polarAngle += antimeridian ? dλ + sdλ * τ : dλ; + if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { + var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); + d3_geo_cartesianNormalize(arc); + var intersection = d3_geo_cartesianCross(meridianNormal, arc); + d3_geo_cartesianNormalize(intersection); + var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); + if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) { + winding += antimeridian ^ dλ >= 0 ? 1 : -1; + } + } + if (!j++) break; + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; + } + } + return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1; + } + function d3_geo_clipCircle(radius) { + var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); + return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]); + function visible(λ, φ) { + return Math.cos(λ) * Math.cos(φ) > cr; + } + function clipLine(listener) { + var point0, c0, v0, v00, clean; + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(λ, φ) { + var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; + if (!point0 && (v00 = v0 = v)) listener.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { + point1[0] += ε; + point1[1] += ε; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + listener.lineStart(); + point2 = intersect(point1, point0); + listener.point(point2[0], point2[1]); + } else { + point2 = intersect(point0, point1); + listener.point(point2[0], point2[1]); + listener.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + } else { + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { + listener.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) listener.lineEnd(); + point0 = null; + }, + clean: function() { + return clean | (v00 && v0) << 1; + } + }; + } + function intersect(a, b, two) { + var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b); + var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; + if (!determinant) return !two && a; + var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); + d3_geo_cartesianAdd(A, B); + var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); + if (t2 < 0) return; + var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu); + d3_geo_cartesianAdd(q, A); + q = d3_geo_spherical(q); + if (!two) return q; + var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z; + if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; + var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε; + if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; + if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { + var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); + d3_geo_cartesianAdd(q1, A); + return [ q, d3_geo_spherical(q1) ]; + } + } + function code(λ, φ) { + var r = smallRadius ? radius : π - radius, code = 0; + if (λ < -r) code |= 1; else if (λ > r) code |= 2; + if (φ < -r) code |= 4; else if (φ > r) code |= 8; + return code; + } + } + function d3_geom_clipLine(x0, y0, x1, y1) { + return function(line) { + var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r; + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + if (t0 > 0) line.a = { + x: ax + t0 * dx, + y: ay + t0 * dy + }; + if (t1 < 1) line.b = { + x: ax + t1 * dx, + y: ay + t1 * dy + }; + return line; + }; + } + var d3_geo_clipExtentMAX = 1e9; + d3.geo.clipExtent = function() { + var x0, y0, x1, y1, stream, clip, clipExtent = { + stream: function(output) { + if (stream) stream.valid = false; + stream = clip(output); + stream.valid = true; + return stream; + }, + extent: function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); + if (stream) stream.valid = false, stream = null; + return clipExtent; + } + }; + return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]); + }; + function d3_geo_clipExtent(x0, y0, x1, y1) { + return function(listener) { + var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + listener = bufferListener; + segments = []; + polygon = []; + clean = true; + }, + polygonEnd: function() { + listener = listener_; + segments = d3.merge(segments); + var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length; + if (inside || visible) { + listener.polygonStart(); + if (inside) { + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (visible) { + d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener); + } + listener.polygonEnd(); + } + segments = polygon = ring = null; + } + }; + function insidePolygon(p) { + var wn = 0, n = polygon.length, y = p[1]; + for (var i = 0; i < n; ++i) { + for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { + b = v[j]; + if (a[1] <= y) { + if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; + } else { + if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; + } + a = b; + } + } + return wn !== 0; + } + function interpolate(from, to, direction, listener) { + var a = 0, a1 = 0; + if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) { + do { + listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + } while ((a = (a + direction + 4) % 4) !== a1); + } else { + listener.point(to[0], to[1]); + } + } + function pointVisible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + function point(x, y) { + if (pointVisible(x, y)) listener.point(x, y); + } + var x__, y__, v__, x_, y_, v_, first, clean; + function lineStart() { + clip.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferListener.rejoin(); + segments.push(bufferListener.buffer()); + } + clip.point = point; + if (v_) listener.lineEnd(); + } + function linePoint(x, y) { + x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); + y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); + var v = pointVisible(x, y); + if (polygon) ring.push([ x, y ]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + listener.lineStart(); + listener.point(x, y); + } + } else { + if (v && v_) listener.point(x, y); else { + var l = { + a: { + x: x_, + y: y_ + }, + b: { + x: x, + y: y + } + }; + if (clipLine(l)) { + if (!v_) { + listener.lineStart(); + listener.point(l.a.x, l.a.y); + } + listener.point(l.b.x, l.b.y); + if (!v) listener.lineEnd(); + clean = false; + } else if (v) { + listener.lineStart(); + listener.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + return clip; + }; + function corner(p, direction) { + return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; + } + function compare(a, b) { + return comparePoints(a.x, b.x); + } + function comparePoints(a, b) { + var ca = corner(a, 1), cb = corner(b, 1); + return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + } + } + function d3_geo_conic(projectAt) { + var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1); + p.parallels = function(_) { + if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ]; + return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); + }; + return p; + } + function d3_geo_conicEqualArea(φ0, φ1) { + var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; + function forward(λ, φ) { + var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; + return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = ρ0 - y; + return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; + }; + return forward; + } + (d3.geo.conicEqualArea = function() { + return d3_geo_conic(d3_geo_conicEqualArea); + }).raw = d3_geo_conicEqualArea; + d3.geo.albers = function() { + return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070); + }; + d3.geo.albersUsa = function() { + var lower48 = d3.geo.albers(); + var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]); + var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]); + var point, pointStream = { + point: function(x, y) { + point = [ x, y ]; + } + }, lower48Point, alaskaPoint, hawaiiPoint; + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + point = null; + (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); + return point; + } + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k; + return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates); + }; + albersUsa.stream = function(stream) { + var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream); + return { + point: function(x, y) { + lower48Stream.point(x, y); + alaskaStream.point(x, y); + hawaiiStream.point(x, y); + }, + sphere: function() { + lower48Stream.sphere(); + alaskaStream.sphere(); + hawaiiStream.sphere(); + }, + lineStart: function() { + lower48Stream.lineStart(); + alaskaStream.lineStart(); + hawaiiStream.lineStart(); + }, + lineEnd: function() { + lower48Stream.lineEnd(); + alaskaStream.lineEnd(); + hawaiiStream.lineEnd(); + }, + polygonStart: function() { + lower48Stream.polygonStart(); + alaskaStream.polygonStart(); + hawaiiStream.polygonStart(); + }, + polygonEnd: function() { + lower48Stream.polygonEnd(); + alaskaStream.polygonEnd(); + hawaiiStream.polygonEnd(); + } + }; + }; + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_); + alaska.precision(_); + hawaii.precision(_); + return albersUsa; + }; + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_); + alaska.scale(_ * .35); + hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point; + alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + return albersUsa; + }; + return albersUsa.scale(1070); + }; + var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_pathAreaPolygon = 0; + d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; + }, + polygonEnd: function() { + d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; + d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2); + } + }; + function d3_geo_pathAreaRingStart() { + var x00, y00, x0, y0; + d3_geo_pathArea.point = function(x, y) { + d3_geo_pathArea.point = nextPoint; + x00 = x0 = x, y00 = y0 = y; + }; + function nextPoint(x, y) { + d3_geo_pathAreaPolygon += y0 * x - x0 * y; + x0 = x, y0 = y; + } + d3_geo_pathArea.lineEnd = function() { + nextPoint(x00, y00); + }; + } + var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1; + var d3_geo_pathBounds = { + point: d3_geo_pathBoundsPoint, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_pathBoundsPoint(x, y) { + if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; + if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; + if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; + if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; + } + function d3_geo_pathBuffer() { + var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = []; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointCircle = d3_geo_pathBufferCircle(_); + return stream; + }, + result: function() { + if (buffer.length) { + var result = buffer.join(""); + buffer = []; + return result; + } + } + }; + function point(x, y) { + buffer.push("M", x, ",", y, pointCircle); + } + function pointLineStart(x, y) { + buffer.push("M", x, ",", y); + stream.point = pointLine; + } + function pointLine(x, y) { + buffer.push("L", x, ",", y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + buffer.push("Z"); + } + return stream; + } + function d3_geo_pathBufferCircle(radius) { + return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; + } + var d3_geo_pathCentroid = { + point: d3_geo_pathCentroidPoint, + lineStart: d3_geo_pathCentroidLineStart, + lineEnd: d3_geo_pathCentroidLineEnd, + polygonStart: function() { + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; + }, + polygonEnd: function() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; + d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; + } + }; + function d3_geo_pathCentroidPoint(x, y) { + d3_geo_centroidX0 += x; + d3_geo_centroidY0 += y; + ++d3_geo_centroidZ0; + } + function d3_geo_pathCentroidLineStart() { + var x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + } + function d3_geo_pathCentroidLineEnd() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + } + function d3_geo_pathCentroidRingStart() { + var x00, y00, x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + z = y0 * x - x0 * y; + d3_geo_centroidX2 += z * (x0 + x); + d3_geo_centroidY2 += z * (y0 + y); + d3_geo_centroidZ2 += z * 3; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + d3_geo_pathCentroid.lineEnd = function() { + nextPoint(x00, y00); + }; + } + function d3_geo_pathContext(context) { + var pointRadius = 4.5; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointRadius = _; + return stream; + }, + result: d3_noop + }; + function point(x, y) { + context.moveTo(x + pointRadius, y); + context.arc(x, y, pointRadius, 0, τ); + } + function pointLineStart(x, y) { + context.moveTo(x, y); + stream.point = pointLine; + } + function pointLine(x, y) { + context.lineTo(x, y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + context.closePath(); + } + return stream; + } + function d3_geo_resample(project) { + var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16; + function resample(stream) { + return (maxDepth ? resampleRecursive : resampleNone)(stream); + } + function resampleNone(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + }); + } + function resampleRecursive(stream) { + var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0; + var resample = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + stream.polygonStart(); + resample.lineStart = ringStart; + }, + polygonEnd: function() { + stream.polygonEnd(); + resample.lineStart = lineStart; + } + }; + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + function lineStart() { + x0 = NaN; + resample.point = linePoint; + stream.lineStart(); + } + function linePoint(λ, φ) { + var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); + resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + function lineEnd() { + resample.point = point; + stream.lineEnd(); + } + function ringStart() { + lineStart(); + resample.point = ringPoint; + resample.lineEnd = ringEnd; + } + function ringPoint(λ, φ) { + linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resample.point = linePoint; + } + function ringEnd() { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); + resample.lineEnd = lineEnd; + lineEnd(); + } + return resample; + } + function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; + if (d2 > 4 * δ2 && depth--) { + var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); + } + } + } + resample.precision = function(_) { + if (!arguments.length) return Math.sqrt(δ2); + maxDepth = (δ2 = _ * _) > 0 && 16; + return resample; + }; + return resample; + } + d3.geo.path = function() { + var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream; + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); + d3.geo.stream(object, cacheStream); + } + return contextStream.result(); + } + path.area = function(object) { + d3_geo_pathAreaSum = 0; + d3.geo.stream(object, projectStream(d3_geo_pathArea)); + return d3_geo_pathAreaSum; + }; + path.centroid = function(object) { + d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); + return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ]; + }; + path.bounds = function(object) { + d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); + d3.geo.stream(object, projectStream(d3_geo_pathBounds)); + return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ]; + }; + path.projection = function(_) { + if (!arguments.length) return projection; + projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; + return reset(); + }; + path.context = function(_) { + if (!arguments.length) return context; + contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return reset(); + }; + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + function reset() { + cacheStream = null; + return path; + } + return path.projection(d3.geo.albersUsa()).context(null); + }; + function d3_geo_pathProjectStream(project) { + var resample = d3_geo_resample(function(x, y) { + return project([ x * d3_degrees, y * d3_degrees ]); + }); + return function(stream) { + return d3_geo_projectionRadians(resample(stream)); + }; + } + d3.geo.transform = function(methods) { + return { + stream: function(stream) { + var transform = new d3_geo_transform(stream); + for (var k in methods) transform[k] = methods[k]; + return transform; + } + }; + }; + function d3_geo_transform(stream) { + this.stream = stream; + } + d3_geo_transform.prototype = { + point: function(x, y) { + this.stream.point(x, y); + }, + sphere: function() { + this.stream.sphere(); + }, + lineStart: function() { + this.stream.lineStart(); + }, + lineEnd: function() { + this.stream.lineEnd(); + }, + polygonStart: function() { + this.stream.polygonStart(); + }, + polygonEnd: function() { + this.stream.polygonEnd(); + } + }; + function d3_geo_transformPoint(stream, point) { + return { + point: point, + sphere: function() { + stream.sphere(); + }, + lineStart: function() { + stream.lineStart(); + }, + lineEnd: function() { + stream.lineEnd(); + }, + polygonStart: function() { + stream.polygonStart(); + }, + polygonEnd: function() { + stream.polygonEnd(); + } + }; + } + d3.geo.projection = d3_geo_projection; + d3.geo.projectionMutator = d3_geo_projectionMutator; + function d3_geo_projection(project) { + return d3_geo_projectionMutator(function() { + return project; + })(); + } + function d3_geo_projectionMutator(projectAt) { + var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { + x = project(x, y); + return [ x[0] * k + δx, δy - x[1] * k ]; + }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream; + function projection(point) { + point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); + return [ point[0] * k + δx, δy - point[1] * k ]; + } + function invert(point) { + point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); + return point && [ point[0] * d3_degrees, point[1] * d3_degrees ]; + } + projection.stream = function(output) { + if (stream) stream.valid = false; + stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output)))); + stream.valid = true; + return stream; + }; + projection.clipAngle = function(_) { + if (!arguments.length) return clipAngle; + preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); + return invalidate(); + }; + projection.clipExtent = function(_) { + if (!arguments.length) return clipExtent; + clipExtent = _; + postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; + return invalidate(); + }; + projection.scale = function(_) { + if (!arguments.length) return k; + k = +_; + return reset(); + }; + projection.translate = function(_) { + if (!arguments.length) return [ x, y ]; + x = +_[0]; + y = +_[1]; + return reset(); + }; + projection.center = function(_) { + if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; + λ = _[0] % 360 * d3_radians; + φ = _[1] % 360 * d3_radians; + return reset(); + }; + projection.rotate = function(_) { + if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; + δλ = _[0] % 360 * d3_radians; + δφ = _[1] % 360 * d3_radians; + δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; + return reset(); + }; + d3.rebind(projection, projectResample, "precision"); + function reset() { + projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); + var center = project(λ, φ); + δx = x - center[0] * k; + δy = y + center[1] * k; + return invalidate(); + } + function invalidate() { + if (stream) stream.valid = false, stream = null; + return projection; + } + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return reset(); + }; + } + function d3_geo_projectionRadians(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + stream.point(x * d3_radians, y * d3_radians); + }); + } + function d3_geo_equirectangular(λ, φ) { + return [ λ, φ ]; + } + (d3.geo.equirectangular = function() { + return d3_geo_projection(d3_geo_equirectangular); + }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; + d3.geo.rotation = function(rotate) { + rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); + function forward(coordinates) { + coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + } + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + }; + return forward; + }; + function d3_geo_identityRotation(λ, φ) { + return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + } + d3_geo_identityRotation.invert = d3_geo_equirectangular; + function d3_geo_rotation(δλ, δφ, δγ) { + return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation; + } + function d3_geo_forwardRotationλ(δλ) { + return function(λ, φ) { + return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + }; + } + function d3_geo_rotationλ(δλ) { + var rotation = d3_geo_forwardRotationλ(δλ); + rotation.invert = d3_geo_forwardRotationλ(-δλ); + return rotation; + } + function d3_geo_rotationφγ(δφ, δγ) { + var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); + function rotation(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; + return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ]; + } + rotation.invert = function(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; + return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ]; + }; + return rotation; + } + d3.geo.circle = function() { + var origin = [ 0, 0 ], angle, precision = 6, interpolate; + function circle() { + var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = []; + interpolate(null, null, 1, { + point: function(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= d3_degrees, x[1] *= d3_degrees; + } + }); + return { + type: "Polygon", + coordinates: [ ring ] + }; + } + circle.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return circle; + }; + circle.angle = function(x) { + if (!arguments.length) return angle; + interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); + return circle; + }; + circle.precision = function(_) { + if (!arguments.length) return precision; + interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); + return circle; + }; + return circle.angle(90); + }; + function d3_geo_circleInterpolate(radius, precision) { + var cr = Math.cos(radius), sr = Math.sin(radius); + return function(from, to, direction, listener) { + var step = direction * precision; + if (from != null) { + from = d3_geo_circleAngle(cr, from); + to = d3_geo_circleAngle(cr, to); + if (direction > 0 ? from < to : from > to) from += direction * τ; + } else { + from = radius + direction * τ; + to = radius - .5 * step; + } + for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { + listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); + } + }; + } + function d3_geo_circleAngle(cr, point) { + var a = d3_geo_cartesian(point); + a[0] -= cr; + d3_geo_cartesianNormalize(a); + var angle = d3_acos(-a[1]); + return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); + } + d3.geo.distance = function(a, b) { + var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t; + return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ); + }; + d3.geo.graticule = function() { + var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5; + function graticule() { + return { + type: "MultiLineString", + coordinates: lines() + }; + } + function lines() { + return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { + return abs(x % DX) > ε; + }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { + return abs(y % DY) > ε; + }).map(y)); + } + graticule.lines = function() { + return lines().map(function(coordinates) { + return { + type: "LineString", + coordinates: coordinates + }; + }); + }; + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] + }; + }; + graticule.extent = function(_) { + if (!arguments.length) return graticule.minorExtent(); + return graticule.majorExtent(_).minorExtent(_); + }; + graticule.majorExtent = function(_) { + if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + graticule.minorExtent = function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + graticule.step = function(_) { + if (!arguments.length) return graticule.minorStep(); + return graticule.majorStep(_).minorStep(_); + }; + graticule.majorStep = function(_) { + if (!arguments.length) return [ DX, DY ]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + graticule.minorStep = function(_) { + if (!arguments.length) return [ dx, dy ]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = d3_geo_graticuleX(y0, y1, 90); + y = d3_geo_graticuleY(x0, x1, precision); + X = d3_geo_graticuleX(Y0, Y1, 90); + Y = d3_geo_graticuleY(X0, X1, precision); + return graticule; + }; + return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]); + }; + function d3_geo_graticuleX(y0, y1, dy) { + var y = d3.range(y0, y1 - ε, dy).concat(y1); + return function(x) { + return y.map(function(y) { + return [ x, y ]; + }); + }; + } + function d3_geo_graticuleY(x0, x1, dx) { + var x = d3.range(x0, x1 - ε, dx).concat(x1); + return function(y) { + return x.map(function(x) { + return [ x, y ]; + }); + }; + } + function d3_source(d) { + return d.source; + } + function d3_target(d) { + return d.target; + } + d3.geo.greatArc = function() { + var source = d3_source, source_, target = d3_target, target_; + function greatArc() { + return { + type: "LineString", + coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ] + }; + } + greatArc.distance = function() { + return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments)); + }; + greatArc.source = function(_) { + if (!arguments.length) return source; + source = _, source_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.target = function(_) { + if (!arguments.length) return target; + target = _, target_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.precision = function() { + return arguments.length ? greatArc : 0; + }; + return greatArc; + }; + d3.geo.interpolate = function(source, target) { + return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); + }; + function d3_geo_interpolate(x0, y0, x1, y1) { + var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d); + var interpolate = d ? function(t) { + var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; + return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ]; + } : function() { + return [ x0 * d3_degrees, y0 * d3_degrees ]; + }; + interpolate.distance = d; + return interpolate; + } + d3.geo.length = function(object) { + d3_geo_lengthSum = 0; + d3.geo.stream(object, d3_geo_length); + return d3_geo_lengthSum; + }; + var d3_geo_lengthSum; + var d3_geo_length = { + sphere: d3_noop, + point: d3_noop, + lineStart: d3_geo_lengthLineStart, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_lengthLineStart() { + var λ0, sinφ0, cosφ0; + d3_geo_length.point = function(λ, φ) { + λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); + d3_geo_length.point = nextPoint; + }; + d3_geo_length.lineEnd = function() { + d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; + }; + function nextPoint(λ, φ) { + var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t); + d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; + } + } + function d3_geo_azimuthal(scale, angle) { + function azimuthal(λ, φ) { + var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); + return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; + } + azimuthal.invert = function(x, y) { + var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); + return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; + }; + return azimuthal; + } + var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { + return Math.sqrt(2 / (1 + cosλcosφ)); + }, function(ρ) { + return 2 * Math.asin(ρ / 2); + }); + (d3.geo.azimuthalEqualArea = function() { + return d3_geo_projection(d3_geo_azimuthalEqualArea); + }).raw = d3_geo_azimuthalEqualArea; + var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { + var c = Math.acos(cosλcosφ); + return c && c / Math.sin(c); + }, d3_identity); + (d3.geo.azimuthalEquidistant = function() { + return d3_geo_projection(d3_geo_azimuthalEquidistant); + }).raw = d3_geo_azimuthalEquidistant; + function d3_geo_conicConformal(φ0, φ1) { + var cosφ0 = Math.cos(φ0), t = function(φ) { + return Math.tan(π / 4 + φ / 2); + }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n; + if (!n) return d3_geo_mercator; + function forward(λ, φ) { + if (F > 0) { + if (φ < -halfπ + ε) φ = -halfπ + ε; + } else { + if (φ > halfπ - ε) φ = halfπ - ε; + } + var ρ = F / Math.pow(t(φ), n); + return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y); + return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ]; + }; + return forward; + } + (d3.geo.conicConformal = function() { + return d3_geo_conic(d3_geo_conicConformal); + }).raw = d3_geo_conicConformal; + function d3_geo_conicEquidistant(φ0, φ1) { + var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0; + if (abs(n) < ε) return d3_geo_equirectangular; + function forward(λ, φ) { + var ρ = G - φ; + return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = G - y; + return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ]; + }; + return forward; + } + (d3.geo.conicEquidistant = function() { + return d3_geo_conic(d3_geo_conicEquidistant); + }).raw = d3_geo_conicEquidistant; + var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / cosλcosφ; + }, Math.atan); + (d3.geo.gnomonic = function() { + return d3_geo_projection(d3_geo_gnomonic); + }).raw = d3_geo_gnomonic; + function d3_geo_mercator(λ, φ) { + return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ]; + } + d3_geo_mercator.invert = function(x, y) { + return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ]; + }; + function d3_geo_mercatorProjection(project) { + var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto; + m.scale = function() { + var v = scale.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.translate = function() { + var v = translate.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.clipExtent = function(_) { + var v = clipExtent.apply(m, arguments); + if (v === m) { + if (clipAuto = _ == null) { + var k = π * scale(), t = translate(); + clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]); + } + } else if (clipAuto) { + v = null; + } + return v; + }; + return m.clipExtent(null); + } + (d3.geo.mercator = function() { + return d3_geo_mercatorProjection(d3_geo_mercator); + }).raw = d3_geo_mercator; + var d3_geo_orthographic = d3_geo_azimuthal(function() { + return 1; + }, Math.asin); + (d3.geo.orthographic = function() { + return d3_geo_projection(d3_geo_orthographic); + }).raw = d3_geo_orthographic; + var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / (1 + cosλcosφ); + }, function(ρ) { + return 2 * Math.atan(ρ); + }); + (d3.geo.stereographic = function() { + return d3_geo_projection(d3_geo_stereographic); + }).raw = d3_geo_stereographic; + function d3_geo_transverseMercator(λ, φ) { + return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ]; + } + d3_geo_transverseMercator.invert = function(x, y) { + return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ]; + }; + (d3.geo.transverseMercator = function() { + var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate; + projection.center = function(_) { + return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]); + }; + projection.rotate = function(_) { + return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), + [ _[0], _[1], _[2] - 90 ]); + }; + return rotate([ 0, 0, 90 ]); + }).raw = d3_geo_transverseMercator; + d3.geom = {}; + function d3_geom_pointX(d) { + return d[0]; + } + function d3_geom_pointY(d) { + return d[1]; + } + d3.geom.hull = function(vertices) { + var x = d3_geom_pointX, y = d3_geom_pointY; + if (arguments.length) return hull(vertices); + function hull(data) { + if (data.length < 3) return []; + var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = []; + for (i = 0; i < n; i++) { + points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]); + } + points.sort(d3_geom_hullOrder); + for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]); + var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints); + var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = []; + for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]); + for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]); + return polygon; + } + hull.x = function(_) { + return arguments.length ? (x = _, hull) : x; + }; + hull.y = function(_) { + return arguments.length ? (y = _, hull) : y; + }; + return hull; + }; + function d3_geom_hullUpper(points) { + var n = points.length, hull = [ 0, 1 ], hs = 2; + for (var i = 2; i < n; i++) { + while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs; + hull[hs++] = i; + } + return hull.slice(0, hs); + } + function d3_geom_hullOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + d3.geom.polygon = function(coordinates) { + d3_subclass(coordinates, d3_geom_polygonPrototype); + return coordinates; + }; + var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; + d3_geom_polygonPrototype.area = function() { + var i = -1, n = this.length, a, b = this[n - 1], area = 0; + while (++i < n) { + a = b; + b = this[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + return area * .5; + }; + d3_geom_polygonPrototype.centroid = function(k) { + var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c; + if (!arguments.length) k = -1 / (6 * this.area()); + while (++i < n) { + a = b; + b = this[i]; + c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + return [ x * k, y * k ]; + }; + d3_geom_polygonPrototype.clip = function(subject) { + var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d; + while (++i < n) { + input = subject.slice(); + subject.length = 0; + b = this[i]; + c = input[(m = input.length - closed) - 1]; + j = -1; + while (++j < m) { + d = input[j]; + if (d3_geom_polygonInside(d, a, b)) { + if (!d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + subject.push(d); + } else if (d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + c = d; + } + if (closed) subject.push(subject[0]); + a = b; + } + return subject; + }; + function d3_geom_polygonInside(p, a, b) { + return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); + } + function d3_geom_polygonIntersect(c, d, a, b) { + var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); + return [ x1 + ua * x21, y1 + ua * y21 ]; + } + function d3_geom_polygonClosed(coordinates) { + var a = coordinates[0], b = coordinates[coordinates.length - 1]; + return !(a[0] - b[0] || a[1] - b[1]); + } + var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = []; + function d3_geom_voronoiBeach() { + d3_geom_voronoiRedBlackNode(this); + this.edge = this.site = this.circle = null; + } + function d3_geom_voronoiCreateBeach(site) { + var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach(); + beach.site = site; + return beach; + } + function d3_geom_voronoiDetachBeach(beach) { + d3_geom_voronoiDetachCircle(beach); + d3_geom_voronoiBeaches.remove(beach); + d3_geom_voronoiBeachPool.push(beach); + d3_geom_voronoiRedBlackNode(beach); + } + function d3_geom_voronoiRemoveBeach(beach) { + var circle = beach.circle, x = circle.x, y = circle.cy, vertex = { + x: x, + y: y + }, previous = beach.P, next = beach.N, disappearing = [ beach ]; + d3_geom_voronoiDetachBeach(beach); + var lArc = previous; + while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) { + previous = lArc.P; + disappearing.unshift(lArc); + d3_geom_voronoiDetachBeach(lArc); + lArc = previous; + } + disappearing.unshift(lArc); + d3_geom_voronoiDetachCircle(lArc); + var rArc = next; + while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) { + next = rArc.N; + disappearing.push(rArc); + d3_geom_voronoiDetachBeach(rArc); + rArc = next; + } + disappearing.push(rArc); + d3_geom_voronoiDetachCircle(rArc); + var nArcs = disappearing.length, iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiAddBeach(site) { + var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._; + while (node) { + dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x; + if (dxl > ε) node = node.L; else { + dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix); + if (dxr > ε) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -ε) { + lArc = node.P; + rArc = node; + } else if (dxr > -ε) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + var newArc = d3_geom_voronoiCreateBeach(site); + d3_geom_voronoiBeaches.insert(lArc, newArc); + if (!lArc && !rArc) return; + if (lArc === rArc) { + d3_geom_voronoiDetachCircle(lArc); + rArc = d3_geom_voronoiCreateBeach(lArc.site); + d3_geom_voronoiBeaches.insert(newArc, rArc); + newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + return; + } + if (!rArc) { + newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + return; + } + d3_geom_voronoiDetachCircle(lArc); + d3_geom_voronoiDetachCircle(rArc); + var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = { + x: (cy * hb - by * hc) / d + ax, + y: (bx * hc - cx * hb) / d + ay + }; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex); + rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiLeftBreakPoint(arc, directrix) { + var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix; + if (!pby2) return rfocx; + var lArc = arc.P; + if (!lArc) return -Infinity; + site = lArc.site; + var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix; + if (!plby2) return lfocx; + var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2; + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + return (rfocx + lfocx) / 2; + } + function d3_geom_voronoiRightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix); + var site = arc.site; + return site.y === directrix ? site.x : Infinity; + } + function d3_geom_voronoiCell(site) { + this.site = site; + this.edges = []; + } + d3_geom_voronoiCell.prototype.prepare = function() { + var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge; + while (iHalfEdge--) { + edge = halfEdges[iHalfEdge].edge; + if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1); + } + halfEdges.sort(d3_geom_voronoiHalfEdgeOrder); + return halfEdges.length; + }; + function d3_geom_voronoiCloseCells(extent) { + var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end; + while (iCell--) { + cell = cells[iCell]; + if (!cell || !cell.prepare()) continue; + halfEdges = cell.edges; + nHalfEdges = halfEdges.length; + iHalfEdge = 0; + while (iHalfEdge < nHalfEdges) { + end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y; + start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y; + if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) { + halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? { + x: x0, + y: abs(x2 - x0) < ε ? y2 : y1 + } : abs(y3 - y1) < ε && x1 - x3 > ε ? { + x: abs(y2 - y1) < ε ? x2 : x1, + y: y1 + } : abs(x3 - x1) < ε && y3 - y0 > ε ? { + x: x1, + y: abs(x2 - x1) < ε ? y2 : y0 + } : abs(y3 - y0) < ε && x3 - x0 > ε ? { + x: abs(y2 - y0) < ε ? x2 : x0, + y: y0 + } : null), cell.site, null)); + ++nHalfEdges; + } + } + } + } + function d3_geom_voronoiHalfEdgeOrder(a, b) { + return b.angle - a.angle; + } + function d3_geom_voronoiCircle() { + d3_geom_voronoiRedBlackNode(this); + this.x = this.y = this.arc = this.site = this.cy = null; + } + function d3_geom_voronoiAttachCircle(arc) { + var lArc = arc.P, rArc = arc.N; + if (!lArc || !rArc) return; + var lSite = lArc.site, cSite = arc.site, rSite = rArc.site; + if (lSite === rSite) return; + var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by; + var d = 2 * (ax * cy - ay * cx); + if (d >= -ε2) return; + var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by; + var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle(); + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = cy + Math.sqrt(x * x + y * y); + circle.cy = cy; + arc.circle = circle; + var before = null, node = d3_geom_voronoiCircles._; + while (node) { + if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) { + if (node.L) node = node.L; else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; else { + before = node; + break; + } + } + } + d3_geom_voronoiCircles.insert(before, circle); + if (!before) d3_geom_voronoiFirstCircle = circle; + } + function d3_geom_voronoiDetachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) d3_geom_voronoiFirstCircle = circle.N; + d3_geom_voronoiCircles.remove(circle); + d3_geom_voronoiCirclePool.push(circle); + d3_geom_voronoiRedBlackNode(circle); + arc.circle = null; + } + } + function d3_geom_voronoiClipEdges(extent) { + var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e; + while (i--) { + e = edges[i]; + if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) { + e.a = e.b = null; + edges.splice(i, 1); + } + } + } + function d3_geom_voronoiConnectEdge(edge, extent) { + var vb = edge.b; + if (vb) return true; + var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb; + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!va) va = { + x: fx, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: fx, + y: y1 + }; + } else { + if (!va) va = { + x: fx, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: fx, + y: y0 + }; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!va) va = { + x: (y0 - fb) / fm, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: (y1 - fb) / fm, + y: y1 + }; + } else { + if (!va) va = { + x: (y1 - fb) / fm, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: (y0 - fb) / fm, + y: y0 + }; + } + } else { + if (ly < ry) { + if (!va) va = { + x: x0, + y: fm * x0 + fb + }; else if (va.x >= x1) return; + vb = { + x: x1, + y: fm * x1 + fb + }; + } else { + if (!va) va = { + x: x1, + y: fm * x1 + fb + }; else if (va.x < x0) return; + vb = { + x: x0, + y: fm * x0 + fb + }; + } + } + } + edge.a = va; + edge.b = vb; + return true; + } + function d3_geom_voronoiEdge(lSite, rSite) { + this.l = lSite; + this.r = rSite; + this.a = this.b = null; + } + function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, rSite); + d3_geom_voronoiEdges.push(edge); + if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va); + if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb); + d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite)); + d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite)); + return edge; + } + function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, null); + edge.a = va; + edge.b = vb; + d3_geom_voronoiEdges.push(edge); + return edge; + } + function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) { + if (!edge.a && !edge.b) { + edge.a = vertex; + edge.l = lSite; + edge.r = rSite; + } else if (edge.l === rSite) { + edge.b = vertex; + } else { + edge.a = vertex; + } + } + function d3_geom_voronoiHalfEdge(edge, lSite, rSite) { + var va = edge.a, vb = edge.b; + this.edge = edge; + this.site = lSite; + this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y); + } + d3_geom_voronoiHalfEdge.prototype = { + start: function() { + return this.edge.l === this.site ? this.edge.a : this.edge.b; + }, + end: function() { + return this.edge.l === this.site ? this.edge.b : this.edge.a; + } + }; + function d3_geom_voronoiRedBlackTree() { + this._ = null; + } + function d3_geom_voronoiRedBlackNode(node) { + node.U = node.C = node.L = node.R = node.P = node.N = null; + } + d3_geom_voronoiRedBlackTree.prototype = { + insert: function(after, node) { + var parent, grandpa, uncle; + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = d3_geom_voronoiRedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + d3_geom_voronoiRedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + d3_geom_voronoiRedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + var parent = node.U, sibling, left = node.L, right = node.R, next, red; + if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right); + if (parent) { + if (parent.L === node) parent.L = next; else parent.R = next; + } else { + this._ = next; + } + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateRight(this, parent); + sibling = parent.L; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + d3_geom_voronoiRedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + if (node) node.C = false; + } + }; + function d3_geom_voronoiRedBlackRotateLeft(tree, node) { + var p = node, q = node.R, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + function d3_geom_voronoiRedBlackRotateRight(tree, node) { + var p = node, q = node.L, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + function d3_geom_voronoiRedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + function d3_geom_voronoi(sites, bbox) { + var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle; + d3_geom_voronoiEdges = []; + d3_geom_voronoiCells = new Array(sites.length); + d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree(); + d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree(); + while (true) { + circle = d3_geom_voronoiFirstCircle; + if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) { + if (site.x !== x0 || site.y !== y0) { + d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site); + d3_geom_voronoiAddBeach(site); + x0 = site.x, y0 = site.y; + } + site = sites.pop(); + } else if (circle) { + d3_geom_voronoiRemoveBeach(circle.arc); + } else { + break; + } + } + if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox); + var diagram = { + cells: d3_geom_voronoiCells, + edges: d3_geom_voronoiEdges + }; + d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null; + return diagram; + } + function d3_geom_voronoiVertexOrder(a, b) { + return b.y - a.y || b.x - a.x; + } + d3.geom.voronoi = function(points) { + var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent; + if (points) return voronoi(points); + function voronoi(data) { + var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1]; + d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) { + var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) { + var s = e.start(); + return [ s.x, s.y ]; + }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : []; + polygon.point = data[i]; + }); + return polygons; + } + function sites(data) { + return data.map(function(d, i) { + return { + x: Math.round(fx(d, i) / ε) * ε, + y: Math.round(fy(d, i) / ε) * ε, + i: i + }; + }); + } + voronoi.links = function(data) { + return d3_geom_voronoi(sites(data)).edges.filter(function(edge) { + return edge.l && edge.r; + }).map(function(edge) { + return { + source: data[edge.l.i], + target: data[edge.r.i] + }; + }); + }; + voronoi.triangles = function(data) { + var triangles = []; + d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { + var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l; + while (++j < m) { + e0 = e1; + s0 = s1; + e1 = edges[j].edge; + s1 = e1.l === site ? e1.r : e1.l; + if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { + triangles.push([ data[i], data[s0.i], data[s1.i] ]); + } + } + }); + return triangles; + }; + voronoi.x = function(_) { + return arguments.length ? (fx = d3_functor(x = _), voronoi) : x; + }; + voronoi.y = function(_) { + return arguments.length ? (fy = d3_functor(y = _), voronoi) : y; + }; + voronoi.clipExtent = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent; + clipExtent = _ == null ? d3_geom_voronoiClipExtent : _; + return voronoi; + }; + voronoi.size = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1]; + return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]); + }; + return voronoi; + }; + var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ]; + function d3_geom_voronoiTriangleArea(a, b, c) { + return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y); + } + d3.geom.delaunay = function(vertices) { + return d3.geom.voronoi().triangles(vertices); + }; + d3.geom.quadtree = function(points, x1, y1, x2, y2) { + var x = d3_geom_pointX, y = d3_geom_pointY, compat; + if (compat = arguments.length) { + x = d3_geom_quadtreeCompatX; + y = d3_geom_quadtreeCompatY; + if (compat === 3) { + y2 = y1; + x2 = x1; + y1 = x1 = 0; + } + return quadtree(points); + } + function quadtree(data) { + var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_; + if (x1 != null) { + x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2; + } else { + x2_ = y2_ = -(x1_ = y1_ = Infinity); + xs = [], ys = []; + n = data.length; + if (compat) for (i = 0; i < n; ++i) { + d = data[i]; + if (d.x < x1_) x1_ = d.x; + if (d.y < y1_) y1_ = d.y; + if (d.x > x2_) x2_ = d.x; + if (d.y > y2_) y2_ = d.y; + xs.push(d.x); + ys.push(d.y); + } else for (i = 0; i < n; ++i) { + var x_ = +fx(d = data[i], i), y_ = +fy(d, i); + if (x_ < x1_) x1_ = x_; + if (y_ < y1_) y1_ = y_; + if (x_ > x2_) x2_ = x_; + if (y_ > y2_) y2_ = y_; + xs.push(x_); + ys.push(y_); + } + } + var dx = x2_ - x1_, dy = y2_ - y1_; + if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy; + function insert(n, d, x, y, x1, y1, x2, y2) { + if (isNaN(x) || isNaN(y)) return; + if (n.leaf) { + var nx = n.x, ny = n.y; + if (nx != null) { + if (abs(nx - x) + abs(ny - y) < .01) { + insertChild(n, d, x, y, x1, y1, x2, y2); + } else { + var nPoint = n.point; + n.x = n.y = n.point = null; + insertChild(n, nPoint, nx, ny, x1, y1, x2, y2); + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } else { + n.x = x, n.y = y, n.point = d; + } + } else { + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } + function insertChild(n, d, x, y, x1, y1, x2, y2) { + var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right; + n.leaf = false; + n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); + if (right) x1 = xm; else x2 = xm; + if (below) y1 = ym; else y2 = ym; + insert(n, d, x, y, x1, y1, x2, y2); + } + var root = d3_geom_quadtreeNode(); + root.add = function(d) { + insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_); + }; + root.visit = function(f) { + d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_); + }; + root.find = function(point) { + return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_); + }; + i = -1; + if (x1 == null) { + while (++i < n) { + insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_); + } + --i; + } else data.forEach(root.add); + xs = ys = data = d = null; + return root; + } + quadtree.x = function(_) { + return arguments.length ? (x = _, quadtree) : x; + }; + quadtree.y = function(_) { + return arguments.length ? (y = _, quadtree) : y; + }; + quadtree.extent = function(_) { + if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], + y2 = +_[1][1]; + return quadtree; + }; + quadtree.size = function(_) { + if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1]; + return quadtree; + }; + return quadtree; + }; + function d3_geom_quadtreeCompatX(d) { + return d.x; + } + function d3_geom_quadtreeCompatY(d) { + return d.y; + } + function d3_geom_quadtreeNode() { + return { + leaf: true, + nodes: [], + point: null, + x: null, + y: null + }; + } + function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { + if (!f(node, x1, y1, x2, y2)) { + var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; + if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); + if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); + if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); + if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); + } + } + function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) { + var minDistance2 = Infinity, closestPoint; + (function find(node, x1, y1, x2, y2) { + if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return; + if (point = node.point) { + var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy; + if (distance2 < minDistance2) { + var distance = Math.sqrt(minDistance2 = distance2); + x0 = x - distance, y0 = y - distance; + x3 = x + distance, y3 = y + distance; + closestPoint = point; + } + } + var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym; + for (var i = below << 1 | right, j = i + 4; i < j; ++i) { + if (node = children[i & 3]) switch (i & 3) { + case 0: + find(node, x1, y1, xm, ym); + break; + + case 1: + find(node, xm, y1, x2, ym); + break; + + case 2: + find(node, x1, ym, xm, y2); + break; + + case 3: + find(node, xm, ym, x2, y2); + break; + } + } + })(root, x0, y0, x3, y3); + return closestPoint; + } + d3.interpolateRgb = d3_interpolateRgb; + function d3_interpolateRgb(a, b) { + a = d3.rgb(a); + b = d3.rgb(b); + var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; + return function(t) { + return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); + }; + } + d3.interpolateObject = d3_interpolateObject; + function d3_interpolateObject(a, b) { + var i = {}, c = {}, k; + for (k in a) { + if (k in b) { + i[k] = d3_interpolate(a[k], b[k]); + } else { + c[k] = a[k]; + } + } + for (k in b) { + if (!(k in a)) { + c[k] = b[k]; + } + } + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + d3.interpolateNumber = d3_interpolateNumber; + function d3_interpolateNumber(a, b) { + a = +a, b = +b; + return function(t) { + return a * (1 - t) + b * t; + }; + } + d3.interpolateString = d3_interpolateString; + function d3_interpolateString(a, b) { + var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a = a + "", b = b + ""; + while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) s[i] += bm; else s[++i] = bm; + } else { + s[++i] = null; + q.push({ + i: i, + x: d3_interpolateNumber(am, bm) + }); + } + bi = d3_interpolate_numberB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + return s.length < 2 ? q[0] ? (b = q[0].x, function(t) { + return b(t) + ""; + }) : function() { + return b; + } : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); + d3.interpolate = d3_interpolate; + function d3_interpolate(a, b) { + var i = d3.interpolators.length, f; + while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; + return f; + } + d3.interpolators = [ function(a, b) { + var t = typeof b; + return (t === "string" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\(|hsl\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b); + } ]; + d3.interpolateArray = d3_interpolateArray; + function d3_interpolateArray(a, b) { + var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; + for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); + for (;i < na; ++i) c[i] = a[i]; + for (;i < nb; ++i) c[i] = b[i]; + return function(t) { + for (i = 0; i < n0; ++i) c[i] = x[i](t); + return c; + }; + } + var d3_ease_default = function() { + return d3_identity; + }; + var d3_ease = d3.map({ + linear: d3_ease_default, + poly: d3_ease_poly, + quad: function() { + return d3_ease_quad; + }, + cubic: function() { + return d3_ease_cubic; + }, + sin: function() { + return d3_ease_sin; + }, + exp: function() { + return d3_ease_exp; + }, + circle: function() { + return d3_ease_circle; + }, + elastic: d3_ease_elastic, + back: d3_ease_back, + bounce: function() { + return d3_ease_bounce; + } + }); + var d3_ease_mode = d3.map({ + "in": d3_identity, + out: d3_ease_reverse, + "in-out": d3_ease_reflect, + "out-in": function(f) { + return d3_ease_reflect(d3_ease_reverse(f)); + } + }); + d3.ease = function(name) { + var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in"; + t = d3_ease.get(t) || d3_ease_default; + m = d3_ease_mode.get(m) || d3_identity; + return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1)))); + }; + function d3_ease_clamp(f) { + return function(t) { + return t <= 0 ? 0 : t >= 1 ? 1 : f(t); + }; + } + function d3_ease_reverse(f) { + return function(t) { + return 1 - f(1 - t); + }; + } + function d3_ease_reflect(f) { + return function(t) { + return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); + }; + } + function d3_ease_quad(t) { + return t * t; + } + function d3_ease_cubic(t) { + return t * t * t; + } + function d3_ease_cubicInOut(t) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, t3 = t2 * t; + return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); + } + function d3_ease_poly(e) { + return function(t) { + return Math.pow(t, e); + }; + } + function d3_ease_sin(t) { + return 1 - Math.cos(t * halfπ); + } + function d3_ease_exp(t) { + return Math.pow(2, 10 * (t - 1)); + } + function d3_ease_circle(t) { + return 1 - Math.sqrt(1 - t * t); + } + function d3_ease_elastic(a, p) { + var s; + if (arguments.length < 2) p = .45; + if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4; + return function(t) { + return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p); + }; + } + function d3_ease_back(s) { + if (!s) s = 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); + }; + } + function d3_ease_bounce(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; + } + d3.interpolateHcl = d3_interpolateHcl; + function d3_interpolateHcl(a, b) { + a = d3.hcl(a); + b = d3.hcl(b); + var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; + if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; + }; + } + d3.interpolateHsl = d3_interpolateHsl; + function d3_interpolateHsl(a, b) { + a = d3.hsl(a); + b = d3.hsl(b); + var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al; + if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + ""; + }; + } + d3.interpolateLab = d3_interpolateLab; + function d3_interpolateLab(a, b) { + a = d3.lab(a); + b = d3.lab(b); + var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; + return function(t) { + return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; + }; + } + d3.interpolateRound = d3_interpolateRound; + function d3_interpolateRound(a, b) { + b -= a; + return function(t) { + return Math.round(a + b * t); + }; + } + d3.transform = function(string) { + var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); + return (d3.transform = function(string) { + if (string != null) { + g.setAttribute("transform", string); + var t = g.transform.baseVal.consolidate(); + } + return new d3_transform(t ? t.matrix : d3_transformIdentity); + })(string); + }; + function d3_transform(m) { + var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; + if (r0[0] * r1[1] < r1[0] * r0[1]) { + r0[0] *= -1; + r0[1] *= -1; + kx *= -1; + kz *= -1; + } + this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; + this.translate = [ m.e, m.f ]; + this.scale = [ kx, ky ]; + this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; + } + d3_transform.prototype.toString = function() { + return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; + }; + function d3_transformDot(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + function d3_transformNormalize(a) { + var k = Math.sqrt(d3_transformDot(a, a)); + if (k) { + a[0] /= k; + a[1] /= k; + } + return k; + } + function d3_transformCombine(a, b, k) { + a[0] += k * b[0]; + a[1] += k * b[1]; + return a; + } + var d3_transformIdentity = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0 + }; + d3.interpolateTransform = d3_interpolateTransform; + function d3_interpolateTransformPop(s) { + return s.length ? s.pop() + "," : ""; + } + function d3_interpolateTranslate(ta, tb, s, q) { + if (ta[0] !== tb[0] || ta[1] !== tb[1]) { + var i = s.push("translate(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ta[0], tb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ta[1], tb[1]) + }); + } else if (tb[0] || tb[1]) { + s.push("translate(" + tb + ")"); + } + } + function d3_interpolateRotate(ra, rb, s, q) { + if (ra !== rb) { + if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "rotate(", null, ")") - 2, + x: d3_interpolateNumber(ra, rb) + }); + } else if (rb) { + s.push(d3_interpolateTransformPop(s) + "rotate(" + rb + ")"); + } + } + function d3_interpolateSkew(wa, wb, s, q) { + if (wa !== wb) { + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "skewX(", null, ")") - 2, + x: d3_interpolateNumber(wa, wb) + }); + } else if (wb) { + s.push(d3_interpolateTransformPop(s) + "skewX(" + wb + ")"); + } + } + function d3_interpolateScale(ka, kb, s, q) { + if (ka[0] !== kb[0] || ka[1] !== kb[1]) { + var i = s.push(d3_interpolateTransformPop(s) + "scale(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ka[0], kb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ka[1], kb[1]) + }); + } else if (kb[0] !== 1 || kb[1] !== 1) { + s.push(d3_interpolateTransformPop(s) + "scale(" + kb + ")"); + } + } + function d3_interpolateTransform(a, b) { + var s = [], q = []; + a = d3.transform(a), b = d3.transform(b); + d3_interpolateTranslate(a.translate, b.translate, s, q); + d3_interpolateRotate(a.rotate, b.rotate, s, q); + d3_interpolateSkew(a.skew, b.skew, s, q); + d3_interpolateScale(a.scale, b.scale, s, q); + a = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + } + function d3_uninterpolateNumber(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return (x - a) / b; + }; + } + function d3_uninterpolateClamp(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return Math.max(0, Math.min(1, (x - a) / b)); + }; + } + d3.layout = {}; + d3.layout.bundle = function() { + return function(links) { + var paths = [], i = -1, n = links.length; + while (++i < n) paths.push(d3_layout_bundlePath(links[i])); + return paths; + }; + }; + function d3_layout_bundlePath(link) { + var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; + while (start !== lca) { + start = start.parent; + points.push(start); + } + var k = points.length; + while (end !== lca) { + points.splice(k, 0, end); + end = end.parent; + } + return points; + } + function d3_layout_bundleAncestors(node) { + var ancestors = [], parent = node.parent; + while (parent != null) { + ancestors.push(node); + node = parent; + parent = parent.parent; + } + ancestors.push(node); + return ancestors; + } + function d3_layout_bundleLeastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; + while (aNode === bNode) { + sharedNode = aNode; + aNode = aNodes.pop(); + bNode = bNodes.pop(); + } + return sharedNode; + } + d3.layout.chord = function() { + var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; + function relayout() { + var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; + chords = []; + groups = []; + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3.range(n)); + k += x; + } + if (sortGroups) { + groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + } + if (sortSubgroups) { + subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + } + k = (τ - padding * n) / k; + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; + subgroups[di + "-" + dj] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += padding; + } + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; + if (source.value || target.value) { + chords.push(source.value < target.value ? { + source: target, + target: source + } : { + source: source, + target: target + }); + } + } + } + if (sortChords) resort(); + } + function resort() { + chords.sort(function(a, b) { + return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); + }); + } + chord.matrix = function(x) { + if (!arguments.length) return matrix; + n = (matrix = x) && matrix.length; + chords = groups = null; + return chord; + }; + chord.padding = function(x) { + if (!arguments.length) return padding; + padding = x; + chords = groups = null; + return chord; + }; + chord.sortGroups = function(x) { + if (!arguments.length) return sortGroups; + sortGroups = x; + chords = groups = null; + return chord; + }; + chord.sortSubgroups = function(x) { + if (!arguments.length) return sortSubgroups; + sortSubgroups = x; + chords = null; + return chord; + }; + chord.sortChords = function(x) { + if (!arguments.length) return sortChords; + sortChords = x; + if (chords) resort(); + return chord; + }; + chord.chords = function() { + if (!chords) relayout(); + return chords; + }; + chord.groups = function() { + if (!groups) relayout(); + return groups; + }; + return chord; + }; + d3.layout.force = function() { + var force = {}, event = d3.dispatch("start", "tick", "end"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges; + function repulse(node) { + return function(quad, x1, _, x2) { + if (quad.point !== node) { + var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy; + if (dw * dw / theta2 < dn) { + if (dn < chargeDistance2) { + var k = quad.charge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + return true; + } + if (quad.point && dn && dn < chargeDistance2) { + var k = quad.pointCharge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + } + return !quad.charge; + }; + } + force.tick = function() { + if ((alpha *= .99) < .005) { + timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + return true; + } + var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; + for (i = 0; i < m; ++i) { + o = links[i]; + s = o.source; + t = o.target; + x = t.x - s.x; + y = t.y - s.y; + if (l = x * x + y * y) { + l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; + x *= l; + y *= l; + t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5); + t.y -= y * k; + s.x += x * (k = 1 - k); + s.y += y * k; + } + } + if (k = alpha * gravity) { + x = size[0] / 2; + y = size[1] / 2; + i = -1; + if (k) while (++i < n) { + o = nodes[i]; + o.x += (x - o.x) * k; + o.y += (y - o.y) * k; + } + } + if (charge) { + d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); + i = -1; + while (++i < n) { + if (!(o = nodes[i]).fixed) { + q.visit(repulse(o)); + } + } + } + i = -1; + while (++i < n) { + o = nodes[i]; + if (o.fixed) { + o.x = o.px; + o.y = o.py; + } else { + o.x -= (o.px - (o.px = o.x)) * friction; + o.y -= (o.py - (o.py = o.y)) * friction; + } + } + event.tick({ + type: "tick", + alpha: alpha + }); + }; + force.nodes = function(x) { + if (!arguments.length) return nodes; + nodes = x; + return force; + }; + force.links = function(x) { + if (!arguments.length) return links; + links = x; + return force; + }; + force.size = function(x) { + if (!arguments.length) return size; + size = x; + return force; + }; + force.linkDistance = function(x) { + if (!arguments.length) return linkDistance; + linkDistance = typeof x === "function" ? x : +x; + return force; + }; + force.distance = force.linkDistance; + force.linkStrength = function(x) { + if (!arguments.length) return linkStrength; + linkStrength = typeof x === "function" ? x : +x; + return force; + }; + force.friction = function(x) { + if (!arguments.length) return friction; + friction = +x; + return force; + }; + force.charge = function(x) { + if (!arguments.length) return charge; + charge = typeof x === "function" ? x : +x; + return force; + }; + force.chargeDistance = function(x) { + if (!arguments.length) return Math.sqrt(chargeDistance2); + chargeDistance2 = x * x; + return force; + }; + force.gravity = function(x) { + if (!arguments.length) return gravity; + gravity = +x; + return force; + }; + force.theta = function(x) { + if (!arguments.length) return Math.sqrt(theta2); + theta2 = x * x; + return force; + }; + force.alpha = function(x) { + if (!arguments.length) return alpha; + x = +x; + if (alpha) { + if (x > 0) { + alpha = x; + } else { + timer.c = null, timer.t = NaN, timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + } + } else if (x > 0) { + event.start({ + type: "start", + alpha: alpha = x + }); + timer = d3_timer(force.tick); + } + return force; + }; + force.start = function() { + var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; + for (i = 0; i < n; ++i) { + (o = nodes[i]).index = i; + o.weight = 0; + } + for (i = 0; i < m; ++i) { + o = links[i]; + if (typeof o.source == "number") o.source = nodes[o.source]; + if (typeof o.target == "number") o.target = nodes[o.target]; + ++o.source.weight; + ++o.target.weight; + } + for (i = 0; i < n; ++i) { + o = nodes[i]; + if (isNaN(o.x)) o.x = position("x", w); + if (isNaN(o.y)) o.y = position("y", h); + if (isNaN(o.px)) o.px = o.x; + if (isNaN(o.py)) o.py = o.y; + } + distances = []; + if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance; + strengths = []; + if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength; + charges = []; + if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge; + function position(dimension, size) { + if (!neighbors) { + neighbors = new Array(n); + for (j = 0; j < n; ++j) { + neighbors[j] = []; + } + for (j = 0; j < m; ++j) { + var o = links[j]; + neighbors[o.source.index].push(o.target); + neighbors[o.target.index].push(o.source); + } + } + var candidates = neighbors[i], j = -1, l = candidates.length, x; + while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x; + return Math.random() * size; + } + return force.resume(); + }; + force.resume = function() { + return force.alpha(.1); + }; + force.stop = function() { + return force.alpha(0); + }; + force.drag = function() { + if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend); + if (!arguments.length) return drag; + this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); + }; + function dragmove(d) { + d.px = d3.event.x, d.py = d3.event.y; + force.resume(); + } + return d3.rebind(force, event, "on"); + }; + function d3_layout_forceDragstart(d) { + d.fixed |= 2; + } + function d3_layout_forceDragend(d) { + d.fixed &= ~6; + } + function d3_layout_forceMouseover(d) { + d.fixed |= 4; + d.px = d.x, d.py = d.y; + } + function d3_layout_forceMouseout(d) { + d.fixed &= ~4; + } + function d3_layout_forceAccumulate(quad, alpha, charges) { + var cx = 0, cy = 0; + quad.charge = 0; + if (!quad.leaf) { + var nodes = quad.nodes, n = nodes.length, i = -1, c; + while (++i < n) { + c = nodes[i]; + if (c == null) continue; + d3_layout_forceAccumulate(c, alpha, charges); + quad.charge += c.charge; + cx += c.charge * c.cx; + cy += c.charge * c.cy; + } + } + if (quad.point) { + if (!quad.leaf) { + quad.point.x += Math.random() - .5; + quad.point.y += Math.random() - .5; + } + var k = alpha * charges[quad.point.index]; + quad.charge += quad.pointCharge = k; + cx += k * quad.point.x; + cy += k * quad.point.y; + } + quad.cx = cx / quad.charge; + quad.cy = cy / quad.charge; + } + var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity; + d3.layout.hierarchy = function() { + var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; + function hierarchy(root) { + var stack = [ root ], nodes = [], node; + root.depth = 0; + while ((node = stack.pop()) != null) { + nodes.push(node); + if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) { + var n, childs, child; + while (--n >= 0) { + stack.push(child = childs[n]); + child.parent = node; + child.depth = node.depth + 1; + } + if (value) node.value = 0; + node.children = childs; + } else { + if (value) node.value = +value.call(hierarchy, node, node.depth) || 0; + delete node.children; + } + } + d3_layout_hierarchyVisitAfter(root, function(node) { + var childs, parent; + if (sort && (childs = node.children)) childs.sort(sort); + if (value && (parent = node.parent)) parent.value += node.value; + }); + return nodes; + } + hierarchy.sort = function(x) { + if (!arguments.length) return sort; + sort = x; + return hierarchy; + }; + hierarchy.children = function(x) { + if (!arguments.length) return children; + children = x; + return hierarchy; + }; + hierarchy.value = function(x) { + if (!arguments.length) return value; + value = x; + return hierarchy; + }; + hierarchy.revalue = function(root) { + if (value) { + d3_layout_hierarchyVisitBefore(root, function(node) { + if (node.children) node.value = 0; + }); + d3_layout_hierarchyVisitAfter(root, function(node) { + var parent; + if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0; + if (parent = node.parent) parent.value += node.value; + }); + } + return root; + }; + return hierarchy; + }; + function d3_layout_hierarchyRebind(object, hierarchy) { + d3.rebind(object, hierarchy, "sort", "children", "value"); + object.nodes = object; + object.links = d3_layout_hierarchyLinks; + return object; + } + function d3_layout_hierarchyVisitBefore(node, callback) { + var nodes = [ node ]; + while ((node = nodes.pop()) != null) { + callback(node); + if ((children = node.children) && (n = children.length)) { + var n, children; + while (--n >= 0) nodes.push(children[n]); + } + } + } + function d3_layout_hierarchyVisitAfter(node, callback) { + var nodes = [ node ], nodes2 = []; + while ((node = nodes.pop()) != null) { + nodes2.push(node); + if ((children = node.children) && (n = children.length)) { + var i = -1, n, children; + while (++i < n) nodes.push(children[i]); + } + } + while ((node = nodes2.pop()) != null) { + callback(node); + } + } + function d3_layout_hierarchyChildren(d) { + return d.children; + } + function d3_layout_hierarchyValue(d) { + return d.value; + } + function d3_layout_hierarchySort(a, b) { + return b.value - a.value; + } + function d3_layout_hierarchyLinks(nodes) { + return d3.merge(nodes.map(function(parent) { + return (parent.children || []).map(function(child) { + return { + source: parent, + target: child + }; + }); + })); + } + d3.layout.partition = function() { + var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; + function position(node, x, dx, dy) { + var children = node.children; + node.x = x; + node.y = node.depth * dy; + node.dx = dx; + node.dy = dy; + if (children && (n = children.length)) { + var i = -1, n, c, d; + dx = node.value ? dx / node.value : 0; + while (++i < n) { + position(c = children[i], x, d = c.value * dx, dy); + x += d; + } + } + } + function depth(node) { + var children = node.children, d = 0; + if (children && (n = children.length)) { + var i = -1, n; + while (++i < n) d = Math.max(d, depth(children[i])); + } + return 1 + d; + } + function partition(d, i) { + var nodes = hierarchy.call(this, d, i); + position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); + return nodes; + } + partition.size = function(x) { + if (!arguments.length) return size; + size = x; + return partition; + }; + return d3_layout_hierarchyRebind(partition, hierarchy); + }; + d3.layout.pie = function() { + var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0; + function pie(data) { + var n = data.length, values = data.map(function(d, i) { + return +value.call(pie, d, i); + }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v; + if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { + return values[j] - values[i]; + } : function(i, j) { + return sort(data[i], data[j]); + }); + index.forEach(function(i) { + arcs[i] = { + data: data[i], + value: v = values[i], + startAngle: a, + endAngle: a += v * k + pa, + padAngle: p + }; + }); + return arcs; + } + pie.value = function(_) { + if (!arguments.length) return value; + value = _; + return pie; + }; + pie.sort = function(_) { + if (!arguments.length) return sort; + sort = _; + return pie; + }; + pie.startAngle = function(_) { + if (!arguments.length) return startAngle; + startAngle = _; + return pie; + }; + pie.endAngle = function(_) { + if (!arguments.length) return endAngle; + endAngle = _; + return pie; + }; + pie.padAngle = function(_) { + if (!arguments.length) return padAngle; + padAngle = _; + return pie; + }; + return pie; + }; + var d3_layout_pieSortByValue = {}; + d3.layout.stack = function() { + var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; + function stack(data, index) { + if (!(n = data.length)) return data; + var series = data.map(function(d, i) { + return values.call(stack, d, i); + }); + var points = series.map(function(d) { + return d.map(function(v, i) { + return [ x.call(stack, v, i), y.call(stack, v, i) ]; + }); + }); + var orders = order.call(stack, points, index); + series = d3.permute(series, orders); + points = d3.permute(points, orders); + var offsets = offset.call(stack, points, index); + var m = series[0].length, n, i, j, o; + for (j = 0; j < m; ++j) { + out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); + for (i = 1; i < n; ++i) { + out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); + } + } + return data; + } + stack.values = function(x) { + if (!arguments.length) return values; + values = x; + return stack; + }; + stack.order = function(x) { + if (!arguments.length) return order; + order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; + return stack; + }; + stack.offset = function(x) { + if (!arguments.length) return offset; + offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; + return stack; + }; + stack.x = function(z) { + if (!arguments.length) return x; + x = z; + return stack; + }; + stack.y = function(z) { + if (!arguments.length) return y; + y = z; + return stack; + }; + stack.out = function(z) { + if (!arguments.length) return out; + out = z; + return stack; + }; + return stack; + }; + function d3_layout_stackX(d) { + return d.x; + } + function d3_layout_stackY(d) { + return d.y; + } + function d3_layout_stackOut(d, y0, y) { + d.y0 = y0; + d.y = y; + } + var d3_layout_stackOrders = d3.map({ + "inside-out": function(data) { + var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { + return max[a] - max[b]; + }), top = 0, bottom = 0, tops = [], bottoms = []; + for (i = 0; i < n; ++i) { + j = index[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + return bottoms.reverse().concat(tops); + }, + reverse: function(data) { + return d3.range(data.length).reverse(); + }, + "default": d3_layout_stackOrderDefault + }); + var d3_layout_stackOffsets = d3.map({ + silhouette: function(data) { + var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o > max) max = o; + sums.push(o); + } + for (j = 0; j < m; ++j) { + y0[j] = (max - sums[j]) / 2; + } + return y0; + }, + wiggle: function(data) { + var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; + y0[0] = o = o0 = 0; + for (j = 1; j < m; ++j) { + for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; + for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { + for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { + s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; + } + s2 += s3 * data[i][j][1]; + } + y0[j] = o -= s1 ? s2 / s1 * dx : 0; + if (o < o0) o0 = o; + } + for (j = 0; j < m; ++j) y0[j] -= o0; + return y0; + }, + expand: function(data) { + var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; + } + for (j = 0; j < m; ++j) y0[j] = 0; + return y0; + }, + zero: d3_layout_stackOffsetZero + }); + function d3_layout_stackOrderDefault(data) { + return d3.range(data.length); + } + function d3_layout_stackOffsetZero(data) { + var j = -1, m = data[0].length, y0 = []; + while (++j < m) y0[j] = 0; + return y0; + } + function d3_layout_stackMaxIndex(array) { + var i = 1, j = 0, v = array[0][1], k, n = array.length; + for (;i < n; ++i) { + if ((k = array[i][1]) > v) { + j = i; + v = k; + } + } + return j; + } + function d3_layout_stackReduceSum(d) { + return d.reduce(d3_layout_stackSum, 0); + } + function d3_layout_stackSum(p, d) { + return p + d[1]; + } + d3.layout.histogram = function() { + var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; + function histogram(data, i) { + var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; + while (++i < m) { + bin = bins[i] = []; + bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); + bin.y = 0; + } + if (m > 0) { + i = -1; + while (++i < n) { + x = values[i]; + if (x >= range[0] && x <= range[1]) { + bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; + bin.y += k; + bin.push(data[i]); + } + } + } + return bins; + } + histogram.value = function(x) { + if (!arguments.length) return valuer; + valuer = x; + return histogram; + }; + histogram.range = function(x) { + if (!arguments.length) return ranger; + ranger = d3_functor(x); + return histogram; + }; + histogram.bins = function(x) { + if (!arguments.length) return binner; + binner = typeof x === "number" ? function(range) { + return d3_layout_histogramBinFixed(range, x); + } : d3_functor(x); + return histogram; + }; + histogram.frequency = function(x) { + if (!arguments.length) return frequency; + frequency = !!x; + return histogram; + }; + return histogram; + }; + function d3_layout_histogramBinSturges(range, values) { + return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); + } + function d3_layout_histogramBinFixed(range, n) { + var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; + while (++x <= n) f[x] = m * x + b; + return f; + } + function d3_layout_histogramRange(values) { + return [ d3.min(values), d3.max(values) ]; + } + d3.layout.pack = function() { + var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius; + function pack(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() { + return radius; + }; + root.x = root.y = 0; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r = +r(d.value); + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + if (padding) { + var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r += dr; + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r -= dr; + }); + } + d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h)); + return nodes; + } + pack.size = function(_) { + if (!arguments.length) return size; + size = _; + return pack; + }; + pack.radius = function(_) { + if (!arguments.length) return radius; + radius = _ == null || typeof _ === "function" ? _ : +_; + return pack; + }; + pack.padding = function(_) { + if (!arguments.length) return padding; + padding = +_; + return pack; + }; + return d3_layout_hierarchyRebind(pack, hierarchy); + }; + function d3_layout_packSort(a, b) { + return a.value - b.value; + } + function d3_layout_packInsert(a, b) { + var c = a._pack_next; + a._pack_next = b; + b._pack_prev = a; + b._pack_next = c; + c._pack_prev = b; + } + function d3_layout_packSplice(a, b) { + a._pack_next = b; + b._pack_prev = a; + } + function d3_layout_packIntersects(a, b) { + var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; + return .999 * dr * dr > dx * dx + dy * dy; + } + function d3_layout_packSiblings(node) { + if (!(nodes = node.children) || !(n = nodes.length)) return; + var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; + function bound(node) { + xMin = Math.min(node.x - node.r, xMin); + xMax = Math.max(node.x + node.r, xMax); + yMin = Math.min(node.y - node.r, yMin); + yMax = Math.max(node.y + node.r, yMax); + } + nodes.forEach(d3_layout_packLink); + a = nodes[0]; + a.x = -a.r; + a.y = 0; + bound(a); + if (n > 1) { + b = nodes[1]; + b.x = b.r; + b.y = 0; + bound(b); + if (n > 2) { + c = nodes[2]; + d3_layout_packPlace(a, b, c); + bound(c); + d3_layout_packInsert(a, c); + a._pack_prev = c; + d3_layout_packInsert(c, b); + b = a._pack_next; + for (i = 3; i < n; i++) { + d3_layout_packPlace(a, b, c = nodes[i]); + var isect = 0, s1 = 1, s2 = 1; + for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { + if (d3_layout_packIntersects(j, c)) { + isect = 1; + break; + } + } + if (isect == 1) { + for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { + if (d3_layout_packIntersects(k, c)) { + break; + } + } + } + if (isect) { + if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); + i--; + } else { + d3_layout_packInsert(a, c); + b = c; + bound(c); + } + } + } + } + var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; + for (i = 0; i < n; i++) { + c = nodes[i]; + c.x -= cx; + c.y -= cy; + cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); + } + node.r = cr; + nodes.forEach(d3_layout_packUnlink); + } + function d3_layout_packLink(node) { + node._pack_next = node._pack_prev = node; + } + function d3_layout_packUnlink(node) { + delete node._pack_next; + delete node._pack_prev; + } + function d3_layout_packTransform(node, x, y, k) { + var children = node.children; + node.x = x += k * node.x; + node.y = y += k * node.y; + node.r *= k; + if (children) { + var i = -1, n = children.length; + while (++i < n) d3_layout_packTransform(children[i], x, y, k); + } + } + function d3_layout_packPlace(a, b, c) { + var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; + if (db && (dx || dy)) { + var da = b.r + c.r, dc = dx * dx + dy * dy; + da *= da; + db *= db; + var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = a.x + x * dx + y * dy; + c.y = a.y + x * dy - y * dx; + } else { + c.x = a.x + db; + c.y = a.y; + } + } + d3.layout.tree = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null; + function tree(d, i) { + var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0); + d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z; + d3_layout_hierarchyVisitBefore(root1, secondWalk); + if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else { + var left = root0, right = root0, bottom = root0; + d3_layout_hierarchyVisitBefore(root0, function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1); + d3_layout_hierarchyVisitBefore(root0, function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + return nodes; + } + function wrapTree(root0) { + var root1 = { + A: null, + children: [ root0 ] + }, queue = [ root1 ], node1; + while ((node1 = queue.pop()) != null) { + for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) { + queue.push((children[i] = child = { + _: children[i], + parent: node1, + children: (child = children[i].children) && child.slice() || [], + A: null, + a: null, + z: 0, + m: 0, + c: 0, + s: 0, + t: null, + i: i + }).a = child); + } + } + return root1.children[0]; + } + function firstWalk(v) { + var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null; + if (children.length) { + d3_layout_treeShift(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + function apportion(v, w, ancestor) { + if (w) { + var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift; + while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { + vom = d3_layout_treeLeft(vom); + vop = d3_layout_treeRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !d3_layout_treeRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !d3_layout_treeLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + function sizeNode(node) { + node.x *= size[0]; + node.y = node.depth * size[1]; + } + tree.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return tree; + }; + tree.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null ? sizeNode : null; + return tree; + }; + tree.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) == null ? null : sizeNode; + return tree; + }; + return d3_layout_hierarchyRebind(tree, hierarchy); + }; + function d3_layout_treeSeparation(a, b) { + return a.parent == b.parent ? 1 : 2; + } + function d3_layout_treeLeft(v) { + var children = v.children; + return children.length ? children[0] : v.t; + } + function d3_layout_treeRight(v) { + var children = v.children, n; + return (n = children.length) ? children[n - 1] : v.t; + } + function d3_layout_treeMove(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + function d3_layout_treeShift(v) { + var shift = 0, change = 0, children = v.children, i = children.length, w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + function d3_layout_treeAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + d3.layout.cluster = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; + function cluster(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; + d3_layout_hierarchyVisitAfter(root, function(node) { + var children = node.children; + if (children && children.length) { + node.x = d3_layout_clusterX(children); + node.y = d3_layout_clusterY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; + d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) { + node.x = (node.x - root.x) * size[0]; + node.y = (root.y - node.y) * size[1]; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * size[0]; + node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; + }); + return nodes; + } + cluster.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return cluster; + }; + cluster.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null; + return cluster; + }; + cluster.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) != null; + return cluster; + }; + return d3_layout_hierarchyRebind(cluster, hierarchy); + }; + function d3_layout_clusterY(children) { + return 1 + d3.max(children, function(child) { + return child.y; + }); + } + function d3_layout_clusterX(children) { + return children.reduce(function(x, child) { + return x + child.x; + }, 0) / children.length; + } + function d3_layout_clusterLeft(node) { + var children = node.children; + return children && children.length ? d3_layout_clusterLeft(children[0]) : node; + } + function d3_layout_clusterRight(node) { + var children = node.children, n; + return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; + } + d3.layout.treemap = function() { + var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); + function scale(children, k) { + var i = -1, n = children.length, child, area; + while (++i < n) { + area = (child = children[i]).value * (k < 0 ? 0 : k); + child.area = isNaN(area) || area <= 0 ? 0 : area; + } + } + function squarify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while ((n = remaining.length) > 0) { + row.push(child = remaining[n - 1]); + row.area += child.area; + if (mode !== "squarify" || (score = worst(row, u)) <= best) { + remaining.pop(); + best = score; + } else { + row.area -= row.pop().area; + position(row, u, rect, false); + u = Math.min(rect.dx, rect.dy); + row.length = row.area = 0; + best = Infinity; + } + } + if (row.length) { + position(row, u, rect, true); + row.length = row.area = 0; + } + children.forEach(squarify); + } + } + function stickify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), remaining = children.slice(), child, row = []; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while (child = remaining.pop()) { + row.push(child); + row.area += child.area; + if (child.z != null) { + position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); + row.length = row.area = 0; + } + } + children.forEach(stickify); + } + } + function worst(row, u) { + var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; + while (++i < n) { + if (!(r = row[i].area)) continue; + if (r < rmin) rmin = r; + if (r > rmax) rmax = r; + } + s *= s; + u *= u; + return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; + } + function position(row, u, rect, flush) { + var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; + if (u == rect.dx) { + if (flush || v > rect.dy) v = rect.dy; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dy = v; + x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); + } + o.z = true; + o.dx += rect.x + rect.dx - x; + rect.y += v; + rect.dy -= v; + } else { + if (flush || v > rect.dx) v = rect.dx; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dx = v; + y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); + } + o.z = false; + o.dy += rect.y + rect.dy - y; + rect.x += v; + rect.dx -= v; + } + } + function treemap(d) { + var nodes = stickies || hierarchy(d), root = nodes[0]; + root.x = root.y = 0; + if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0; + if (stickies) hierarchy.revalue(root); + scale([ root ], root.dx * root.dy / root.value); + (stickies ? stickify : squarify)(root); + if (sticky) stickies = nodes; + return nodes; + } + treemap.size = function(x) { + if (!arguments.length) return size; + size = x; + return treemap; + }; + treemap.padding = function(x) { + if (!arguments.length) return padding; + function padFunction(node) { + var p = x.call(treemap, node, node.depth); + return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); + } + function padConstant(node) { + return d3_layout_treemapPad(node, x); + } + var type; + pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], + padConstant) : padConstant; + return treemap; + }; + treemap.round = function(x) { + if (!arguments.length) return round != Number; + round = x ? Math.round : Number; + return treemap; + }; + treemap.sticky = function(x) { + if (!arguments.length) return sticky; + sticky = x; + stickies = null; + return treemap; + }; + treemap.ratio = function(x) { + if (!arguments.length) return ratio; + ratio = x; + return treemap; + }; + treemap.mode = function(x) { + if (!arguments.length) return mode; + mode = x + ""; + return treemap; + }; + return d3_layout_hierarchyRebind(treemap, hierarchy); + }; + function d3_layout_treemapPadNull(node) { + return { + x: node.x, + y: node.y, + dx: node.dx, + dy: node.dy + }; + } + function d3_layout_treemapPad(node, padding) { + var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; + if (dx < 0) { + x += dx / 2; + dx = 0; + } + if (dy < 0) { + y += dy / 2; + dy = 0; + } + return { + x: x, + y: y, + dx: dx, + dy: dy + }; + } + d3.random = { + normal: function(µ, σ) { + var n = arguments.length; + if (n < 2) σ = 1; + if (n < 1) µ = 0; + return function() { + var x, y, r; + do { + x = Math.random() * 2 - 1; + y = Math.random() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); + }; + }, + logNormal: function() { + var random = d3.random.normal.apply(d3, arguments); + return function() { + return Math.exp(random()); + }; + }, + bates: function(m) { + var random = d3.random.irwinHall(m); + return function() { + return random() / m; + }; + }, + irwinHall: function(m) { + return function() { + for (var s = 0, j = 0; j < m; j++) s += Math.random(); + return s; + }; + } + }; + d3.scale = {}; + function d3_scaleExtent(domain) { + var start = domain[0], stop = domain[domain.length - 1]; + return start < stop ? [ start, stop ] : [ stop, start ]; + } + function d3_scaleRange(scale) { + return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); + } + function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { + var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); + return function(x) { + return i(u(x)); + }; + } + function d3_scale_nice(domain, nice) { + var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; + if (x1 < x0) { + dx = i0, i0 = i1, i1 = dx; + dx = x0, x0 = x1, x1 = dx; + } + domain[i0] = nice.floor(x0); + domain[i1] = nice.ceil(x1); + return domain; + } + function d3_scale_niceStep(step) { + return step ? { + floor: function(x) { + return Math.floor(x / step) * step; + }, + ceil: function(x) { + return Math.ceil(x / step) * step; + } + } : d3_scale_niceIdentity; + } + var d3_scale_niceIdentity = { + floor: d3_identity, + ceil: d3_identity + }; + function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { + var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; + if (domain[k] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + while (++j <= k) { + u.push(uninterpolate(domain[j - 1], domain[j])); + i.push(interpolate(range[j - 1], range[j])); + } + return function(x) { + var j = d3.bisect(domain, x, 1, k) - 1; + return i[j](u[j](x)); + }; + } + d3.scale.linear = function() { + return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false); + }; + function d3_scale_linear(domain, range, interpolate, clamp) { + var output, input; + function rescale() { + var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; + output = linear(domain, range, uninterpolate, interpolate); + input = linear(range, domain, uninterpolate, d3_interpolate); + return scale; + } + function scale(x) { + return output(x); + } + scale.invert = function(y) { + return input(y); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(Number); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.rangeRound = function(x) { + return scale.range(x).interpolate(d3_interpolateRound); + }; + scale.clamp = function(x) { + if (!arguments.length) return clamp; + clamp = x; + return rescale(); + }; + scale.interpolate = function(x) { + if (!arguments.length) return interpolate; + interpolate = x; + return rescale(); + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + d3_scale_linearNice(domain, m); + return rescale(); + }; + scale.copy = function() { + return d3_scale_linear(domain, range, interpolate, clamp); + }; + return rescale(); + } + function d3_scale_linearRebind(scale, linear) { + return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); + } + function d3_scale_linearNice(domain, m) { + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + return domain; + } + function d3_scale_linearTickRange(domain, m) { + if (m == null) m = 10; + var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; + if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; + extent[0] = Math.ceil(extent[0] / step) * step; + extent[1] = Math.floor(extent[1] / step) * step + step * .5; + extent[2] = step; + return extent; + } + function d3_scale_linearTicks(domain, m) { + return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); + } + function d3_scale_linearTickFormat(domain, m, format) { + var range = d3_scale_linearTickRange(domain, m); + if (format) { + var match = d3_format_re.exec(format); + match.shift(); + if (match[8] === "s") { + var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1]))); + if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2])); + match[8] = "f"; + format = d3.format(match.join("")); + return function(d) { + return format(prefix.scale(d)) + prefix.symbol; + }; + } + if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range); + format = match.join(""); + } else { + format = ",." + d3_scale_linearPrecision(range[2]) + "f"; + } + return d3.format(format); + } + var d3_scale_linearFormatSignificant = { + s: 1, + g: 1, + p: 1, + r: 1, + e: 1 + }; + function d3_scale_linearPrecision(value) { + return -Math.floor(Math.log(value) / Math.LN10 + .01); + } + function d3_scale_linearFormatPrecision(type, range) { + var p = d3_scale_linearPrecision(range[2]); + return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2; + } + d3.scale.log = function() { + return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]); + }; + function d3_scale_log(linear, base, positive, domain) { + function log(x) { + return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base); + } + function pow(x) { + return positive ? Math.pow(base, x) : -Math.pow(base, -x); + } + function scale(x) { + return linear(log(x)); + } + scale.invert = function(x) { + return pow(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + positive = x[0] >= 0; + linear.domain((domain = x.map(Number)).map(log)); + return scale; + }; + scale.base = function(_) { + if (!arguments.length) return base; + base = +_; + linear.domain(domain.map(log)); + return scale; + }; + scale.nice = function() { + var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative); + linear.domain(niced); + domain = niced.map(pow); + return scale; + }; + scale.ticks = function() { + var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base; + if (isFinite(j - i)) { + if (positive) { + for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k); + ticks.push(pow(i)); + } else { + ticks.push(pow(i)); + for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k); + } + for (i = 0; ticks[i] < u; i++) {} + for (j = ticks.length; ticks[j - 1] > v; j--) {} + ticks = ticks.slice(i, j); + } + return ticks; + }; + scale.tickFormat = function(n, format) { + if (!arguments.length) return d3_scale_logFormat; + if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format); + var k = Math.max(1, base * n / scale.ticks().length); + return function(d) { + var i = d / pow(Math.round(log(d))); + if (i * base < base - .5) i *= base; + return i <= k ? format(d) : ""; + }; + }; + scale.copy = function() { + return d3_scale_log(linear.copy(), base, positive, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = { + floor: function(x) { + return -Math.ceil(-x); + }, + ceil: function(x) { + return -Math.floor(-x); + } + }; + d3.scale.pow = function() { + return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]); + }; + function d3_scale_pow(linear, exponent, domain) { + var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); + function scale(x) { + return linear(powp(x)); + } + scale.invert = function(x) { + return powb(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + linear.domain((domain = x.map(Number)).map(powp)); + return scale; + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + return scale.domain(d3_scale_linearNice(domain, m)); + }; + scale.exponent = function(x) { + if (!arguments.length) return exponent; + powp = d3_scale_powPow(exponent = x); + powb = d3_scale_powPow(1 / exponent); + linear.domain(domain.map(powp)); + return scale; + }; + scale.copy = function() { + return d3_scale_pow(linear.copy(), exponent, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_scale_powPow(e) { + return function(x) { + return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); + }; + } + d3.scale.sqrt = function() { + return d3.scale.pow().exponent(.5); + }; + d3.scale.ordinal = function() { + return d3_scale_ordinal([], { + t: "range", + a: [ [] ] + }); + }; + function d3_scale_ordinal(domain, ranger) { + var index, range, rangeBand; + function scale(x) { + return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length]; + } + function steps(start, step) { + return d3.range(domain.length).map(function(i) { + return start + step * i; + }); + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = []; + index = new d3_Map(); + var i = -1, n = x.length, xi; + while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); + return scale[ranger.t].apply(scale, ranger.a); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + rangeBand = 0; + ranger = { + t: "range", + a: arguments + }; + return scale; + }; + scale.rangePoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, + 0) : (stop - start) / (domain.length - 1 + padding); + range = steps(start + step * padding / 2, step); + rangeBand = 0; + ranger = { + t: "rangePoints", + a: arguments + }; + return scale; + }; + scale.rangeRoundPoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), + 0) : (stop - start) / (domain.length - 1 + padding) | 0; + range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step); + rangeBand = 0; + ranger = { + t: "rangeRoundPoints", + a: arguments + }; + return scale; + }; + scale.rangeBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); + range = steps(start + step * outerPadding, step); + if (reverse) range.reverse(); + rangeBand = step * (1 - padding); + ranger = { + t: "rangeBands", + a: arguments + }; + return scale; + }; + scale.rangeRoundBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)); + range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step); + if (reverse) range.reverse(); + rangeBand = Math.round(step * (1 - padding)); + ranger = { + t: "rangeRoundBands", + a: arguments + }; + return scale; + }; + scale.rangeBand = function() { + return rangeBand; + }; + scale.rangeExtent = function() { + return d3_scaleExtent(ranger.a[0]); + }; + scale.copy = function() { + return d3_scale_ordinal(domain, ranger); + }; + return scale.domain(domain); + } + d3.scale.category10 = function() { + return d3.scale.ordinal().range(d3_category10); + }; + d3.scale.category20 = function() { + return d3.scale.ordinal().range(d3_category20); + }; + d3.scale.category20b = function() { + return d3.scale.ordinal().range(d3_category20b); + }; + d3.scale.category20c = function() { + return d3.scale.ordinal().range(d3_category20c); + }; + var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString); + var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString); + var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString); + var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString); + d3.scale.quantile = function() { + return d3_scale_quantile([], []); + }; + function d3_scale_quantile(domain, range) { + var thresholds; + function rescale() { + var k = 0, q = range.length; + thresholds = []; + while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); + return scale; + } + function scale(x) { + if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)]; + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.quantiles = function() { + return thresholds; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ]; + }; + scale.copy = function() { + return d3_scale_quantile(domain, range); + }; + return rescale(); + } + d3.scale.quantize = function() { + return d3_scale_quantize(0, 1, [ 0, 1 ]); + }; + function d3_scale_quantize(x0, x1, range) { + var kx, i; + function scale(x) { + return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; + } + function rescale() { + kx = range.length / (x1 - x0); + i = range.length - 1; + return scale; + } + scale.domain = function(x) { + if (!arguments.length) return [ x0, x1 ]; + x0 = +x[0]; + x1 = +x[x.length - 1]; + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + y = y < 0 ? NaN : y / kx + x0; + return [ y, y + 1 / kx ]; + }; + scale.copy = function() { + return d3_scale_quantize(x0, x1, range); + }; + return rescale(); + } + d3.scale.threshold = function() { + return d3_scale_threshold([ .5 ], [ 0, 1 ]); + }; + function d3_scale_threshold(domain, range) { + function scale(x) { + if (x <= x) return range[d3.bisect(domain, x)]; + } + scale.domain = function(_) { + if (!arguments.length) return domain; + domain = _; + return scale; + }; + scale.range = function(_) { + if (!arguments.length) return range; + range = _; + return scale; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return [ domain[y - 1], domain[y] ]; + }; + scale.copy = function() { + return d3_scale_threshold(domain, range); + }; + return scale; + } + d3.scale.identity = function() { + return d3_scale_identity([ 0, 1 ]); + }; + function d3_scale_identity(domain) { + function identity(x) { + return +x; + } + identity.invert = identity; + identity.domain = identity.range = function(x) { + if (!arguments.length) return domain; + domain = x.map(identity); + return identity; + }; + identity.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + identity.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + identity.copy = function() { + return d3_scale_identity(domain); + }; + return identity; + } + d3.svg = {}; + function d3_zero() { + return 0; + } + d3.svg.arc = function() { + var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle; + function arc() { + var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1; + if (r1 < r0) rc = r1, r1 = r0, r0 = rc; + if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z"; + var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = []; + if (ap = (+padAngle.apply(this, arguments) || 0) / 2) { + rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments); + if (!cw) p1 *= -1; + if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap)); + if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap)); + } + if (r1) { + x0 = r1 * Math.cos(a0 + p1); + y0 = r1 * Math.sin(a0 + p1); + x1 = r1 * Math.cos(a1 - p1); + y1 = r1 * Math.sin(a1 - p1); + var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1; + if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) { + var h1 = (a0 + a1) / 2; + x0 = r1 * Math.cos(h1); + y0 = r1 * Math.sin(h1); + x1 = y1 = null; + } + } else { + x0 = y0 = 0; + } + if (r0) { + x2 = r0 * Math.cos(a1 - p0); + y2 = r0 * Math.sin(a1 - p0); + x3 = r0 * Math.cos(a0 + p0); + y3 = r0 * Math.sin(a0 + p0); + var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1; + if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) { + var h0 = (a0 + a1) / 2; + x2 = r0 * Math.cos(h0); + y2 = r0 * Math.sin(h0); + x3 = y3 = null; + } + } else { + x2 = y2 = 0; + } + if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) { + cr = r0 < r1 ^ cw ? 0 : 1; + var rc1 = rc, rc0 = rc; + if (da < π) { + var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = Math.min(rc, (r0 - lc) / (kc - 1)); + rc1 = Math.min(rc, (r1 - lc) / (kc + 1)); + } + if (x1 != null) { + var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw); + if (rc === rc1) { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]); + } else { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]); + } + } else { + path.push("M", x0, ",", y0); + } + if (x3 != null) { + var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw); + if (rc === rc0) { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } else { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } + } else { + path.push("L", x2, ",", y2); + } + } else { + path.push("M", x0, ",", y0); + if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1); + path.push("L", x2, ",", y2); + if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3); + } + path.push("Z"); + return path.join(""); + } + function circleSegment(r1, cw) { + return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1; + } + arc.innerRadius = function(v) { + if (!arguments.length) return innerRadius; + innerRadius = d3_functor(v); + return arc; + }; + arc.outerRadius = function(v) { + if (!arguments.length) return outerRadius; + outerRadius = d3_functor(v); + return arc; + }; + arc.cornerRadius = function(v) { + if (!arguments.length) return cornerRadius; + cornerRadius = d3_functor(v); + return arc; + }; + arc.padRadius = function(v) { + if (!arguments.length) return padRadius; + padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v); + return arc; + }; + arc.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return arc; + }; + arc.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return arc; + }; + arc.padAngle = function(v) { + if (!arguments.length) return padAngle; + padAngle = d3_functor(v); + return arc; + }; + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ; + return [ Math.cos(a) * r, Math.sin(a) * r ]; + }; + return arc; + }; + var d3_svg_arcAuto = "auto"; + function d3_svg_arcInnerRadius(d) { + return d.innerRadius; + } + function d3_svg_arcOuterRadius(d) { + return d.outerRadius; + } + function d3_svg_arcStartAngle(d) { + return d.startAngle; + } + function d3_svg_arcEndAngle(d) { + return d.endAngle; + } + function d3_svg_arcPadAngle(d) { + return d && d.padAngle; + } + function d3_svg_arcSweep(x0, y0, x1, y1) { + return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1; + } + function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) { + var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ]; + } + function d3_svg_line(projection) { + var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; + function line(data) { + var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); + function segment() { + segments.push("M", interpolate(projection(points), tension)); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); + } else if (points.length) { + segment(); + points = []; + } + } + if (points.length) segment(); + return segments.length ? segments.join("") : null; + } + line.x = function(_) { + if (!arguments.length) return x; + x = _; + return line; + }; + line.y = function(_) { + if (!arguments.length) return y; + y = _; + return line; + }; + line.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return line; + }; + line.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + return line; + }; + line.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return line; + }; + return line; + } + d3.svg.line = function() { + return d3_svg_line(d3_identity); + }; + var d3_svg_lineInterpolators = d3.map({ + linear: d3_svg_lineLinear, + "linear-closed": d3_svg_lineLinearClosed, + step: d3_svg_lineStep, + "step-before": d3_svg_lineStepBefore, + "step-after": d3_svg_lineStepAfter, + basis: d3_svg_lineBasis, + "basis-open": d3_svg_lineBasisOpen, + "basis-closed": d3_svg_lineBasisClosed, + bundle: d3_svg_lineBundle, + cardinal: d3_svg_lineCardinal, + "cardinal-open": d3_svg_lineCardinalOpen, + "cardinal-closed": d3_svg_lineCardinalClosed, + monotone: d3_svg_lineMonotone + }); + d3_svg_lineInterpolators.forEach(function(key, value) { + value.key = key; + value.closed = /-closed$/.test(key); + }); + function d3_svg_lineLinear(points) { + return points.length > 1 ? points.join("L") : points + "Z"; + } + function d3_svg_lineLinearClosed(points) { + return points.join("L") + "Z"; + } + function d3_svg_lineStep(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]); + if (n > 1) path.push("H", p[0]); + return path.join(""); + } + function d3_svg_lineStepBefore(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); + return path.join(""); + } + function d3_svg_lineStepAfter(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); + return path.join(""); + } + function d3_svg_lineCardinalOpen(points, tension) { + return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineCardinalClosed(points, tension) { + return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), + points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); + } + function d3_svg_lineCardinal(points, tension) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineHermite(points, tangents) { + if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { + return d3_svg_lineLinear(points); + } + var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; + if (quad) { + path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; + p0 = points[1]; + pi = 2; + } + if (tangents.length > 1) { + t = tangents[1]; + p = points[pi]; + pi++; + path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + for (var i = 2; i < tangents.length; i++, pi++) { + p = points[pi]; + t = tangents[i]; + path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + } + } + if (quad) { + var lp = points[pi]; + path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; + } + return path; + } + function d3_svg_lineCardinalTangents(points, tension) { + var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; + while (++i < n) { + p0 = p1; + p1 = p2; + p2 = points[i]; + tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); + } + return tangents; + } + function d3_svg_lineBasis(points) { + if (points.length < 3) return d3_svg_lineLinear(points); + var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + points.push(points[n - 1]); + while (++i <= n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + points.pop(); + path.push("L", pi); + return path.join(""); + } + function d3_svg_lineBasisOpen(points) { + if (points.length < 4) return d3_svg_lineLinear(points); + var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; + while (++i < 3) { + pi = points[i]; + px.push(pi[0]); + py.push(pi[1]); + } + path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); + --i; + while (++i < n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBasisClosed(points) { + var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; + while (++i < 4) { + pi = points[i % n]; + px.push(pi[0]); + py.push(pi[1]); + } + path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + --i; + while (++i < m) { + pi = points[i % n]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBundle(points, tension) { + var n = points.length - 1; + if (n) { + var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; + while (++i <= n) { + p = points[i]; + t = i / n; + p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); + p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + } + } + return d3_svg_lineBasis(points); + } + function d3_svg_lineDot4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + } + var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; + function d3_svg_lineBasisBezier(path, x, y) { + path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); + } + function d3_svg_lineSlope(p0, p1) { + return (p1[1] - p0[1]) / (p1[0] - p0[0]); + } + function d3_svg_lineFiniteDifferences(points) { + var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); + while (++i < j) { + m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; + } + m[i] = d; + return m; + } + function d3_svg_lineMonotoneTangents(points) { + var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; + while (++i < j) { + d = d3_svg_lineSlope(points[i], points[i + 1]); + if (abs(d) < ε) { + m[i] = m[i + 1] = 0; + } else { + a = m[i] / d; + b = m[i + 1] / d; + s = a * a + b * b; + if (s > 9) { + s = d * 3 / Math.sqrt(s); + m[i] = s * a; + m[i + 1] = s * b; + } + } + } + i = -1; + while (++i <= j) { + s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); + tangents.push([ s || 0, m[i] * s || 0 ]); + } + return tangents; + } + function d3_svg_lineMonotone(points) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); + } + d3.svg.line.radial = function() { + var line = d3_svg_line(d3_svg_lineRadial); + line.radius = line.x, delete line.x; + line.angle = line.y, delete line.y; + return line; + }; + function d3_svg_lineRadial(points) { + var point, i = -1, n = points.length, r, a; + while (++i < n) { + point = points[i]; + r = point[0]; + a = point[1] - halfπ; + point[0] = r * Math.cos(a); + point[1] = r * Math.sin(a); + } + return points; + } + function d3_svg_area(projection) { + var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; + function area(data) { + var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { + return x; + } : d3_functor(x1), fy1 = y0 === y1 ? function() { + return y; + } : d3_functor(y1), x, y; + function segment() { + segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); + points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); + } else if (points0.length) { + segment(); + points0 = []; + points1 = []; + } + } + if (points0.length) segment(); + return segments.length ? segments.join("") : null; + } + area.x = function(_) { + if (!arguments.length) return x1; + x0 = x1 = _; + return area; + }; + area.x0 = function(_) { + if (!arguments.length) return x0; + x0 = _; + return area; + }; + area.x1 = function(_) { + if (!arguments.length) return x1; + x1 = _; + return area; + }; + area.y = function(_) { + if (!arguments.length) return y1; + y0 = y1 = _; + return area; + }; + area.y0 = function(_) { + if (!arguments.length) return y0; + y0 = _; + return area; + }; + area.y1 = function(_) { + if (!arguments.length) return y1; + y1 = _; + return area; + }; + area.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return area; + }; + area.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + interpolateReverse = interpolate.reverse || interpolate; + L = interpolate.closed ? "M" : "L"; + return area; + }; + area.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return area; + }; + return area; + } + d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; + d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; + d3.svg.area = function() { + return d3_svg_area(d3_identity); + }; + d3.svg.area.radial = function() { + var area = d3_svg_area(d3_svg_lineRadial); + area.radius = area.x, delete area.x; + area.innerRadius = area.x0, delete area.x0; + area.outerRadius = area.x1, delete area.x1; + area.angle = area.y, delete area.y; + area.startAngle = area.y0, delete area.y0; + area.endAngle = area.y1, delete area.y1; + return area; + }; + d3.svg.chord = function() { + var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; + function chord(d, i) { + var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); + return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; + } + function subgroup(self, f, d, i) { + var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ; + return { + r: r, + a0: a0, + a1: a1, + p0: [ r * Math.cos(a0), r * Math.sin(a0) ], + p1: [ r * Math.cos(a1), r * Math.sin(a1) ] + }; + } + function equals(a, b) { + return a.a0 == b.a0 && a.a1 == b.a1; + } + function arc(r, p, a) { + return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; + } + function curve(r0, p0, r1, p1) { + return "Q 0,0 " + p1; + } + chord.radius = function(v) { + if (!arguments.length) return radius; + radius = d3_functor(v); + return chord; + }; + chord.source = function(v) { + if (!arguments.length) return source; + source = d3_functor(v); + return chord; + }; + chord.target = function(v) { + if (!arguments.length) return target; + target = d3_functor(v); + return chord; + }; + chord.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return chord; + }; + chord.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return chord; + }; + return chord; + }; + function d3_svg_chordRadius(d) { + return d.radius; + } + d3.svg.diagonal = function() { + var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; + function diagonal(d, i) { + var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { + x: p0.x, + y: m + }, { + x: p3.x, + y: m + }, p3 ]; + p = p.map(projection); + return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; + } + diagonal.source = function(x) { + if (!arguments.length) return source; + source = d3_functor(x); + return diagonal; + }; + diagonal.target = function(x) { + if (!arguments.length) return target; + target = d3_functor(x); + return diagonal; + }; + diagonal.projection = function(x) { + if (!arguments.length) return projection; + projection = x; + return diagonal; + }; + return diagonal; + }; + function d3_svg_diagonalProjection(d) { + return [ d.x, d.y ]; + } + d3.svg.diagonal.radial = function() { + var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; + diagonal.projection = function(x) { + return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; + }; + return diagonal; + }; + function d3_svg_diagonalRadialProjection(projection) { + return function() { + var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ; + return [ r * Math.cos(a), r * Math.sin(a) ]; + }; + } + d3.svg.symbol = function() { + var type = d3_svg_symbolType, size = d3_svg_symbolSize; + function symbol(d, i) { + return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); + } + symbol.type = function(x) { + if (!arguments.length) return type; + type = d3_functor(x); + return symbol; + }; + symbol.size = function(x) { + if (!arguments.length) return size; + size = d3_functor(x); + return symbol; + }; + return symbol; + }; + function d3_svg_symbolSize() { + return 64; + } + function d3_svg_symbolType() { + return "circle"; + } + function d3_svg_symbolCircle(size) { + var r = Math.sqrt(size / π); + return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; + } + var d3_svg_symbols = d3.map({ + circle: d3_svg_symbolCircle, + cross: function(size) { + var r = Math.sqrt(size / 5) / 2; + return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; + }, + diamond: function(size) { + var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; + return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; + }, + square: function(size) { + var r = Math.sqrt(size) / 2; + return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; + }, + "triangle-down": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; + }, + "triangle-up": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; + } + }); + d3.svg.symbolTypes = d3_svg_symbols.keys(); + var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); + d3_selectionPrototype.transition = function(name) { + var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || { + time: Date.now(), + ease: d3_ease_cubicInOut, + delay: 0, + duration: 250 + }; + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) d3_transitionNode(node, i, ns, id, transition); + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id); + }; + d3_selectionPrototype.interrupt = function(name) { + return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name))); + }; + var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace()); + function d3_selection_interruptNS(ns) { + return function() { + var lock, activeId, active; + if ((lock = this[ns]) && (active = lock[activeId = lock.active])) { + active.timer.c = null; + active.timer.t = NaN; + if (--lock.count) delete lock[activeId]; else delete this[ns]; + lock.active += .5; + active.event && active.event.interrupt.call(this, this.__data__, active.index); + } + }; + } + function d3_transition(groups, ns, id) { + d3_subclass(groups, d3_transitionPrototype); + groups.namespace = ns; + groups.id = id; + return groups; + } + var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit; + d3_transitionPrototype.call = d3_selectionPrototype.call; + d3_transitionPrototype.empty = d3_selectionPrototype.empty; + d3_transitionPrototype.node = d3_selectionPrototype.node; + d3_transitionPrototype.size = d3_selectionPrototype.size; + d3.transition = function(selection, name) { + return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection); + }; + d3.transition.prototype = d3_transitionPrototype; + d3_transitionPrototype.select = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + d3_transitionNode(subnode, i, ns, id, node[ns][id]); + subgroup.push(subnode); + } else { + subgroup.push(null); + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.selectAll = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + transition = node[ns][id]; + subnodes = selector.call(node, node.__data__, i, j); + subgroups.push(subgroup = []); + for (var k = -1, o = subnodes.length; ++k < o; ) { + if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition); + subgroup.push(subnode); + } + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_transition(subgroups, this.namespace, this.id); + }; + d3_transitionPrototype.tween = function(name, tween) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) return this.node()[ns][id].tween.get(name); + return d3_selection_each(this, tween == null ? function(node) { + node[ns][id].tween.remove(name); + } : function(node) { + node[ns][id].tween.set(name, tween); + }); + }; + function d3_transition_tween(groups, name, value, tween) { + var id = groups.id, ns = groups.namespace; + return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { + node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j))); + } : (value = tween(value), function(node) { + node[ns][id].tween.set(name, value); + })); + } + d3_transitionPrototype.attr = function(nameNS, value) { + if (arguments.length < 2) { + for (value in nameNS) this.attr(value, nameNS[value]); + return this; + } + var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrTween(b) { + return b == null ? attrNull : (b += "", function() { + var a = this.getAttribute(name), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttribute(name, i(t)); + }); + }); + } + function attrTweenNS(b) { + return b == null ? attrNullNS : (b += "", function() { + var a = this.getAttributeNS(name.space, name.local), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttributeNS(name.space, name.local, i(t)); + }); + }); + } + return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.attrTween = function(nameNS, tween) { + var name = d3.ns.qualify(nameNS); + function attrTween(d, i) { + var f = tween.call(this, d, i, this.getAttribute(name)); + return f && function(t) { + this.setAttribute(name, f(t)); + }; + } + function attrTweenNS(d, i) { + var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); + return f && function(t) { + this.setAttributeNS(name.space, name.local, f(t)); + }; + } + return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.style(priority, name[priority], value); + return this; + } + priority = ""; + } + function styleNull() { + this.style.removeProperty(name); + } + function styleString(b) { + return b == null ? styleNull : (b += "", function() { + var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i; + return a !== b && (i = d3_interpolate(a, b), function(t) { + this.style.setProperty(name, i(t), priority); + }); + }); + } + return d3_transition_tween(this, "style." + name, value, styleString); + }; + d3_transitionPrototype.styleTween = function(name, tween, priority) { + if (arguments.length < 3) priority = ""; + function styleTween(d, i) { + var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name)); + return f && function(t) { + this.style.setProperty(name, f(t), priority); + }; + } + return this.tween("style." + name, styleTween); + }; + d3_transitionPrototype.text = function(value) { + return d3_transition_tween(this, "text", value, d3_transition_text); + }; + function d3_transition_text(b) { + if (b == null) b = ""; + return function() { + this.textContent = b; + }; + } + d3_transitionPrototype.remove = function() { + var ns = this.namespace; + return this.each("end.transition", function() { + var p; + if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this); + }); + }; + d3_transitionPrototype.ease = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].ease; + if (typeof value !== "function") value = d3.ease.apply(d3, arguments); + return d3_selection_each(this, function(node) { + node[ns][id].ease = value; + }); + }; + d3_transitionPrototype.delay = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].delay; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].delay = +value.call(node, node.__data__, i, j); + } : (value = +value, function(node) { + node[ns][id].delay = value; + })); + }; + d3_transitionPrototype.duration = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].duration; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j)); + } : (value = Math.max(1, value), function(node) { + node[ns][id].duration = value; + })); + }; + d3_transitionPrototype.each = function(type, listener) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) { + var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; + try { + d3_transitionInheritId = id; + d3_selection_each(this, function(node, i, j) { + d3_transitionInherit = node[ns][id]; + type.call(node, node.__data__, i, j); + }); + } finally { + d3_transitionInherit = inherit; + d3_transitionInheritId = inheritId; + } + } else { + d3_selection_each(this, function(node) { + var transition = node[ns][id]; + (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener); + }); + } + return this; + }; + d3_transitionPrototype.transition = function() { + var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition; + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if (node = group[i]) { + transition = node[ns][id0]; + d3_transitionNode(node, i, ns, id1, { + time: transition.time, + ease: transition.ease, + delay: transition.delay + transition.duration, + duration: transition.duration + }); + } + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id1); + }; + function d3_transitionNamespace(name) { + return name == null ? "__transition__" : "__transition_" + name + "__"; + } + function d3_transitionNode(node, i, ns, id, inherit) { + var lock = node[ns] || (node[ns] = { + active: 0, + count: 0 + }), transition = lock[id], time, timer, duration, ease, tweens; + function schedule(elapsed) { + var delay = transition.delay; + timer.t = delay + time; + if (delay <= elapsed) return start(elapsed - delay); + timer.c = start; + } + function start(elapsed) { + var activeId = lock.active, active = lock[activeId]; + if (active) { + active.timer.c = null; + active.timer.t = NaN; + --lock.count; + delete lock[activeId]; + active.event && active.event.interrupt.call(node, node.__data__, active.index); + } + for (var cancelId in lock) { + if (+cancelId < id) { + var cancel = lock[cancelId]; + cancel.timer.c = null; + cancel.timer.t = NaN; + --lock.count; + delete lock[cancelId]; + } + } + timer.c = tick; + d3_timer(function() { + if (timer.c && tick(elapsed || 1)) { + timer.c = null; + timer.t = NaN; + } + return 1; + }, 0, time); + lock.active = id; + transition.event && transition.event.start.call(node, node.__data__, i); + tweens = []; + transition.tween.forEach(function(key, value) { + if (value = value.call(node, node.__data__, i)) { + tweens.push(value); + } + }); + ease = transition.ease; + duration = transition.duration; + } + function tick(elapsed) { + var t = elapsed / duration, e = ease(t), n = tweens.length; + while (n > 0) { + tweens[--n].call(node, e); + } + if (t >= 1) { + transition.event && transition.event.end.call(node, node.__data__, i); + if (--lock.count) delete lock[id]; else delete node[ns]; + return 1; + } + } + if (!transition) { + time = inherit.time; + timer = d3_timer(schedule, 0, time); + transition = lock[id] = { + tween: new d3_Map(), + time: time, + timer: timer, + delay: inherit.delay, + duration: inherit.duration, + ease: inherit.ease, + index: i + }; + inherit = null; + ++lock.count; + } + } + d3.svg.axis = function() { + var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_; + function axis(g) { + g.each(function() { + var g = d3.select(this); + var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy(); + var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform; + var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), + d3.transition(path)); + tickEnter.append("line"); + tickEnter.append("text"); + var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2; + if (orient === "bottom" || orient === "top") { + tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2"; + text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle"); + pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize); + } else { + tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2"; + text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start"); + pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize); + } + lineEnter.attr(y2, sign * innerTickSize); + textEnter.attr(y1, sign * tickSpacing); + lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize); + textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing); + if (scale1.rangeBand) { + var x = scale1, dx = x.rangeBand() / 2; + scale0 = scale1 = function(d) { + return x(d) + dx; + }; + } else if (scale0.rangeBand) { + scale0 = scale1; + } else { + tickExit.call(tickTransform, scale1, scale0); + } + tickEnter.call(tickTransform, scale0, scale1); + tickUpdate.call(tickTransform, scale1, scale1); + }); + } + axis.scale = function(x) { + if (!arguments.length) return scale; + scale = x; + return axis; + }; + axis.orient = function(x) { + if (!arguments.length) return orient; + orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; + return axis; + }; + axis.ticks = function() { + if (!arguments.length) return tickArguments_; + tickArguments_ = d3_array(arguments); + return axis; + }; + axis.tickValues = function(x) { + if (!arguments.length) return tickValues; + tickValues = x; + return axis; + }; + axis.tickFormat = function(x) { + if (!arguments.length) return tickFormat_; + tickFormat_ = x; + return axis; + }; + axis.tickSize = function(x) { + var n = arguments.length; + if (!n) return innerTickSize; + innerTickSize = +x; + outerTickSize = +arguments[n - 1]; + return axis; + }; + axis.innerTickSize = function(x) { + if (!arguments.length) return innerTickSize; + innerTickSize = +x; + return axis; + }; + axis.outerTickSize = function(x) { + if (!arguments.length) return outerTickSize; + outerTickSize = +x; + return axis; + }; + axis.tickPadding = function(x) { + if (!arguments.length) return tickPadding; + tickPadding = +x; + return axis; + }; + axis.tickSubdivide = function() { + return arguments.length && axis; + }; + return axis; + }; + var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; + function d3_svg_axisX(selection, x0, x1) { + selection.attr("transform", function(d) { + var v0 = x0(d); + return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)"; + }); + } + function d3_svg_axisY(selection, y0, y1) { + selection.attr("transform", function(d) { + var v0 = y0(d); + return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")"; + }); + } + d3.svg.brush = function() { + var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0]; + function brush(g) { + g.each(function() { + var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); + var background = g.selectAll(".background").data([ 0 ]); + background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); + g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move"); + var resize = g.selectAll(".resize").data(resizes, d3_identity); + resize.exit().remove(); + resize.enter().append("g").attr("class", function(d) { + return "resize " + d; + }).style("cursor", function(d) { + return d3_svg_brushCursor[d]; + }).append("rect").attr("x", function(d) { + return /[ew]$/.test(d) ? -3 : null; + }).attr("y", function(d) { + return /^[ns]/.test(d) ? -3 : null; + }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); + resize.style("display", brush.empty() ? "none" : null); + var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range; + if (x) { + range = d3_scaleRange(x); + backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]); + redrawX(gUpdate); + } + if (y) { + range = d3_scaleRange(y); + backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]); + redrawY(gUpdate); + } + redraw(gUpdate); + }); + } + brush.event = function(g) { + g.each(function() { + var event_ = event.of(this, arguments), extent1 = { + x: xExtent, + y: yExtent, + i: xExtentDomain, + j: yExtentDomain + }, extent0 = this.__chart__ || extent1; + this.__chart__ = extent1; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.brush", function() { + xExtentDomain = extent0.i; + yExtentDomain = extent0.j; + xExtent = extent0.x; + yExtent = extent0.y; + event_({ + type: "brushstart" + }); + }).tween("brush:brush", function() { + var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y); + xExtentDomain = yExtentDomain = null; + return function(t) { + xExtent = extent1.x = xi(t); + yExtent = extent1.y = yi(t); + event_({ + type: "brush", + mode: "resize" + }); + }; + }).each("end.brush", function() { + xExtentDomain = extent1.i; + yExtentDomain = extent1.j; + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + }); + } else { + event_({ + type: "brushstart" + }); + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + } + }); + }; + function redraw(g) { + g.selectAll(".resize").attr("transform", function(d) { + return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")"; + }); + } + function redrawX(g) { + g.select(".extent").attr("x", xExtent[0]); + g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]); + } + function redrawY(g) { + g.select(".extent").attr("y", yExtent[0]); + g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]); + } + function brushstart() { + var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset; + var w = d3.select(d3_window(target)).on("keydown.brush", keydown).on("keyup.brush", keyup); + if (d3.event.changedTouches) { + w.on("touchmove.brush", brushmove).on("touchend.brush", brushend); + } else { + w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend); + } + g.interrupt().selectAll("*").interrupt(); + if (dragging) { + origin[0] = xExtent[0] - origin[0]; + origin[1] = yExtent[0] - origin[1]; + } else if (resizing) { + var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); + offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ]; + origin[0] = xExtent[ex]; + origin[1] = yExtent[ey]; + } else if (d3.event.altKey) center = origin.slice(); + g.style("pointer-events", "none").selectAll(".resize").style("display", null); + d3.select("body").style("cursor", eventTarget.style("cursor")); + event_({ + type: "brushstart" + }); + brushmove(); + function keydown() { + if (d3.event.keyCode == 32) { + if (!dragging) { + center = null; + origin[0] -= xExtent[1]; + origin[1] -= yExtent[1]; + dragging = 2; + } + d3_eventPreventDefault(); + } + } + function keyup() { + if (d3.event.keyCode == 32 && dragging == 2) { + origin[0] += xExtent[1]; + origin[1] += yExtent[1]; + dragging = 0; + d3_eventPreventDefault(); + } + } + function brushmove() { + var point = d3.mouse(target), moved = false; + if (offset) { + point[0] += offset[0]; + point[1] += offset[1]; + } + if (!dragging) { + if (d3.event.altKey) { + if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ]; + origin[0] = xExtent[+(point[0] < center[0])]; + origin[1] = yExtent[+(point[1] < center[1])]; + } else center = null; + } + if (resizingX && move1(point, x, 0)) { + redrawX(g); + moved = true; + } + if (resizingY && move1(point, y, 1)) { + redrawY(g); + moved = true; + } + if (moved) { + redraw(g); + event_({ + type: "brush", + mode: dragging ? "move" : "resize" + }); + } + } + function move1(point, scale, i) { + var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max; + if (dragging) { + r0 -= position; + r1 -= size + position; + } + min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i]; + if (dragging) { + max = (min += position) + size; + } else { + if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); + if (position < min) { + max = min; + min = position; + } else { + max = position; + } + } + if (extent[0] != min || extent[1] != max) { + if (i) yExtentDomain = null; else xExtentDomain = null; + extent[0] = min; + extent[1] = max; + return true; + } + } + function brushend() { + brushmove(); + g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); + d3.select("body").style("cursor", null); + w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); + dragRestore(); + event_({ + type: "brushend" + }); + } + } + brush.x = function(z) { + if (!arguments.length) return x; + x = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.y = function(z) { + if (!arguments.length) return y; + y = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.clamp = function(z) { + if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null; + if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z; + return brush; + }; + brush.extent = function(z) { + var x0, x1, y0, y1, t; + if (!arguments.length) { + if (x) { + if (xExtentDomain) { + x0 = xExtentDomain[0], x1 = xExtentDomain[1]; + } else { + x0 = xExtent[0], x1 = xExtent[1]; + if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + } + } + if (y) { + if (yExtentDomain) { + y0 = yExtentDomain[0], y1 = yExtentDomain[1]; + } else { + y0 = yExtent[0], y1 = yExtent[1]; + if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + } + } + return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; + } + if (x) { + x0 = z[0], x1 = z[1]; + if (y) x0 = x0[0], x1 = x1[0]; + xExtentDomain = [ x0, x1 ]; + if (x.invert) x0 = x(x0), x1 = x(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ]; + } + if (y) { + y0 = z[0], y1 = z[1]; + if (x) y0 = y0[1], y1 = y1[1]; + yExtentDomain = [ y0, y1 ]; + if (y.invert) y0 = y(y0), y1 = y(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ]; + } + return brush; + }; + brush.clear = function() { + if (!brush.empty()) { + xExtent = [ 0, 0 ], yExtent = [ 0, 0 ]; + xExtentDomain = yExtentDomain = null; + } + return brush; + }; + brush.empty = function() { + return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1]; + }; + return d3.rebind(brush, event, "on"); + }; + var d3_svg_brushCursor = { + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; + var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat; + var d3_time_formatUtc = d3_time_format.utc; + var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ"); + d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso; + function d3_time_formatIsoNative(date) { + return date.toISOString(); + } + d3_time_formatIsoNative.parse = function(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + }; + d3_time_formatIsoNative.toString = d3_time_formatIso.toString; + d3_time.second = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 1e3) * 1e3); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 1e3); + }, function(date) { + return date.getSeconds(); + }); + d3_time.seconds = d3_time.second.range; + d3_time.seconds.utc = d3_time.second.utc.range; + d3_time.minute = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 6e4) * 6e4); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 6e4); + }, function(date) { + return date.getMinutes(); + }); + d3_time.minutes = d3_time.minute.range; + d3_time.minutes.utc = d3_time.minute.utc.range; + d3_time.hour = d3_time_interval(function(date) { + var timezone = date.getTimezoneOffset() / 60; + return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 36e5); + }, function(date) { + return date.getHours(); + }); + d3_time.hours = d3_time.hour.range; + d3_time.hours.utc = d3_time.hour.utc.range; + d3_time.month = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setDate(1); + return date; + }, function(date, offset) { + date.setMonth(date.getMonth() + offset); + }, function(date) { + return date.getMonth(); + }); + d3_time.months = d3_time.month.range; + d3_time.months.utc = d3_time.month.utc.range; + function d3_time_scale(linear, methods, format) { + function scale(x) { + return linear(x); + } + scale.invert = function(x) { + return d3_time_scaleDate(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return linear.domain().map(d3_time_scaleDate); + linear.domain(x); + return scale; + }; + function tickMethod(extent, count) { + var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target); + return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) { + return d / 31536e6; + }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i]; + } + scale.nice = function(interval, skip) { + var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval); + if (method) interval = method[0], skip = method[1]; + function skipped(date) { + return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length; + } + return scale.domain(d3_scale_nice(domain, skip > 1 ? { + floor: function(date) { + while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1); + return date; + }, + ceil: function(date) { + while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1); + return date; + } + } : interval)); + }; + scale.ticks = function(interval, skip) { + var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ { + range: interval + }, skip ]; + if (method) interval = method[0], skip = method[1]; + return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip); + }; + scale.tickFormat = function() { + return format; + }; + scale.copy = function() { + return d3_time_scale(linear.copy(), methods, format); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_time_scaleDate(t) { + return new Date(t); + } + var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; + var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ]; + var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) { + return d.getMilliseconds(); + } ], [ ":%S", function(d) { + return d.getSeconds(); + } ], [ "%I:%M", function(d) { + return d.getMinutes(); + } ], [ "%I %p", function(d) { + return d.getHours(); + } ], [ "%a %d", function(d) { + return d.getDay() && d.getDate() != 1; + } ], [ "%b %d", function(d) { + return d.getDate() != 1; + } ], [ "%B", function(d) { + return d.getMonth(); + } ], [ "%Y", d3_true ] ]); + var d3_time_scaleMilliseconds = { + range: function(start, stop, step) { + return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate); + }, + floor: d3_identity, + ceil: d3_identity + }; + d3_time_scaleLocalMethods.year = d3_time.year; + d3_time.scale = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); + }; + var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) { + return [ m[0].utc, m[1] ]; + }); + var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) { + return d.getUTCMilliseconds(); + } ], [ ":%S", function(d) { + return d.getUTCSeconds(); + } ], [ "%I:%M", function(d) { + return d.getUTCMinutes(); + } ], [ "%I %p", function(d) { + return d.getUTCHours(); + } ], [ "%a %d", function(d) { + return d.getUTCDay() && d.getUTCDate() != 1; + } ], [ "%b %d", function(d) { + return d.getUTCDate() != 1; + } ], [ "%B", function(d) { + return d.getUTCMonth(); + } ], [ "%Y", d3_true ] ]); + d3_time_scaleUtcMethods.year = d3_time.year.utc; + d3_time.scale.utc = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat); + }; + d3.text = d3_xhrType(function(request) { + return request.responseText; + }); + d3.json = function(url, callback) { + return d3_xhr(url, "application/json", d3_json, callback); + }; + function d3_json(request) { + return JSON.parse(request.responseText); + } + d3.html = function(url, callback) { + return d3_xhr(url, "text/html", d3_html, callback); + }; + function d3_html(request) { + var range = d3_document.createRange(); + range.selectNode(d3_document.body); + return range.createContextualFragment(request.responseText); + } + d3.xml = d3_xhrType(function(request) { + return request.responseXML; + }); + if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; +}(); diff --git a/doc/contributing.texi b/doc/contributing.texi index 18d891db4e..24db9a89e6 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi @@ -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 @@ -368,4 +365,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. diff --git a/doc/emacs.texi b/doc/emacs.texi deleted file mode 100644 index 1ffb9f636e..0000000000 --- a/doc/emacs.texi +++ /dev/null @@ -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}). diff --git a/doc/guix.texi b/doc/guix.texi index 5747484b20..e52382e976 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10,10 +10,10 @@ @include version.texi @c Identifier of the OpenPGP key used to sign tarballs and such. -@set OPENPGP-SIGNING-KEY-ID 3CE464558A84FDC69DB40CFB090B11993D9AEBB5 +@set OPENPGP-SIGNING-KEY-ID BCA689B636553801C3C62150197A5888235FACAC @copying -Copyright @copyright{} 2012, 2013, 2014, 2015, 2016 Ludovic Courtès@* +Copyright @copyright{} 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès@* Copyright @copyright{} 2013, 2014, 2016 Andreas Enge@* Copyright @copyright{} 2013 Nikita Karetnikov@* Copyright @copyright{} 2014, 2015, 2016 Alex Kost@* @@ -28,7 +28,8 @@ Copyright @copyright{} 2016 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@* Copyright @copyright{} 2016 ng0@* Copyright @copyright{} 2016 Jan Nieuwenhuizen@* -Copyright @copyright{} 2016 Julien Lepiller +Copyright @copyright{} 2016 Julien Lepiller@* +Copyright @copyright{} 2016 Alex ter Weele Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -53,12 +54,6 @@ Documentation License''. * guix environment: (guix)Invoking guix environment. Building development environments with Guix. @end direntry -@dircategory Emacs -@direntry -* Guix user interface: (guix)Emacs Interface. Package management from the comfort of Emacs. -@end direntry - - @titlepage @title GNU Guix Reference Manual @subtitle Using the GNU Guix Functional Package Manager @@ -85,7 +80,6 @@ package management tool written for the GNU system. * Introduction:: What is Guix about? * Installation:: Installing Guix. * Package Management:: Package installation, upgrade, etc. -* Emacs Interface:: Using Guix from Emacs. * Programming Interface:: Using Guix in Scheme. * Utilities:: Package management commands. * GNU Distribution:: Software for your friendly GNU system. @@ -123,19 +117,6 @@ Package Management * Invoking guix pull:: Fetching the latest Guix and distribution. * Invoking guix archive:: Exporting and importing store files. -Emacs Interface - -* 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. - Programming Interface * Defining Packages:: Defining new packages. @@ -164,12 +145,13 @@ Utilities * Invoking guix environment:: Setting up development environments. * Invoking guix publish:: Sharing substitutes. * Invoking guix challenge:: Challenging substitute servers. +* Invoking guix copy:: Copying to and from a remote store. * Invoking guix container:: Process isolation. Invoking @command{guix build} * Common Build Options:: Build options for most commands. -* Package Transformation Options:: Creating variants of packages. +* Package Transformation Options:: Creating variants of packages. * Additional Build Options:: Options specific to 'guix build'. GNU Distribution @@ -218,12 +200,14 @@ Services * Log Rotation:: The rottlog service. * Networking Services:: Network setup, SSH daemon, etc. * X Window:: Graphical display. +* Printing Services:: Local and remote printer support. * Desktop Services:: D-Bus and desktop services. * Database Services:: SQL databases. * Mail Services:: IMAP, POP3, SMTP, and all that. * Kerberos Services:: Kerberos services. * Web Services:: Web servers. * Network File System:: NFS related services. +* Continuous Integration:: The Cuirass service. * Miscellaneous Services:: Other services. Defining Services @@ -277,8 +261,7 @@ assists with the creation and maintenance of software environments. @cindex user interfaces Guix provides a command-line package management interface (@pxref{Invoking guix package}), a set of command-line utilities -(@pxref{Utilities}), a visual user interface in Emacs (@pxref{Emacs -Interface}), as well as Scheme programming interfaces +(@pxref{Utilities}), as well as Scheme programming interfaces (@pxref{Programming Interface}). @cindex build daemon Its @dfn{build daemon} is responsible for building packages on behalf of @@ -358,6 +341,9 @@ without interference. Its data lives exclusively in two directories, usually @file{/gnu/store} and @file{/var/guix}; other files on your system, such as @file{/etc}, are left untouched. +Once installed, Guix can be updated by running @command{guix pull} +(@pxref{Invoking guix pull}). + @menu * Binary Installation:: Getting Guix running in no time! * Requirements:: Software needed to build and run Guix. @@ -568,7 +554,8 @@ interest primarily for developers and not for casual users. @item @c Note: We need at least 0.10.2 for 'channel-send-eof'. -Support for build offloading (@pxref{Daemon Offload Setup}) depends on +Support for build offloading (@pxref{Daemon Offload Setup}) and +@command{guix copy} (@pxref{Invoking guix copy}) depends on @uref{https://github.com/artyom-poptsov/guile-ssh, Guile-SSH}, version 0.10.2 or later. @@ -921,6 +908,13 @@ Port number of SSH server on the machine. The SSH private key file to use when connecting to the machine, in OpenSSH format. +@item @code{compression} (default: @code{"zlib@@openssh.com,zlib"}) +@itemx @code{compression-level} (default: @code{3}) +The SSH-level compression methods and compression level requested. + +Note that offloading relies on SSH compression to reduce bandwidth usage +when transferring files to and from build machines. + @item @code{daemon-socket} (default: @code{"/var/guix/daemon-socket/socket"}) File name of the Unix-domain socket @command{guix-daemon} is listening to on that machine. @@ -941,9 +935,8 @@ name, and they will be scheduled on matching build machines. @end table @end deftp -The @code{guix} command must be in the search path on the build -machines, since offloading works by invoking the @code{guix archive} and -@code{guix build} commands. In addition, the Guix modules must be in +The @code{guile} command must be in the search path on the build +machines. In addition, the Guix modules must be in @code{$GUILE_LOAD_PATH} on the build machine---you can check whether this is the case by running: @@ -978,6 +971,32 @@ the master receives files from a build machine (and @i{vice versa}), its build daemon can make sure they are genuine, have not been tampered with, and that they are signed by an authorized key. +@cindex offload test +To test whether your setup is operational, run this command on the +master node: + +@example +# guix offload test +@end example + +This will attempt to connect to each of the build machines specified in +@file{/etc/guix/machines.scm}, make sure Guile and the Guix modules are +available on each machine, attempt to export to the machine and import +from it, and report any error in the process. + +If you want to test a different machine file, just specify it on the +command line: + +@example +# guix offload test machines-qualif.scm +@end example + +Last, you can test the subset of the machines whose name matches a +regular expression like this: + +@example +# guix offload test machines.scm '\.gnu\.org$' +@end example @node Invoking guix-daemon @section Invoking @command{guix-daemon} @@ -1242,6 +1261,56 @@ data in the right format. This is important because the locale data format used by different libc versions may be incompatible. +@subsection Name Service Switch + +@cindex name service switch, glibc +@cindex NSS (name service switch), glibc +@cindex nscd (name service caching daemon) +@cindex name service caching daemon (nscd) +When using Guix on a foreign distro, we @emph{strongly recommend} that +the system run the GNU C library's @dfn{name service cache daemon}, +@command{nscd}, which should be listening on the +@file{/var/run/nscd/socket} socket. Failing to do that, applications +installed with Guix may fail to look up host names or user accounts, or +may even crash. The next paragraphs explain why. + +@cindex @file{nsswitch.conf} +The GNU C library implements a @dfn{name service switch} (NSS), which is +an extensible mechanism for ``name lookups'' in general: host name +resolution, user accounts, and more (@pxref{Name Service Switch,,, libc, +The GNU C Library Reference Manual}). + +@cindex Network information service (NIS) +@cindex NIS (Network information service) +Being extensible, the NSS supports @dfn{plugins}, which provide new name +lookup implementations: for example, the @code{nss-mdns} plugin allow +resolution of @code{.local} host names, the @code{nis} plugin allows +user account lookup using the Network information service (NIS), and so +on. These extra ``lookup services'' are configured system-wide in +@file{/etc/nsswitch.conf}, and all the programs running on the system +honor those settings (@pxref{NSS Configuration File,,, libc, The GNU C +Reference Manual}). + +When they perform a name lookup---for instance by calling the +@code{getaddrinfo} function in C---applications first try to connect to +the nscd; on success, nscd performs name lookups on their behalf. If +the nscd is not running, then they perform the name lookup by +themselves, by loading the name lookup services into their own address +space and running it. These name lookup services---the +@file{libnss_*.so} files---are @code{dlopen}'d, but they may come from +the host system's C library, rather than from the C library the +application is linked against (the C library coming from Guix). + +And this is where the problem is: if your application is linked against +Guix's C library (say, glibc 2.24) and tries to load NSS plugins from +another C library (say, @code{libnss_mdns.so} for glibc 2.22), it will +likely crash or have its name lookups fail unexpectedly. + +Running @command{nscd} on the system, among other advantages, eliminates +this binary incompatibility problem because those @code{libnss_*.so} +files are loaded in the @command{nscd} process, not in applications +themselves. + @subsection X11 Fonts @cindex fonts @@ -1328,10 +1397,14 @@ procedures or dependencies. Guix also goes beyond this obvious set of features. This chapter describes the main features of Guix, as well as the package -management tools it provides. Two user interfaces are provided for -routine package management tasks: A command-line interface described below -(@pxref{Invoking guix package, @code{guix package}}), as well as a visual user -interface in Emacs described in a subsequent chapter (@pxref{Emacs Interface}). +management tools it provides. Along with the command-line interface +described below (@pxref{Invoking guix package, @code{guix package}}), +you may also use Emacs Interface, after installing @code{emacs-guix} +package (run @kbd{M-x guix-help} command to start with it): + +@example +guix package -i emacs-guix +@end example @menu * Features:: How Guix will make your life brighter. @@ -1348,9 +1421,7 @@ interface in Emacs described in a subsequent chapter (@pxref{Emacs Interface}). When using Guix, each package ends up in the @dfn{package store}, in its own directory---something that resembles -@file{/gnu/store/xxx-package-1.2}, where @code{xxx} is a base32 string -(note that Guix comes with an Emacs extension to shorten those file -names, @pxref{Emacs Prettify}.) +@file{/gnu/store/xxx-package-1.2}, where @code{xxx} is a base32 string. Instead of referring to these directories, users have their own @dfn{profile}, which points to the packages that they actually want to @@ -1896,9 +1967,7 @@ also result from derivation builds, can be available as substitutes. The @code{hydra.gnu.org} server is a front-end to a build farm that builds packages from the GNU distribution continuously for some -architectures, and makes them available as substitutes (@pxref{Emacs -Hydra}, for information on how to query the continuous integration -server). This is the +architectures, and makes them available as substitutes. This is the default source of substitutes; it can be overridden by passing the @option{--substitute-urls} option either to @command{guix-daemon} (@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}}) @@ -2225,6 +2294,7 @@ this option is primarily useful when the daemon was running with @section Invoking @command{guix pull} @cindex upgrading Guix +@cindex updating Guix @cindex @command{guix pull} @cindex pull Packages are installed or upgraded to the latest version available in @@ -2318,12 +2388,16 @@ However, note that, in both examples, all of @code{emacs} and the profile as well as all of their dependencies are transferred (due to @code{-r}), regardless of what is already available in the store on the target machine. The @code{--missing} option can help figure out which -items are missing from the target store. - -Archives are stored in the ``Nix archive'' or ``Nar'' format, which is -comparable in spirit to `tar', but with a few noteworthy differences +items are missing from the target store. The @command{guix copy} +command simplifies and optimizes this whole process, so this is probably +what you should use in this case (@pxref{Invoking guix copy}). + +@cindex nar, archive format +@cindex normalized archive (nar) +By default archives are stored in the ``normalized archive'' or ``nar'' format, which is +comparable in spirit to `tar', but with differences that make it more appropriate for our purposes. First, rather than -recording all Unix metadata for each file, the Nar format only mentions +recording all Unix metadata for each file, the nar format only mentions the file type (regular, directory, or symbolic link); Unix permissions and owner/group are dismissed. Second, the order in which directory entries are stored always follows the order of file names according to @@ -2336,6 +2410,9 @@ verifies the signature and rejects the import in case of an invalid signature or if the signing key is not authorized. @c FIXME: Add xref to daemon doc about signatures. +Optionally, archives can be exported as a Docker image in the tar +archive format using @code{--format=docker}. + The main options are: @table @code @@ -2364,6 +2441,19 @@ Read a list of store file names from the standard input, one per line, and write on the standard output the subset of these files missing from the store. +@item -f +@item --format=@var{FMT} +@cindex docker, export +@cindex export format +Specify the export format. Acceptable arguments are @code{nar} and +@code{docker}. The default is the nar format. When the format is +@code{docker}, recursively export the specified store directory as a +Docker image in tar archive format, as specified in +@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md, +version 1.2.0 of the Docker Image Specification}. Using +@code{--format=docker} implies @code{--recursive}. The generated +archive can be loaded by Docker using @command{docker load}. + @item --generate-key[=@var{parameters}] @cindex signing, archives Generate a new key pair for the daemon. This is a prerequisite before @@ -2421,9 +2511,6 @@ archive contents coming from possibly untrusted substitute servers. @end table @c ********************************************************************* -@include emacs.texi - -@c ********************************************************************* @node Programming Interface @chapter Programming Interface @@ -3102,6 +3189,19 @@ which file the system is defined in. @end defvr +@defvr {Scheme Variable} cargo-build-system +@cindex Rust programming language +@cindex Cargo (Rust build system) +This variable is exported by @code{(guix build-system cargo)}. It +supports builds of packages using Cargo, the build tool of the +@uref{https://www.rust-lang.org, Rust programming language}. + +In its @code{configure} phase, this build system replaces dependencies +specified in the @file{Carto.toml} file with inputs to the Guix package. +The @code{install} phase installs the binaries, and it also installs the +source code and @file{Cargo.toml} file. +@end defvr + @defvr {Scheme Variable} cmake-build-system This variable is exported by @code{(guix build-system cmake)}. It implements the build procedure for packages using the @@ -3170,6 +3270,11 @@ the @code{#:python} parameter. This is a useful way to force a package to be built for a specific version of the Python interpreter, which might be necessary if the package is only compatible with a single interpreter version. + +By default guix calls @code{setup.py} under control of +@code{setuptools}, much like @command{pip} does. Some packages are not +compatible with setuptools (and pip), thus you can disable this by +setting the @code{#:use-setuptools} parameter to @code{#f}. @end defvr @defvr {Scheme Variable} perl-build-system @@ -4332,6 +4437,7 @@ the Scheme programming interface of Guix in a convenient way. * Invoking guix environment:: Setting up development environments. * Invoking guix publish:: Sharing substitutes. * Invoking guix challenge:: Challenging substitute servers. +* Invoking guix copy:: Copying to and from a remote store. * Invoking guix container:: Process isolation. @end menu @@ -4384,7 +4490,7 @@ described in the subsections below. @menu * Common Build Options:: Build options for most commands. -* Package Transformation Options:: Creating variants of packages. +* Package Transformation Options:: Creating variants of packages. * Additional Build Options:: Options specific to 'guix build'. @end menu @@ -4595,7 +4701,7 @@ procedure (@pxref{Defining Packages, @code{package-input-rewriting}}). @item --with-graft=@var{package}=@var{replacement} This is similar to @code{--with-input} but with an important difference: -instead of rebuilding all the dependency chain, @var{replacement} is +instead of rebuilding the whole dependency chain, @var{replacement} is built and then @dfn{grafted} onto the binaries that were initially referring to @var{package}. @xref{Security Updates}, for more information on grafts. @@ -4816,11 +4922,6 @@ have created your own packages on @code{GUIX_PACKAGE_PATH} recipes. Otherwise, you will be able to examine the read-only recipes for packages currently in the store. -If you are using Emacs, note that the Emacs user interface provides the -@kbd{M-x guix-edit} command and a similar functionality in the ``package -info'' and ``package list'' buffers created by the @kbd{M-x -guix-search-by-name} and similar commands (@pxref{Emacs Commands}). - @node Invoking guix download @section Invoking @command{guix download} @@ -5058,6 +5159,10 @@ R package: guix import cran Cairo @end example +When @code{--recursive} is added, the importer will traverse the +dependency graph of the given upstream package recursively and generate +package expressions for all those packages that are not yet in Guix. + When @code{--archive=bioconductor} is added, metadata is imported from @uref{http://www.bioconductor.org/, Bioconductor}, a repository of R packages for for the analysis and comprehension of high-throughput @@ -5179,6 +5284,11 @@ signatures,, emacs, The GNU Emacs Manual}). identifier. @end itemize @end table + +@item crate +@cindex crate +Import metadata from the crates.io Rust package repository +@uref{https://crates.io, crates.io}. @end table The structure of the @command{guix import} code is modular. It would be @@ -5200,10 +5310,19 @@ gnu/packages/gettext.scm:29:13: gettext would be upgraded from 0.18.1.1 to 0.18. gnu/packages/glib.scm:77:12: glib would be upgraded from 2.34.3 to 2.37.0 @end example -It does so by browsing the FTP directory of each package and determining -the highest version number of the source tarballs therein. The command +Alternately, one can specify packages to consider, in which case a +warning is emitted for packages that lack an updater: + +@example +$ guix refresh coreutils guile guile-ssh +gnu/packages/ssh.scm:205:2: warning: no updater for guile-ssh +gnu/packages/guile.scm:136:12: guile would be upgraded from 2.0.12 to 2.0.13 +@end example + +@command{guix refresh} browses the upstream repository of each package and determines +the highest version number of the releases therein. The command knows how to update specific types of packages: GNU packages, ELPA -packages, etc.---see the documentation for @option{--type} below. The +packages, etc.---see the documentation for @option{--type} below. There are many packages, though, for which it lacks a method to determine whether a new upstream release is available. However, the mechanism is extensible, so feel free to get in touch with us to add a new method! @@ -5243,7 +5362,7 @@ usually run from a checkout of the Guix source tree (@pxref{Running Guix Before It Is Installed}): @example -$ ./pre-inst-env guix refresh -s non-core +$ ./pre-inst-env guix refresh -s non-core -u @end example @xref{Defining Packages}, for more information on package definitions. @@ -5278,12 +5397,16 @@ the updater for GNOME packages; the updater for KDE packages; @item xorg the updater for X.org packages; +@item kernel.org +the updater for packages hosted on kernel.org; @item elpa the updater for @uref{http://elpa.gnu.org/, ELPA} packages; @item cran the updater for @uref{http://cran.r-project.org/, CRAN} packages; @item bioconductor the updater for @uref{http://www.bioconductor.org/, Bioconductor} R packages; +@item cpan +the updater for @uref{http://www.cpan.org/, CPAN} packages; @item pypi the updater for @uref{https://pypi.python.org, PyPI} packages. @item gem @@ -5292,6 +5415,8 @@ the updater for @uref{https://rubygems.org, RubyGems} packages. the updater for @uref{https://github.com, GitHub} packages. @item hackage the updater for @uref{https://hackage.haskell.org, Hackage} packages. +@item crate +the updater for @uref{https://crates.io, Crates} packages. @end table For instance, the following command only checks for updates of Emacs @@ -5309,7 +5434,7 @@ In addition, @command{guix refresh} can be passed one or more package names, as in this example: @example -$ ./pre-inst-env guix refresh -u emacs idutils gcc-4.8.4 +$ ./pre-inst-env guix refresh -u emacs idutils gcc@@4.8 @end example @noindent @@ -5328,11 +5453,18 @@ be used when passing @command{guix refresh} one or more package names: @itemx -L List available updaters and exit (see @option{--type} above.) +For each updater, display the fraction of packages it covers; at the +end, display the fraction of packages covered by all these updaters. + @item --list-dependent @itemx -l List top-level dependent packages that would need to be rebuilt as a result of upgrading one or more packages. +@xref{Invoking guix graph, the @code{reverse-package} type of +@command{guix graph}}, for information on how to visualize the list of +dependents of a package. + @end table Be aware that the @code{--list-dependent} option only @@ -5596,11 +5728,13 @@ Consider packages for @var{system}---e.g., @code{x86_64-linux}. Packages and their dependencies form a @dfn{graph}, specifically a directed acyclic graph (DAG). It can quickly become difficult to have a mental model of the package DAG, so the @command{guix graph} command -provides a visual representation of the DAG. @command{guix graph} -emits a DAG representation in the input format of +provides a visual representation of the DAG. By default, +@command{guix graph} emits a DAG representation in the input format of @uref{http://www.graphviz.org/, Graphviz}, so its output can be passed -directly to the @command{dot} command of Graphviz. The general -syntax is: +directly to the @command{dot} command of Graphviz. It can also emit an +HTML page with embedded JavaScript code to display a ``chord diagram'' +in a Web browser, using the @uref{https://d3js.org/, d3.js} library. +The general syntax is: @example guix graph @var{options} @var{package}@dots{} @@ -5632,6 +5766,20 @@ This is the default type used in the example above. It shows the DAG of package objects, excluding implicit dependencies. It is concise, but filters out many details. +@item reverse-package +This shows the @emph{reverse} DAG of packages. For example: + +@example +guix graph --type=reverse-package ocaml +@end example + +... yields the graph of packages that depend on OCaml. + +Note that for core packages this can yield huge graphs. If all you want +is to know the number of packages that depend on a given package, use +@command{guix refresh --list-dependent} (@pxref{Invoking guix refresh, +@option{--list-dependent}}). + @item bag-emerged This is the package DAG, @emph{including} implicit inputs. @@ -5718,6 +5866,15 @@ the values listed above. @item --list-types List the supported graph types. +@item --backend=@var{backend} +@itemx -b @var{backend} +Produce a graph using the selected @var{backend}. + +@item --list-backends +List the supported graph backends. + +Currently, the available backends are Graphviz and d3.js. + @item --expression=@var{expr} @itemx -e @var{expr} Consider the package @var{expr} evaluates to. @@ -5852,6 +6009,21 @@ The @code{--container} option requires Linux-libre 3.19 or newer. The available options are summarized below. @table @code +@item --root=@var{file} +@itemx -r @var{file} +@cindex persistent environment +@cindex garbage collector root, for environments +Make @var{file} a symlink to the profile for this environment, and +register it as a garbage collector root. + +This is useful if you want to protect your environment from garbage +collection, to make it ``persistent''. + +When this option is omitted, the environment is protected from garbage +collection only for the duration of the @command{guix environment} +session. This means that next time you recreate the same environment, +you could have to rebuild or re-download packages. + @item --expression=@var{expr} @itemx -e @var{expr} Create an environment for the package or list of packages that @@ -6240,6 +6412,68 @@ URLs to compare to. @end table +@node Invoking guix copy +@section Invoking @command{guix copy} + +@cindex copy, of store items, over SSH +@cindex SSH, copy of store items +@cindex sharing store items across machines +@cindex transferring store items across machines +The @command{guix copy} command copies items from the store of one +machine to that of another machine over a secure shell (SSH) +connection@footnote{This command is available only when Guile-SSH was +found. @xref{Requirements}, for details.}. For example, the following +command copies the @code{coreutils} package, the user's profile, and all +their dependencies over to @var{host}, logged in as @var{user}: + +@example +guix copy --to=@var{user}@@@var{host} \ + coreutils `readlink -f ~/.guix-profile` +@end example + +If some of the items to be copied are already present on @var{host}, +they are not actually sent. + +The command below retrieves @code{libreoffice} and @code{gimp} from +@var{host}, assuming they are available there: + +@example +guix copy --from=@var{host} libreoffice gimp +@end example + +The SSH connection is established using the Guile-SSH client, which is +compatible with OpenSSH: it honors @file{~/.ssh/known_hosts} and +@file{~/.ssh/config}, and uses the SSH agent for authentication. + +The key used to sign items that are sent must be accepted by the remote +machine. Likewise, the key used by the remote machine to sign items you +are retrieving must be in @file{/etc/guix/acl} so it is accepted by your +own daemon. @xref{Invoking guix archive}, for more information about +store item authentication. + +The general syntax is: + +@example +guix copy [--to=@var{spec}|--from=@var{spec}] @var{items}@dots{} +@end example + +You must always specify one of the following options: + +@table @code +@item --to=@var{spec} +@itemx --from=@var{spec} +Specify the host to send to or receive from. @var{spec} must be an SSH +spec such as @code{example.org}, @code{charlie@@example.org}, or +@code{charlie@@example.org:2222}. +@end table + +The @var{items} can be either package names, such as @code{gimp}, or +store items, such as @file{/gnu/store/@dots{}-idutils-4.6}. + +When specifying the name of a package to send, it is first built if +needed, unless @option{--dry-run} was specified. Common build options +are supported (@pxref{Common Build Options}). + @node Invoking guix container @section Invoking @command{guix container} @@ -6727,6 +6961,7 @@ swap partition on @file{/dev/sda2}, you would run: @example mkswap /dev/sda2 +swapon /dev/sda2 @end example @node Proceeding with the Installation @@ -6807,6 +7042,14 @@ initialized by running the @command{passwd} command as @code{root}, unless your configuration specifies otherwise (@pxref{user-account-password, user account passwords}). +@cindex upgrading GuixSD +From then on, you can update GuixSD whenever you want by running +@command{guix pull} as @code{root} (@pxref{Invoking guix pull}), and +then running @command{guix system reconfigure} to build a new system +generation with the latest packages and services (@pxref{Invoking guix +system}). We recommend doing that regularly so that your system +includes the latest security updates (@pxref{Security Updates}). + Join us on @code{#guix} on the Freenode IRC network or on @file{guix-devel@@gnu.org} to share your experience---good or not so good. @@ -7073,7 +7316,7 @@ entry (@pxref{Invoking guix system}). The normal way to change the system configuration is by updating this file and re-running @command{guix system reconfigure}. One should never -have to touch files in @command{/etc} or to run commands that modify the +have to touch files in @file{/etc} or to run commands that modify the system state such as @command{useradd} or @command{grub-install}. In fact, you must avoid that since that would not only void your warranty but also prevent you from rolling back to previous versions of your @@ -7086,7 +7329,15 @@ modifying or deleting previous generations. Old system generations get an entry in the GRUB boot menu, allowing you to boot them in case something went wrong with the latest generation. Reassuring, no? The @command{guix system list-generations} command lists the system -generations available on disk. +generations available on disk. It is also possible to roll back the +system via the commands @command{guix system roll-back} and +@command{guix system switch-generation}. + +Although the command @command{guix system reconfigure} will not modify +previous generations, must take care when the current generation is not +the latest (e.g., after invoking @command{guix system roll-back}), since +the operation might overwrite a later generation (@pxref{Invoking guix +system}). @unnumberedsubsubsec The Programming Interface @@ -7481,7 +7732,7 @@ for RAID-4, RAID-5 or RAID-6, or @code{raid10} for RAID-10. @cindex LUKS The following example specifies a mapping from @file{/dev/sda3} to @file{/dev/mapper/home} using LUKS---the -@url{http://code.google.com/p/cryptsetup,Linux Unified Key Setup}, a +@url{https://gitlab.com/cryptsetup/cryptsetup,Linux Unified Key Setup}, a standard mechanism for disk encryption. The @file{/dev/mapper/home} device can then be used as the @code{device} of a @code{file-system} @@ -7862,6 +8113,7 @@ declaration. * Kerberos Services:: Kerberos services. * Web Services:: Web servers. * Network File System:: NFS related services. +* Continuous Integration:: The Cuirass service. * Miscellaneous Services:: Other services. @end menu @@ -8136,9 +8388,12 @@ The list of URLs where to look for substitutes by default. @item @code{extra-options} (default: @code{'()}) List of extra command-line options for @command{guix-daemon}. +@item @code{log-file} (default: @code{"/var/log/guix-daemon.log"}) +File where @command{guix-daemon}'s standard output and standard error +are written. + @item @code{lsof} (default: @var{lsof}) -@itemx @code{lsh} (default: @var{lsh}) -The lsof and lsh packages to use. +The lsof package to use. @end table @end deftp @@ -8485,7 +8740,7 @@ Thus, it can be instantiated like this: (use-modules (gnu services networking) (gnu packages admin)) -(service wpa-supplicant-type wpa-supplicant) +(service wpa-supplicant-service-type wpa-supplicant) @end lisp @end defvr @@ -10039,13 +10294,14 @@ Users need to be in the @code{lp} group to access the D-Bus service. The @code{(gnu services databases)} module provides the following services. @deffn {Scheme Procedure} postgresql-service [#:postgresql postgresql] @ - [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] + [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @ + [#:port 5432] [#:locale ``en_US.utf8''] Return a service that runs @var{postgresql}, the PostgreSQL database server. -The PostgreSQL daemon loads its runtime configuration from -@var{config-file} and stores the database cluster in -@var{data-directory}. +The PostgreSQL daemon loads its runtime configuration from @var{config-file}, +creates a database cluster with @var{locale} as the default +locale, stored in @var{data-directory}. It then listens on @var{port}. @end deffn @deffn {Scheme Procedure} mysql-service [#:config (mysql-configuration)] @@ -10066,6 +10322,9 @@ or @var{mysql}. For MySQL, a temporary root password will be displayed at activation time. For MariaDB, the root password is empty. + +@item @code{port} (default: @code{3306}) +TCP port on which the database server listens for incoming connections. @end table @end deftp @@ -10584,7 +10843,7 @@ Defaults to @samp{""}. @deftypevr {@code{dovecot-configuration} parameter} string auth-krb5-keytab Kerberos keytab to use for the GSSAPI mechanism. Will use the -system default (usually /etc/krb5.keytab) if not specified. You may +system default (usually @file{/etc/krb5.keytab}) if not specified. You may need to change the auth service to run as root to be able to read this file. Defaults to @samp{""}. @@ -11472,6 +11731,99 @@ remote servers. Run @command{man smtpd.conf} for more information. The @code{(gnu services kerberos)} module provides services relating to the authentication protocol @dfn{Kerberos}. +@subsubheading Krb5 Service + +Programs using a Kerberos client library normally +expect a configuration file in @file{/etc/krb5.conf}. +This service generates such a file from a definition provided in the +operating system declaration. +It does not cause any daemon to be started. + +No ``keytab'' files are provided by this service---you must explicitly create them. +This service is known to work with the MIT client library, @code{mit-krb5}. +Other implementations have not been tested. + +@defvr {Scheme Variable} krb5-service-type +A service type for Kerberos 5 clients. +@end defvr + +@noindent +Here is an example of its use: +@lisp +(service krb5-service-type + (krb5-configuration + (default-realm "EXAMPLE.COM") + (allow-weak-crypto? #t) + (realms (list + (krb5-realm + (name "EXAMPLE.COM") + (admin-server "groucho.example.com") + (kdc "karl.example.com")) + (krb5-realm + (name "ARGRX.EDU") + (admin-server "kerb-admin.argrx.edu") + (kdc "keys.argrx.edu")))))) +@end lisp + +@noindent +This example provides a Kerberos@tie{}5 client configuration which: +@itemize +@item Recognizes two realms, @i{viz:} ``EXAMPLE.COM'' and ``ARGRX.EDU'', both +of which have distinct administration servers and key distribution centers; +@item Will default to the realm ``EXAMPLE.COM'' if the realm is not explicitly +specified by clients; +@item Accepts services which only support encryption types known to be weak. +@end itemize + +The @code{krb5-realm} and @code{krb5-configuration} types have many fields. +Only the most commonly used ones are described here. +For a full list, and more detailed explanation of each, see the MIT +@uref{http://web.mit.edu/kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html,,krb5.conf} +documentation. + + +@deftp {Data Type} krb5-realm +@cindex realm, kerberos +@table @asis +@item @code{name} +This field is a string identifying the name of the realm. +A common convention is to use the fully qualified DNS name of your organization, +converted to upper case. + +@item @code{admin-server} +This field is a string identifying the host where the administration server is +running. + +@item @code{kdc} +This field is a string identifying the key distribution center +for the realm. +@end table +@end deftp + +@deftp {Data Type} krb5-configuration + +@table @asis +@item @code{allow-weak-crypto?} (default: @code{#f}) +If this flag is @code{#t} then services which only offer encryption algorithms +known to be weak will be accepted. + +@item @code{default-realm} (default: @code{#f}) +This field should be a string identifying the default Kerberos +realm for the client. +You should set this field to the name of your Kerberos realm. +If this value is @code{#f} +then a realm must be specified with every Kerberos principal when invoking programs +such as @command{kinit}. + +@item @code{realms} +This should be a non-empty list of @code{krb5-realm} objects, which clients may +access. +Normally, one of them will have a @code{name} field matching the @code{default-realm} +field. +@end table +@end deftp + + @subsubheading PAM krb5 Service @cindex pam-krb5 @@ -11509,8 +11861,8 @@ The @code{(gnu services web)} module provides the following service: @deffn {Scheme Procedure} nginx-service [#:nginx nginx] @ [#:log-directory ``/var/log/nginx''] @ [#:run-directory ``/var/run/nginx''] @ - [#:vhost-list (list (nginx-vhost-configuration))] @ - [#:config-file] + [#:server-list '()] @ + [#:config-file @code{#f}] Return a service that runs @var{nginx}, the nginx web server. @@ -11520,32 +11872,46 @@ files are written to @var{run-directory}. For proper operation, these arguments should match what is in @var{config-file} to ensure that the directories are created when the service is activated. -As an alternative to using a @var{config-file}, @var{vhost-list} can be -used to specify the list of @dfn{virtual hosts} required on the host. For +As an alternative to using a @var{config-file}, @var{server-list} can be +used to specify the list of @dfn{server blocks} required on the host. For this to work, use the default value for @var{config-file}. @end deffn -@deftp {Data Type} nginx-vhost-configuration -Data type representing the configuration of an nginx virtual host. +@deffn {Scheme Variable} nginx-service-type +This is type for the nginx web server. + +This service can be extended to add server blocks in addition to the +default one, as in this example: + +@example +(simple-service 'my-extra-server nginx-service-type + (list (nginx-server-configuration + (https-port #f) + (root "/srv/http/extra-website")))) +@end example +@end deffn + +@deftp {Data Type} nginx-server-configuration +Data type representing the configuration of an nginx server block. This type has the following parameters: @table @asis @item @code{http-port} (default: @code{80}) Nginx will listen for HTTP connection on this port. Set it at @code{#f} if nginx should not listen for HTTP (non secure) connection for this -@dfn{virtual host}. +@dfn{server block}. @item @code{https-port} (default: @code{443}) Nginx will listen for HTTPS connection on this port. Set it at @code{#f} if -nginx should not listen for HTTPS (secure) connection for this @dfn{virtual host}. +nginx should not listen for HTTPS (secure) connection for this @dfn{server block}. Note that nginx can listen for HTTP and HTTPS connections in the same -@dfn{virtual host}. +@dfn{server block}. @item @code{server-name} (default: @code{(list 'default)}) -A list of server names this vhost represents. @code{'default} represents the -default vhost for connections matching no other vhost. +A list of server names this server represents. @code{'default} represents the +default server for connections matching no other server. @item @code{root} (default: @code{"/srv/http"}) Root of the website nginx will serve. @@ -11683,6 +12049,93 @@ If it is @code{#f} then the daemon will use the host's fully qualified domain na @end table @end deftp +@node Continuous Integration +@subsubsection Continuous Integration + +@cindex continuous integration +@uref{https://notabug.org/mthl/cuirass, Cuirass} is a continuous +integration tool for Guix. It can be used both for development and for +providing substitutes to others (@pxref{Substitutes}). + +The @code{(gnu services cuirass)} module provides the following service. + +@defvr {Scheme Procedure} cuirass-service-type +The type of the Cuirass service. Its value must be a +@code{cuirass-configuration} object, as described below. +@end defvr + +To add build jobs, you have to set the @code{specifications} field of +the configuration. Here is an example of a service defining a build job +based on a specification that can be found in Cuirass source tree. This +service polls the Guix repository and builds a subset of the Guix +packages, as prescribed in the @file{gnu-system.scm} example spec: + +@example +(let ((spec #~((#:name . "guix") + (#:url . "git://git.savannah.gnu.org/guix.git") + (#:load-path . ".") + + ;; Here we must provide an absolute file name. + ;; We take jobs from one of the examples provided + ;; by Cuirass. + (#:file . #$(file-append + cuirass + "/tests/gnu-system.scm")) + + (#:proc . hydra-jobs) + (#:arguments (subset . "hello")) + (#:branch . "master")))) + (service cuirass-service-type + (cuirass-configuration + (specifications #~(list #$spec))))) +@end example + +While information related to build jobs is located directly in the +specifications, global settings for the @command{cuirass} process are +accessible in other @code{cuirass-configuration} fields. + +@deftp {Data Type} cuirass-configuration +Data type representing the configuration of Cuirass. + +@table @asis +@item @code{log-file} (default: @code{"/var/log/cuirass.log"}) +Location of the log file. + +@item @code{cache-directory} (default: @code{"/var/cache/cuirass"}) +Location of the repository cache. + +@item @code{user} (default: @code{"cuirass"}) +Owner of the @code{cuirass} process. + +@item @code{group} (default: @code{"cuirass"}) +Owner's group of the @code{cuirass} process. + +@item @code{interval} (default: @code{60}) +Number of seconds between the poll of the repositories followed by the +Cuirass jobs. + +@item @code{database} (default: @code{"/var/run/cuirass/cuirass.db"}) +Location of sqlite database which contains the build results and previously +added specifications. + +@item @code{specifications} (default: @code{#~'()}) +A gexp (@pxref{G-Expressions}) that evaluates to a list of specifications, +where a specification is an association list +(@pxref{Associations Lists,,, guile, GNU Guile Reference Manual}) whose +keys are keywords (@code{#:keyword-example}) as shown in the example +above. + +@item @code{use-substitutes?} (default: @code{#f}) +This allows using substitutes to avoid building every dependencies of a job +from source. + +@item @code{one-shot?} (default: @code{#f}) +Only evaluate specifications and build derivations once. + +@item @code{cuirass} (default: @code{cuirass}) +The Cuirass package to use. +@end table +@end deftp @node Miscellaneous Services @subsubsection Miscellaneous Services @@ -12224,6 +12677,9 @@ The number of seconds to wait for keyboard input before booting. Set to @item @code{theme} (default: @var{%default-theme}) The @code{grub-theme} object describing the theme to use. + +@item @code{grub} (default: @code{grub}) +The GRUB package to use. @end table @end deftp @@ -12339,6 +12795,12 @@ currently running; if a service is currently running, it does not attempt to upgrade it since this would not be possible without stopping it first. +This command creates a new generation whose number is one greater than +the current generation (as reported by @command{guix system +list-generations}). If that generation already exists, it will be +overwritten. This behavior mirrors that of @command{guix package} +(@pxref{Invoking guix package}). + It also adds a GRUB menu entry for the new OS configuration, and moves entries for older configurations to a submenu---unless @option{--no-grub} is passed. @@ -12639,8 +13101,7 @@ host. @item -net user Enable the unprivileged user-mode network stack. The guest OS can access the host but not vice versa. This is the simplest way to get the -guest OS online. If you do not choose a network stack, the boot will -fail. +guest OS online. @item -net nic,model=virtio You must create a network interface of a given model. If you do not @@ -13747,7 +14208,6 @@ for instance, the module python-dateutil is packaged under the names starts with @code{py} (e.g. @code{pytz}), we keep it and prefix it as described above. - @subsubsection Specifying Dependencies @cindex inputs, for Python packages @@ -13764,6 +14224,12 @@ following check list to determine which dependency goes where. @itemize @item +We currently package Python 2 with @code{setuptools} and @code{pip} +installed like Python 3.4 has per default. Thus you don't need to +specify either of these as an input. @command{guix lint} will warn you +if you do. + +@item Python dependencies required at run time go into @code{propagated-inputs}. They are typically defined with the @code{install_requires} keyword in @file{setup.py}, or in the @@ -13777,8 +14243,7 @@ testing---e.g., those in @code{tests_require}---go into propagated because they are not needed at run time, and (2) in a cross-compilation context, it's the ``native'' input that we'd want. -Examples are @code{setuptools}, which is usually needed only at build -time, or the @code{pytest}, @code{mock}, and @code{nose} test +Examples are the @code{pytest}, @code{mock}, and @code{nose} test frameworks. Of course if any of these packages is also required at run-time, it needs to go to @code{propagated-inputs}. diff --git a/doc/htmlxref.cnf b/doc/htmlxref.cnf index bd2eb5f147..93e214fcc5 100644 --- a/doc/htmlxref.cnf +++ b/doc/htmlxref.cnf @@ -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/ diff --git a/doc/images/bootstrap-packages.dot b/doc/images/bootstrap-packages.dot index 3d64521edf..8b2df068a8 100644 --- a/doc/images/bootstrap-packages.dot +++ b/doc/images/bootstrap-packages.dot @@ -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]; } diff --git a/doc/images/coreutils-bag-graph.dot b/doc/images/coreutils-bag-graph.dot index 422c719282..7c90db65d4 100644 --- a/doc/images/coreutils-bag-graph.dot +++ b/doc/images/coreutils-bag-graph.dot @@ -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]; } diff --git a/doc/images/coreutils-graph.dot b/doc/images/coreutils-graph.dot index cb0622a427..920e5f2358 100644 --- a/doc/images/coreutils-graph.dot +++ b/doc/images/coreutils-graph.dot @@ -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]; } diff --git a/doc/images/shepherd-graph.dot b/doc/images/shepherd-graph.dot index cc9aa441a1..35b2794689 100644 --- a/doc/images/shepherd-graph.dot +++ b/doc/images/shepherd-graph.dot @@ -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]; } diff --git a/emacs/guix-about.el b/emacs/guix-about.el deleted file mode 100644 index 27a79fe162..0000000000 --- a/emacs/guix-about.el +++ /dev/null @@ -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 diff --git a/emacs/guix-backend.el b/emacs/guix-backend.el deleted file mode 100644 index 6341aacae1..0000000000 --- a/emacs/guix-backend.el +++ /dev/null @@ -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 diff --git a/emacs/guix-base.el b/emacs/guix-base.el deleted file mode 100644 index 658cfdb5fa..0000000000 --- a/emacs/guix-base.el +++ /dev/null @@ -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 diff --git a/emacs/guix-buffer.el b/emacs/guix-buffer.el deleted file mode 100644 index 4cefe9989e..0000000000 --- a/emacs/guix-buffer.el +++ /dev/null @@ -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 diff --git a/emacs/guix-build-log.el b/emacs/guix-build-log.el deleted file mode 100644 index f67be16326..0000000000 --- a/emacs/guix-build-log.el +++ /dev/null @@ -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 diff --git a/emacs/guix-command.el b/emacs/guix-command.el deleted file mode 100644 index 7069c51649..0000000000 --- a/emacs/guix-command.el +++ /dev/null @@ -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 diff --git a/emacs/guix-config.el.in b/emacs/guix-config.el.in deleted file mode 100644 index c09c2fe86a..0000000000 --- a/emacs/guix-config.el.in +++ /dev/null @@ -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 diff --git a/emacs/guix-devel.el b/emacs/guix-devel.el deleted file mode 100644 index b71670cdfb..0000000000 --- a/emacs/guix-devel.el +++ /dev/null @@ -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 diff --git a/emacs/guix-entry.el b/emacs/guix-entry.el deleted file mode 100644 index 5eed2ed015..0000000000 --- a/emacs/guix-entry.el +++ /dev/null @@ -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 diff --git a/emacs/guix-external.el b/emacs/guix-external.el deleted file mode 100644 index f571ffd845..0000000000 --- a/emacs/guix-external.el +++ /dev/null @@ -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 diff --git a/emacs/guix-geiser.el b/emacs/guix-geiser.el deleted file mode 100644 index 833f5bb2b3..0000000000 --- a/emacs/guix-geiser.el +++ /dev/null @@ -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 diff --git a/emacs/guix-guile.el b/emacs/guix-guile.el deleted file mode 100644 index 792f825ca5..0000000000 --- a/emacs/guix-guile.el +++ /dev/null @@ -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 diff --git a/emacs/guix-help-vars.el b/emacs/guix-help-vars.el deleted file mode 100644 index 8117d28f3e..0000000000 --- a/emacs/guix-help-vars.el +++ /dev/null @@ -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 diff --git a/emacs/guix-helper.scm.in b/emacs/guix-helper.scm.in deleted file mode 100644 index 0bbd36be21..0000000000 --- a/emacs/guix-helper.scm.in +++ /dev/null @@ -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") - diff --git a/emacs/guix-history.el b/emacs/guix-history.el deleted file mode 100644 index 5d301a689e..0000000000 --- a/emacs/guix-history.el +++ /dev/null @@ -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 diff --git a/emacs/guix-hydra-build.el b/emacs/guix-hydra-build.el deleted file mode 100644 index 232221e773..0000000000 --- a/emacs/guix-hydra-build.el +++ /dev/null @@ -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 diff --git a/emacs/guix-hydra-jobset.el b/emacs/guix-hydra-jobset.el deleted file mode 100644 index a4a55a36f2..0000000000 --- a/emacs/guix-hydra-jobset.el +++ /dev/null @@ -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 diff --git a/emacs/guix-hydra.el b/emacs/guix-hydra.el deleted file mode 100644 index 9f876e7eea..0000000000 --- a/emacs/guix-hydra.el +++ /dev/null @@ -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 diff --git a/emacs/guix-info.el b/emacs/guix-info.el deleted file mode 100644 index 6aefd2f3f6..0000000000 --- a/emacs/guix-info.el +++ /dev/null @@ -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 diff --git a/emacs/guix-init.el b/emacs/guix-init.el deleted file mode 100644 index bd75e54e03..0000000000 --- a/emacs/guix-init.el +++ /dev/null @@ -1,3 +0,0 @@ -(require 'guix-autoloads) -(message "(require 'guix-init) is obsolete, use (require 'guix-autoloads) instead.") -(provide 'guix-init) diff --git a/emacs/guix-license.el b/emacs/guix-license.el deleted file mode 100644 index 6003a21aac..0000000000 --- a/emacs/guix-license.el +++ /dev/null @@ -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 diff --git a/emacs/guix-list.el b/emacs/guix-list.el deleted file mode 100644 index c91c67cb29..0000000000 --- a/emacs/guix-list.el +++ /dev/null @@ -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 diff --git a/emacs/guix-location.el b/emacs/guix-location.el deleted file mode 100644 index 81396b4017..0000000000 --- a/emacs/guix-location.el +++ /dev/null @@ -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 diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm deleted file mode 100644 index 040932f307..0000000000 --- a/emacs/guix-main.scm +++ /dev/null @@ -1,1163 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. - -;;; Commentary: - -;; Information about packages and generations is passed to the elisp -;; side in the form of alists of parameters (such as ‘name’ or -;; ‘version’) and their values. - -;; ‘entries’ procedure is the “entry point” for the elisp side to get -;; information about packages and generations. - -;; Since name/version pair is not necessarily unique, we use -;; `object-address' to identify a package (for ‘id’ parameter), if -;; possible. However for the obsolete packages (that can be found in -;; installed manifest but not in a package directory), ‘id’ parameter is -;; still "name-version" string. So ‘id’ package parameter in the code -;; below is either an object-address number or a full-name string. - -;;; Code: - -(use-modules - (ice-9 vlist) - (ice-9 match) - (ice-9 popen) - (srfi srfi-1) - (srfi srfi-2) - (srfi srfi-11) - (srfi srfi-19) - (srfi srfi-26) - (guix) - (guix combinators) - (guix git-download) - (guix grafts) - (guix packages) - (guix profiles) - (guix licenses) - (guix utils) - (guix ui) - (guix scripts) - (guix scripts package) - (gnu packages) - (gnu system)) - -(define-syntax-rule (first-or-false lst) - (and (not (null? lst)) - (first lst))) - -(define (list-maybe obj) - (if (list? obj) obj (list obj))) - -(define (output+error thunk) - "Call THUNK and return 2 values: output and error output as strings." - (let ((output-port (open-output-string)) - (error-port (open-output-string))) - (with-output-to-port output-port - (lambda () (with-error-to-port error-port thunk))) - (let ((strings (list (get-output-string output-port) - (get-output-string error-port)))) - (close-output-port output-port) - (close-output-port error-port) - (apply values strings)))) - -(define (full-name->name+version spec) - "Given package specification SPEC with or without output, -return two values: name and version. For example, for SPEC -\"foo@0.9.1b:lib\", return \"foo\" and \"0.9.1b\"." - (let-values (((name version output) - (package-specification->name+version+output spec))) - (values name version))) - -(define (name+version->full-name name version) - (string-append name "@" version)) - -(define* (make-package-specification name #:optional version output) - (let ((full-name (if version - (name+version->full-name name version) - name))) - (if output - (string-append full-name ":" output) - full-name))) - -(define (manifest-entry->name+version+output entry) - (values - (manifest-entry-name entry) - (manifest-entry-version entry) - (manifest-entry-output entry))) - -(define (manifest-entry->package-specification entry) - (call-with-values - (lambda () (manifest-entry->name+version+output entry)) - make-package-specification)) - -(define (manifest-entries->package-specifications entries) - (map manifest-entry->package-specification entries)) - -(define (profile-package-specifications profile) - "Return a list of package specifications for PROFILE." - (let ((manifest (profile-manifest profile))) - (manifest-entries->package-specifications - (manifest-entries manifest)))) - -(define (profile->specifications+paths profile) - "Return a list of package specifications and paths for PROFILE. -Each element of the list is a list of the package specification and its path." - (let ((manifest (profile-manifest profile))) - (map (lambda (entry) - (list (manifest-entry->package-specification entry) - (manifest-entry-item entry))) - (manifest-entries manifest)))) - -(define (profile-difference profile1 profile2) - "Return a list of package specifications for outputs installed in PROFILE1 -and not installed in PROFILE2." - (let ((specs1 (profile-package-specifications profile1)) - (specs2 (profile-package-specifications profile2))) - (lset-difference string=? specs1 specs2))) - -(define (manifest-entries->hash-table entries) - "Return a hash table of name keys and lists of matching manifest ENTRIES." - (let ((table (make-hash-table (length entries)))) - (for-each (lambda (entry) - (let* ((key (manifest-entry-name entry)) - (ref (hash-ref table key))) - (hash-set! table key - (if ref (cons entry ref) (list entry))))) - entries) - table)) - -(define (manifest=? m1 m2) - (or (eq? m1 m2) - (equal? m1 m2))) - -(define manifest->hash-table - (let ((current-manifest #f) - (current-table #f)) - (lambda (manifest) - "Return a hash table of name keys and matching MANIFEST entries." - (unless (manifest=? manifest current-manifest) - (set! current-manifest manifest) - (set! current-table (manifest-entries->hash-table - (manifest-entries manifest)))) - current-table))) - -(define* (manifest-entries-by-name manifest name #:optional version output) - "Return a list of MANIFEST entries matching NAME, VERSION and OUTPUT." - (let ((entries (or (hash-ref (manifest->hash-table manifest) name) - '()))) - (if (or version output) - (filter (lambda (entry) - (and (or (not version) - (equal? version (manifest-entry-version entry))) - (or (not output) - (equal? output (manifest-entry-output entry))))) - entries) - entries))) - -(define (manifest-entry-by-output entries output) - "Return a manifest entry from ENTRIES matching OUTPUT." - (find (lambda (entry) - (string= output (manifest-entry-output entry))) - entries)) - -(define (fold-manifest-by-name manifest proc init) - "Fold over MANIFEST entries. -Call (PROC NAME VERSION ENTRIES RESULT), using INIT as the initial value -of RESULT. ENTRIES is a list of manifest entries with NAME/VERSION." - (hash-fold (lambda (name entries res) - (proc name (manifest-entry-version (car entries)) - entries res)) - init - (manifest->hash-table manifest))) - -(define* (object-transformer param-alist #:optional (params '())) - "Return procedure transforming objects into alist of parameter/value pairs. - -PARAM-ALIST is alist of available parameters (symbols) and procedures -returning values of these parameters. Each procedure is applied to -objects. - -PARAMS is list of parameters from PARAM-ALIST that should be returned by -a resulting procedure. If PARAMS is not specified or is an empty list, -use all available parameters. - -Example: - - (let* ((alist `((plus1 . ,1+) (minus1 . ,1-) (mul2 . ,(cut * 2 <>)))) - (number->alist (object-transformer alist '(plus1 mul2)))) - (number->alist 8)) - => - ((plus1 . 9) (mul2 . 16)) -" - (let* ((use-all-params (null? params)) - (alist (filter-map (match-lambda - ((param . proc) - (and (or use-all-params - (memq param params)) - (cons param proc))) - (_ #f)) - param-alist))) - (lambda objects - (map (match-lambda - ((param . proc) - (cons param (apply proc objects)))) - alist)))) - -(define %manifest-entry-param-alist - `((output . ,manifest-entry-output) - (path . ,manifest-entry-item) - (dependencies . ,manifest-entry-dependencies))) - -(define manifest-entry->sexp - (object-transformer %manifest-entry-param-alist)) - -(define (manifest-entries->sexps entries) - (map manifest-entry->sexp entries)) - -(define (package-inputs-names inputs) - "Return a list of full names of the packages from package INPUTS." - (filter-map (match-lambda - ((_ (? package? package)) - (make-package-specification (package-name package) - (package-version package))) - ((_ (? package? package) output) - (make-package-specification (package-name package) - (package-version package) - output)) - (_ #f)) - inputs)) - -(define (package-license-names package) - "Return a list of license names of the PACKAGE." - (filter-map (lambda (license) - (and (license? license) - (license-name license))) - (list-maybe (package-license package)))) - -(define (package-source-names package) - "Return a list of source names (URLs) of the PACKAGE." - (let ((source (package-source package))) - (and (origin? source) - (filter-map (lambda (uri) - (cond ((string? uri) - uri) - ((git-reference? uri) - (git-reference-url uri)) - (else "Unknown source type"))) - (list-maybe (origin-uri source)))))) - -(define (package-unique? package) - "Return #t if PACKAGE is a single package with such name/version." - (match (packages-by-name (package-name package) - (package-version package)) - ((package) #t) - (_ #f))) - -(define %package-param-alist - `((id . ,object-address) - (package-id . ,object-address) - (name . ,package-name) - (version . ,package-version) - (license . ,package-license-names) - (source . ,package-source-names) - (synopsis . ,package-synopsis) - (description . ,package-description-string) - (home-url . ,package-home-page) - (outputs . ,package-outputs) - (systems . ,package-supported-systems) - (non-unique . ,(negate package-unique?)) - (inputs . ,(lambda (pkg) - (package-inputs-names - (package-inputs pkg)))) - (native-inputs . ,(lambda (pkg) - (package-inputs-names - (package-native-inputs pkg)))) - (propagated-inputs . ,(lambda (pkg) - (package-inputs-names - (package-propagated-inputs pkg)))) - (location . ,(lambda (pkg) - (location->string (package-location pkg)))))) - -(define (package-param package param) - "Return a value of a PACKAGE PARAM." - (and=> (assq-ref %package-param-alist param) - (cut <> package))) - - -;;; Finding packages. - -(define-values (package-by-address - register-package) - (let ((table (delay (fold-packages - (lambda (package table) - (vhash-consq (object-address package) - package table)) - vlist-null)))) - (values - (lambda (address) - "Return package by its object ADDRESS." - (match (vhash-assq address (force table)) - ((_ . package) package) - (_ #f))) - (lambda (package) - "Register PACKAGE by its 'object-address', so that later -'package-by-address' can be used to access it." - (let ((table* (force table))) - (set! table - (delay (vhash-consq (object-address package) - package table*)))))))) - -(define packages-by-name+version - (let ((table (delay (fold-packages - (lambda (package table) - (let ((file (location-file - (package-location package)))) - (vhash-cons (cons (package-name package) - (package-version package)) - package table))) - vlist-null)))) - (lambda (name version) - "Return packages matching NAME and VERSION." - (vhash-fold* cons '() (cons name version) (force table))))) - -(define (packages-by-full-name full-name) - (call-with-values - (lambda () (full-name->name+version full-name)) - packages-by-name+version)) - -(define (packages-by-id id) - (if (integer? id) - (let ((pkg (package-by-address id))) - (if pkg (list pkg) '())) - (packages-by-full-name id))) - -(define (id->name+version id) - (if (integer? id) - (and=> (package-by-address id) - (lambda (pkg) - (values (package-name pkg) - (package-version pkg)))) - (full-name->name+version id))) - -(define (package-by-id id) - (first-or-false (packages-by-id id))) - -(define (newest-package-by-id id) - (and=> (id->name+version id) - (lambda (name) - (first-or-false (find-best-packages-by-name name #f))))) - -(define (matching-packages predicate) - (fold-packages (lambda (pkg res) - (if (predicate pkg) - (cons pkg res) - res)) - '())) - -(define (filter-packages-by-output packages output) - (filter (lambda (package) - (member output (package-outputs package))) - packages)) - -(define* (packages-by-name name #:optional version output) - "Return a list of packages matching NAME, VERSION and OUTPUT." - (let ((packages (if version - (packages-by-name+version name version) - (matching-packages - (lambda (pkg) (string=? name (package-name pkg))))))) - (if output - (filter-packages-by-output packages output) - packages))) - -(define (manifest-entry->packages entry) - (call-with-values - (lambda () (manifest-entry->name+version+output entry)) - packages-by-name)) - -(define (packages-by-regexp regexp match-params) - "Return a list of packages matching REGEXP string. -MATCH-PARAMS is a list of parameters that REGEXP can match." - (define (package-match? package regexp) - (any (lambda (param) - (let ((val (package-param package param))) - (and (string? val) (regexp-exec regexp val)))) - match-params)) - - (let ((re (make-regexp regexp regexp/icase))) - (matching-packages (cut package-match? <> re)))) - -(define (packages-by-license license) - "Return a list of packages with LICENSE." - (matching-packages - (lambda (package) - (memq license (list-maybe (package-license package)))))) - -(define (all-available-packages) - "Return a list of all available packages." - (matching-packages (const #t))) - -(define (newest-available-packages) - "Return a list of the newest available packages." - (vhash-fold (lambda (name elem res) - (match elem - ((_ newest pkgs ...) - (cons newest res)))) - '() - (find-newest-available-packages))) - -(define (packages-from-file file) - "Return a list of packages from FILE." - (let ((package (load (canonicalize-path file)))) - (if (package? package) - (begin - (register-package package) - (list package)) - '()))) - - -;;; Making package/output patterns. - -(define (specification->package-pattern specification) - (call-with-values - (lambda () - (full-name->name+version specification)) - list)) - -(define (specification->output-pattern specification) - (call-with-values - (lambda () - (package-specification->name+version+output specification #f)) - list)) - -(define (id->package-pattern id) - (if (integer? id) - (package-by-address id) - (specification->package-pattern id))) - -(define (id->output-pattern id) - "Return an output pattern by output ID. -ID should be '<package-address>:<output>' or '<name>-<version>:<output>'." - (let-values (((name version output) - (package-specification->name+version+output id))) - (if version - (list name version output) - (list (package-by-address (string->number name)) - output)))) - -(define (specifications->package-patterns . specifications) - (map specification->package-pattern specifications)) - -(define (specifications->output-patterns . specifications) - (map specification->output-pattern specifications)) - -(define (ids->package-patterns . ids) - (map id->package-pattern ids)) - -(define (ids->output-patterns . ids) - (map id->output-pattern ids)) - -(define* (manifest-patterns-result packages res obsolete-pattern - #:optional installed-pattern) - "Auxiliary procedure for 'manifest-package-patterns' and -'manifest-output-patterns'." - (if (null? packages) - (cons (obsolete-pattern) res) - (if installed-pattern - ;; We don't need duplicates for a list of installed packages, - ;; so just take any (car) package. - (cons (installed-pattern (car packages)) res) - res))) - -(define* (manifest-package-patterns manifest #:optional obsolete-only?) - "Return a list of package patterns for MANIFEST entries. -If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only -for obsolete packages." - (fold-manifest-by-name - manifest - (lambda (name version entries res) - (manifest-patterns-result (packages-by-name name version) - res - (lambda () (list name version entries)) - (and (not obsolete-only?) - (cut list <> entries)))) - '())) - -(define* (manifest-output-patterns manifest #:optional obsolete-only?) - "Return a list of output patterns for MANIFEST entries. -If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only -for obsolete packages." - (fold (lambda (entry res) - (manifest-patterns-result (manifest-entry->packages entry) - res - (lambda () entry) - (and (not obsolete-only?) - (cut list <> entry)))) - '() - (manifest-entries manifest))) - -(define (obsolete-package-patterns manifest) - (manifest-package-patterns manifest #t)) - -(define (obsolete-output-patterns manifest) - (manifest-output-patterns manifest #t)) - - -;;; Transforming package/output patterns into alists. - -(define (obsolete-package-sexp name version entries) - "Return an alist with information about obsolete package. -ENTRIES is a list of installed manifest entries." - `((id . ,(name+version->full-name name version)) - (name . ,name) - (version . ,version) - (outputs . ,(map manifest-entry-output entries)) - (obsolete . #t) - (installed . ,(manifest-entries->sexps entries)))) - -(define (package-pattern-transformer manifest params) - "Return 'package-pattern->package-sexps' procedure." - (define package->sexp - (object-transformer %package-param-alist params)) - - (define* (sexp-by-package package #:optional - (entries (manifest-entries-by-name - manifest - (package-name package) - (package-version package)))) - (cons (cons 'installed (manifest-entries->sexps entries)) - (package->sexp package))) - - (define (->sexps pattern) - (match pattern - ((? package? package) - (list (sexp-by-package package))) - (((? package? package) entries) - (list (sexp-by-package package entries))) - ((name version entries) - (list (obsolete-package-sexp - name version entries))) - ((name version) - (let ((packages (packages-by-name name version))) - (if (null? packages) - (let ((entries (manifest-entries-by-name - manifest name version))) - (if (null? entries) - '() - (list (obsolete-package-sexp - name version entries)))) - (map sexp-by-package packages)))) - (_ '()))) - - ->sexps) - -(define (output-pattern-transformer manifest params) - "Return 'output-pattern->output-sexps' procedure." - (define package->sexp - (object-transformer (alist-delete 'id %package-param-alist) - params)) - - (define manifest-entry->sexp - (object-transformer (alist-delete 'output %manifest-entry-param-alist) - params)) - - (define* (output-sexp pkg-alist pkg-address output - #:optional entry) - (let ((entry-alist (if entry - (manifest-entry->sexp entry) - '())) - (base `((id . ,(string-append - (number->string pkg-address) - ":" output)) - (output . ,output) - (installed . ,(->bool entry))))) - (append entry-alist base pkg-alist))) - - (define (obsolete-output-sexp entry) - (let-values (((name version output) - (manifest-entry->name+version+output entry))) - (let ((base `((id . ,(make-package-specification - name version output)) - (package-id . ,(name+version->full-name name version)) - (name . ,name) - (version . ,version) - (output . ,output) - (obsolete . #t) - (installed . #t)))) - (append (manifest-entry->sexp entry) base)))) - - (define* (sexps-by-package package #:optional output - (entries (manifest-entries-by-name - manifest - (package-name package) - (package-version package)))) - ;; Assuming that PACKAGE has this OUTPUT. - (let ((pkg-alist (package->sexp package)) - (address (object-address package)) - (outputs (if output - (list output) - (package-outputs package)))) - (map (lambda (output) - (output-sexp pkg-alist address output - (manifest-entry-by-output entries output))) - outputs))) - - (define* (sexps-by-manifest-entry entry #:optional - (packages (manifest-entry->packages - entry))) - (if (null? packages) - (list (obsolete-output-sexp entry)) - (map (lambda (package) - (output-sexp (package->sexp package) - (object-address package) - (manifest-entry-output entry) - entry)) - packages))) - - (define (->sexps pattern) - (match pattern - ((? package? package) - (sexps-by-package package)) - ((package (? string? output)) - (sexps-by-package package output)) - ((? manifest-entry? entry) - (list (obsolete-output-sexp entry))) - ((package entry) - (sexps-by-manifest-entry entry (list package))) - ((name version output) - (let ((packages (packages-by-name name version output))) - (if (null? packages) - (let ((entries (manifest-entries-by-name - manifest name version output))) - (append-map (cut sexps-by-manifest-entry <>) - entries)) - (append-map (cut sexps-by-package <> output) - packages)))) - (_ '()))) - - ->sexps) - -(define (entry-type-error entry-type) - (error (format #f "Wrong entry-type '~a'" entry-type))) - -(define (search-type-error entry-type search-type) - (error (format #f "Wrong search type '~a' for entry-type '~a'" - search-type entry-type))) - -(define %pattern-transformers - `((package . ,package-pattern-transformer) - (output . ,output-pattern-transformer))) - -(define (pattern-transformer entry-type) - (assq-ref %pattern-transformers entry-type)) - -;; All procedures from inner alists are called with (MANIFEST . SEARCH-VALS) -;; as arguments; see `package/output-sexps'. -(define %patterns-makers - (let* ((apply-to-rest (lambda (proc) - (lambda (_ . rest) (apply proc rest)))) - (apply-to-first (lambda (proc) - (lambda (first . _) (proc first)))) - (manifest-package-proc (apply-to-first manifest-package-patterns)) - (manifest-output-proc (apply-to-first manifest-output-patterns)) - (regexp-proc (lambda (_ regexp params . __) - (packages-by-regexp regexp params))) - (license-proc (lambda (_ license-name) - (packages-by-license - (lookup-license license-name)))) - (location-proc (lambda (_ location) - (packages-by-location-file location))) - (file-proc (lambda (_ file) - (packages-from-file file))) - (all-proc (lambda _ (all-available-packages))) - (newest-proc (lambda _ (newest-available-packages)))) - `((package - (id . ,(apply-to-rest ids->package-patterns)) - (name . ,(apply-to-rest specifications->package-patterns)) - (installed . ,manifest-package-proc) - (obsolete . ,(apply-to-first obsolete-package-patterns)) - (regexp . ,regexp-proc) - (license . ,license-proc) - (location . ,location-proc) - (from-file . ,file-proc) - (all-available . ,all-proc) - (newest-available . ,newest-proc)) - (output - (id . ,(apply-to-rest ids->output-patterns)) - (name . ,(apply-to-rest specifications->output-patterns)) - (installed . ,manifest-output-proc) - (obsolete . ,(apply-to-first obsolete-output-patterns)) - (regexp . ,regexp-proc) - (license . ,license-proc) - (location . ,location-proc) - (from-file . ,file-proc) - (all-available . ,all-proc) - (newest-available . ,newest-proc))))) - -(define (patterns-maker entry-type search-type) - (or (and=> (assq-ref %patterns-makers entry-type) - (cut assq-ref <> search-type)) - (search-type-error entry-type search-type))) - -(define (package/output-sexps profile params entry-type - search-type search-vals) - "Return information about packages or package outputs. -See 'entry-sexps' for details." - (let* ((manifest (profile-manifest profile)) - (patterns (if (and (eq? entry-type 'output) - (eq? search-type 'profile-diff)) - (match search-vals - ((p1 p2) - (map specification->output-pattern - (profile-difference p1 p2))) - (_ '())) - (apply (patterns-maker entry-type search-type) - manifest search-vals))) - (->sexps ((pattern-transformer entry-type) manifest params))) - (append-map ->sexps patterns))) - - -;;; Getting information about generations. - -(define (generation-param-alist profile) - "Return an alist of generation parameters and procedures for PROFILE." - (let ((current (generation-number profile))) - `((id . ,identity) - (number . ,identity) - (prev-number . ,(cut previous-generation-number profile <>)) - (current . ,(cut = current <>)) - (path . ,(cut generation-file-name profile <>)) - (time . ,(lambda (gen) - (time-second (generation-time profile gen))))))) - -(define (matching-generations profile predicate) - "Return a list of PROFILE generations matching PREDICATE." - (filter predicate (profile-generations profile))) - -(define (last-generations profile number) - "Return a list of last NUMBER generations. -If NUMBER is 0 or less, return all generations." - (let ((generations (profile-generations profile)) - (number (if (<= number 0) +inf.0 number))) - (if (> (length generations) number) - (list-head (reverse generations) number) - generations))) - -(define (find-generations profile search-type search-vals) - "Find PROFILE's generations matching SEARCH-TYPE and SEARCH-VALS." - (case search-type - ((id) - (matching-generations profile (cut memq <> search-vals))) - ((last) - (last-generations profile (car search-vals))) - ((all) - (last-generations profile +inf.0)) - ((time) - (match search-vals - ((from to) - (matching-generations - profile - (lambda (gen) - (let ((time (time-second (generation-time profile gen)))) - (< from time to))))) - (_ '()))) - (else (search-type-error "generation" search-type)))) - -(define (generation-sexps profile params search-type search-vals) - "Return information about generations. -See 'entry-sexps' for details." - (let ((generations (find-generations profile search-type search-vals)) - (->sexp (object-transformer (generation-param-alist profile) - params))) - (map ->sexp generations))) - -(define system-generation-boot-parameters - (memoize - (lambda (profile generation) - "Return boot parameters for PROFILE's system GENERATION." - (let* ((gen-file (generation-file-name profile generation)) - (param-file (string-append gen-file "/parameters"))) - (call-with-input-file param-file read-boot-parameters))))) - -(define (system-generation-param-alist profile) - "Return an alist of system generation parameters and procedures for -PROFILE." - (append (generation-param-alist profile) - `((label . ,(lambda (gen) - (boot-parameters-label - (system-generation-boot-parameters - profile gen)))) - (root-device . ,(lambda (gen) - (boot-parameters-root-device - (system-generation-boot-parameters - profile gen)))) - (kernel . ,(lambda (gen) - (boot-parameters-kernel - (system-generation-boot-parameters - profile gen))))))) - -(define (system-generation-sexps profile params search-type search-vals) - "Return an alist with information about system generations." - (let ((generations (find-generations profile search-type search-vals)) - (->sexp (object-transformer (system-generation-param-alist profile) - params))) - (map ->sexp generations))) - - -;;; Getting package/output/generation entries (alists). - -(define (entries profile params entry-type search-type search-vals) - "Return information about entries. - -ENTRY-TYPE is a symbol defining a type of returning information. Should -be: 'package', 'output' or 'generation'. - -SEARCH-TYPE and SEARCH-VALS define how to get the information. -SEARCH-TYPE should be one of the following symbols: - -- If ENTRY-TYPE is 'package' or 'output': - 'id', 'name', 'regexp', 'all-available', 'newest-available', - 'installed', 'obsolete', 'generation'. - -- If ENTRY-TYPE is 'generation': - 'id', 'last', 'all', 'time'. - -PARAMS is a list of parameters for receiving. If it is an empty list, -get information with all available parameters, which are: - -- If ENTRY-TYPE is 'package': - 'id', 'name', 'version', 'outputs', 'license', 'synopsis', - 'description', 'home-url', 'inputs', 'native-inputs', - 'propagated-inputs', 'location', 'installed'. - -- If ENTRY-TYPE is 'output': - 'id', 'package-id', 'name', 'version', 'output', 'license', - 'synopsis', 'description', 'home-url', 'inputs', 'native-inputs', - 'propagated-inputs', 'location', 'installed', 'path', 'dependencies'. - -- If ENTRY-TYPE is 'generation': - 'id', 'number', 'prev-number', 'path', 'time'. - -Returning value is a list of alists. Each alist consists of -parameter/value pairs." - (case entry-type - ((package output) - (package/output-sexps profile params entry-type - search-type search-vals)) - ((generation) - (generation-sexps profile params - search-type search-vals)) - ((system-generation) - (system-generation-sexps profile params - search-type search-vals)) - (else (entry-type-error entry-type)))) - - -;;; Package actions. - -(define* (package->manifest-entry* package #:optional output) - (and package - (package->manifest-entry package output))) - -(define* (make-install-manifest-entries id #:optional output) - (package->manifest-entry* (package-by-id id) output)) - -(define* (make-upgrade-manifest-entries id #:optional output) - (package->manifest-entry* (newest-package-by-id id) output)) - -(define* (make-manifest-pattern id #:optional output) - "Make manifest pattern from a package ID and OUTPUT." - (let-values (((name version) - (id->name+version id))) - (and name version - (manifest-pattern - (name name) - (version version) - (output output))))) - -(define (convert-action-pattern pattern proc) - "Convert action PATTERN into a list of objects returned by PROC. -PROC is called: (PROC ID) or (PROC ID OUTPUT)." - (match pattern - ((id . outputs) - (if (null? outputs) - (let ((obj (proc id))) - (if obj (list obj) '())) - (filter-map (cut proc id <>) - outputs))) - (_ '()))) - -(define (convert-action-patterns patterns proc) - (append-map (cut convert-action-pattern <> proc) - patterns)) - -(define* (process-package-actions - profile #:key (install '()) (upgrade '()) (remove '()) - (use-substitutes? #t) dry-run?) - "Perform package actions. - -INSTALL, UPGRADE, REMOVE are lists of 'package action patterns'. -Each pattern should have the following form: - - (ID . OUTPUTS) - -ID is an object address or a full-name of a package. -OUTPUTS is a list of package outputs (may be an empty list)." - (format #t "The process begins ...~%") - (let* ((install (append - (convert-action-patterns - install make-install-manifest-entries) - (convert-action-patterns - upgrade make-upgrade-manifest-entries))) - (remove (convert-action-patterns remove make-manifest-pattern)) - (transaction (manifest-transaction (install install) - (remove remove))) - (manifest (profile-manifest profile)) - (new-manifest (manifest-perform-transaction - manifest transaction))) - (unless (and (null? install) (null? remove)) - (parameterize ((%graft? (not dry-run?))) - (with-store store - (set-build-options store - #:print-build-trace #f - #:use-substitutes? use-substitutes?) - (show-manifest-transaction store manifest transaction - #:dry-run? dry-run?) - (build-and-use-profile store profile new-manifest - #:use-substitutes? use-substitutes? - #:dry-run? dry-run?)))))) - -(define (delete-generations* profile generations) - "Delete GENERATIONS from PROFILE. -GENERATIONS is a list of generation numbers." - (with-store store - (delete-generations store profile generations))) - -(define (package-location-string id-or-name) - "Return a location string of a package with ID-OR-NAME." - (and=> (or (package-by-id id-or-name) - (match (packages-by-name id-or-name) - (() #f) - ((package _ ...) package))) - (compose location->string package-location))) - -(define (package-store-path package-id) - "Return a list of store directories of outputs of package PACKAGE-ID." - (match (package-by-id package-id) - (#f '()) - (package - (with-store store - (map (match-lambda - ((_ . drv) - (derivation-output-path drv))) - (derivation-outputs (package-derivation store package))))))) - -(define (package-source-derivation->store-path derivation) - "Return a store path of the package source DERIVATION." - (match (derivation-outputs derivation) - ;; Source derivation is always (("out" . derivation)). - (((_ . output-drv)) - (derivation-output-path output-drv)) - (_ #f))) - -(define (package-source-path package-id) - "Return a store file path to a source of a package PACKAGE-ID." - (and-let* ((package (package-by-id package-id)) - (source (package-source package))) - (with-store store - (package-source-derivation->store-path - (package-source-derivation store source))))) - -(define* (package-source-build-derivation package-id #:key dry-run? - (use-substitutes? #t)) - "Build source derivation of a package PACKAGE-ID." - (and-let* ((package (package-by-id package-id)) - (source (package-source package))) - (with-store store - (let* ((derivation (package-source-derivation store source)) - (derivations (list derivation))) - (set-build-options store - #:print-build-trace #f - #:use-substitutes? use-substitutes?) - (show-what-to-build store derivations - #:use-substitutes? use-substitutes? - #:dry-run? dry-run?) - (unless dry-run? - (build-derivations store derivations)) - (format #t "The source store path: ~a~%" - (package-source-derivation->store-path derivation)))))) - -(define (package-build-log-file package-id) - "Return the build log file of a package PACKAGE-ID. -Return #f if the build log is not found." - (and-let* ((package (package-by-id package-id))) - (with-store store - (let* ((derivation (package-derivation store package)) - (file (derivation-file-name derivation))) - (or (log-file store file) - ((@@ (guix scripts build) log-url) store file)))))) - - -;;; Executing guix commands - -(define (guix-command . args) - "Run 'guix ARGS ...' command." - (catch 'quit - (lambda () (apply run-guix args)) - (const #t))) - -(define (guix-command-output . args) - "Return 2 strings with 'guix ARGS ...' output and error output." - (output+error - (lambda () - (parameterize ((guix-warning-port (current-error-port))) - (apply guix-command args))))) - -(define (help-string . commands) - "Return string with 'guix COMMANDS ... --help' output." - (apply guix-command-output `(,@commands "--help"))) - -(define (pipe-guix-output guix-args command-args) - "Run 'guix GUIX-ARGS ...' command and pipe its output to a shell command -defined by COMMAND-ARGS. -Return #t if the shell command was executed successfully." - (let ((pipe (apply open-pipe* OPEN_WRITE command-args))) - (with-output-to-port pipe - (lambda () (apply guix-command guix-args))) - (zero? (status:exit-val (close-pipe pipe))))) - - -;;; Lists of packages, lint checkers, etc. - -(define (graph-type-names) - "Return a list of names of available graph node types." - (map (@ (guix graph) node-type-name) - (@ (guix scripts graph) %node-types))) - -(define (refresh-updater-names) - "Return a list of names of available refresh updater types." - (map (@ (guix upstream) upstream-updater-name) - (@ (guix scripts refresh) %updaters))) - -(define (lint-checker-names) - "Return a list of names of available lint checkers." - (map (lambda (checker) - (symbol->string ((@ (guix scripts lint) lint-checker-name) - checker))) - (@ (guix scripts lint) %checkers))) - -(define (package-names) - "Return a list of names of available packages." - (delete-duplicates - (fold-packages (lambda (pkg res) - (cons (package-name pkg) res)) - '()))) - -;; See the comment to 'guix-package-names' function in "guix-popup.el". -(define (package-names-lists) - (map list (package-names))) - - -;;; Licenses - -(define %licenses - (delay - (filter license? - (module-map (lambda (_ var) - (variable-ref var)) - (resolve-interface '(guix licenses)))))) - -(define (licenses) - (force %licenses)) - -(define (license-names) - "Return a list of names of available licenses." - (map license-name (licenses))) - -(define lookup-license - (memoize - (lambda (name) - "Return a license by its name." - (find (lambda (l) - (string=? name (license-name l))) - (licenses))))) - -(define (lookup-license-uri name) - "Return a license URI by its name." - (and=> (lookup-license name) - license-uri)) - -(define %license-param-alist - `((id . ,license-name) - (name . ,license-name) - (url . ,license-uri) - (comment . ,license-comment))) - -(define license->sexp - (object-transformer %license-param-alist)) - -(define (find-licenses search-type . search-values) - "Return a list of licenses depending on SEARCH-TYPE and SEARCH-VALUES." - (case search-type - ((id name) - (let ((names search-values)) - (filter-map lookup-license names))) - ((all) - (licenses)))) - -(define (license-entries search-type . search-values) - (map license->sexp - (apply find-licenses search-type search-values))) - - -;;; Package locations - -(define-values (packages-by-location-file - package-location-files) - (let* ((table (delay (fold-packages - (lambda (package table) - (let ((file (location-file - (package-location package)))) - (vhash-cons file package table))) - vlist-null))) - (files (delay (vhash-fold - (lambda (file _ result) - (if (member file result) - result - (cons file result))) - '() - (force table))))) - (values - (lambda (file) - "Return the (possibly empty) list of packages defined in location FILE." - (vhash-fold* cons '() file (force table))) - (lambda () - "Return the list of file names of all package locations." - (force files))))) - -(define %package-location-param-alist - `((id . ,identity) - (location . ,identity) - (number-of-packages . ,(lambda (location) - (length (packages-by-location-file location)))))) - -(define package-location->sexp - (object-transformer %package-location-param-alist)) - -(define (package-location-entries) - (map package-location->sexp (package-location-files))) diff --git a/emacs/guix-messages.el b/emacs/guix-messages.el deleted file mode 100644 index 52436af9e4..0000000000 --- a/emacs/guix-messages.el +++ /dev/null @@ -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 diff --git a/emacs/guix-pcomplete.el b/emacs/guix-pcomplete.el deleted file mode 100644 index 785e54ef6d..0000000000 --- a/emacs/guix-pcomplete.el +++ /dev/null @@ -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 diff --git a/emacs/guix-popup.el b/emacs/guix-popup.el deleted file mode 100644 index 59e98a352e..0000000000 --- a/emacs/guix-popup.el +++ /dev/null @@ -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 diff --git a/emacs/guix-prettify.el b/emacs/guix-prettify.el deleted file mode 100644 index 38d72e860b..0000000000 --- a/emacs/guix-prettify.el +++ /dev/null @@ -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 diff --git a/emacs/guix-profiles.el b/emacs/guix-profiles.el deleted file mode 100644 index 12cf46dbf8..0000000000 --- a/emacs/guix-profiles.el +++ /dev/null @@ -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 diff --git a/emacs/guix-read.el b/emacs/guix-read.el deleted file mode 100644 index 5423c9bcfa..0000000000 --- a/emacs/guix-read.el +++ /dev/null @@ -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 diff --git a/emacs/guix-ui-generation.el b/emacs/guix-ui-generation.el deleted file mode 100644 index 67cf6294fb..0000000000 --- a/emacs/guix-ui-generation.el +++ /dev/null @@ -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 diff --git a/emacs/guix-ui-license.el b/emacs/guix-ui-license.el deleted file mode 100644 index cf1b5cd357..0000000000 --- a/emacs/guix-ui-license.el +++ /dev/null @@ -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 diff --git a/emacs/guix-ui-location.el b/emacs/guix-ui-location.el deleted file mode 100644 index 0027c1fba8..0000000000 --- a/emacs/guix-ui-location.el +++ /dev/null @@ -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 diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el deleted file mode 100644 index 4280246bb8..0000000000 --- a/emacs/guix-ui-package.el +++ /dev/null @@ -1,1191 +0,0 @@ -;;; guix-ui-package.el --- Interface for displaying packages -*- 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 packages and outputs -;; 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-base) -(require 'guix-backend) -(require 'guix-guile) -(require 'guix-entry) -(require 'guix-utils) -(require 'guix-hydra) -(require 'guix-hydra-build) -(require 'guix-read) -(require 'guix-license) -(require 'guix-location) -(require 'guix-profiles) - -(guix-ui-define-entry-type package) -(guix-ui-define-entry-type output) - -(defcustom guix-package-list-type 'output - "Define how to display packages in 'list' buffer. -Should be a symbol `package' or `output' (if `output', display each -output on a separate line; if `package', display each package on -a separate line)." - :type '(choice (const :tag "List of packages" package) - (const :tag "List of outputs" output)) - :group 'guix-package) - -(defcustom guix-package-info-type 'package - "Define how to display packages in 'info' buffer. -Should be a symbol `package' or `output' (if `output', display -each output separately; if `package', display outputs inside -package data)." - :type '(choice (const :tag "Display packages" package) - (const :tag "Display outputs" output)) - :group 'guix-package) - -(defun guix-package-get-display (profile search-type &rest search-values) - "Search for packages/outputs 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. - -Results are displayed in the list buffer, unless a single package -is found and `guix-package-list-single' is nil." - (let* ((args (cl-list* (or profile guix-current-profile) - search-type search-values)) - (entries (guix-buffer-get-entries - 'list guix-package-list-type args))) - (if (or guix-package-list-single - (null entries) - (cdr entries)) - (guix-buffer-display-entries - entries 'list guix-package-list-type args 'add) - (guix-buffer-get-display-entries - 'info guix-package-info-type args 'add)))) - -(defun guix-package-entry->name-specification (entry &optional output) - "Return name specification of the package ENTRY and OUTPUT." - (guix-package-name-specification - (guix-entry-value entry 'name) - (guix-entry-value entry 'version) - (or output (guix-entry-value entry 'output)))) - -(defun guix-package-entries->name-specifications (entries) - "Return name specifications by the package or output ENTRIES." - (cl-remove-duplicates (mapcar #'guix-package-entry->name-specification - entries) - :test #'string=)) - -(defun guix-package-installed-outputs (entry) - "Return a list of installed outputs for the package ENTRY." - (mapcar (lambda (installed-entry) - (guix-entry-value installed-entry 'output)) - (guix-entry-value entry 'installed))) - -(defun guix-package-id-and-output-by-output-id (output-id) - "Return a list (PACKAGE-ID OUTPUT) by OUTPUT-ID." - (cl-multiple-value-bind (package-id-str output) - (split-string output-id ":") - (let ((package-id (string-to-number package-id-str))) - (list (if (= 0 package-id) package-id-str package-id) - output)))) - -(defun guix-package-build-log-file (id) - "Return build log file name of a package defined by ID." - (guix-eval-read - (guix-make-guile-expression 'package-build-log-file id))) - -(defun guix-package-find-build-log (id) - "Show build log of a package defined by ID." - (require 'guix-build-log) - (let ((file (guix-package-build-log-file id))) - (if file - (guix-build-log-find-file file) - (message "Couldn't find the package build log.")))) - - -;;; Processing package actions - -(defun guix-process-package-actions (profile actions - &optional operation-buffer) - "Process package ACTIONS on PROFILE. -Each action is a list of the form: - - (ACTION-TYPE PACKAGE-SPEC ...) - -ACTION-TYPE is one of the following symbols: `install', -`upgrade', `remove'/`delete'. -PACKAGE-SPEC should have the following form: (ID [OUTPUT] ...)." - (let (install upgrade remove) - (mapc (lambda (action) - (let ((action-type (car action)) - (specs (cdr action))) - (cl-case action-type - (install (setq install (append install specs))) - (upgrade (setq upgrade (append upgrade specs))) - ((remove delete) (setq remove (append remove specs)))))) - actions) - (when (guix-continue-package-operation-p - profile - :install install :upgrade upgrade :remove remove) - (guix-eval-in-repl - (guix-make-guile-expression - 'process-package-actions profile - :install install :upgrade upgrade :remove remove - :use-substitutes? (or guix-use-substitutes 'f) - :dry-run? (or guix-dry-run 'f)) - (and (not guix-dry-run) operation-buffer))))) - -(cl-defun guix-continue-package-operation-p (profile - &key install upgrade remove) - "Return non-nil if a package operation should be continued. -Ask a user if needed (see `guix-operation-confirm'). -INSTALL, UPGRADE, REMOVE are 'package action specifications'. -See `guix-process-package-actions' for details." - (or (null guix-operation-confirm) - (let* ((entries (guix-ui-get-entries - profile 'package 'id - (append (mapcar #'car install) - (mapcar #'car upgrade) - (mapcar #'car remove)) - '(id name version location))) - (install-strings (guix-get-package-strings install entries)) - (upgrade-strings (guix-get-package-strings upgrade entries)) - (remove-strings (guix-get-package-strings remove entries))) - (if (or install-strings upgrade-strings remove-strings) - (let ((buf (get-buffer-create guix-temp-buffer-name))) - (with-current-buffer buf - (setq-local cursor-type nil) - (setq buffer-read-only nil) - (erase-buffer) - (insert "Profile: " profile "\n\n") - (guix-insert-package-strings install-strings "install") - (guix-insert-package-strings upgrade-strings "upgrade") - (guix-insert-package-strings remove-strings "remove") - (let ((win (temp-buffer-window-show - buf - '((display-buffer-reuse-window - display-buffer-at-bottom) - (window-height . fit-window-to-buffer))))) - (prog1 (guix-operation-prompt) - (quit-window nil win))))) - (message "Nothing to be done. -If Guix REPL was restarted, the data is not up-to-date.") - nil)))) - -(defun guix-get-package-strings (specs entries) - "Return short package descriptions for performing package actions. -See `guix-process-package-actions' for the meaning of SPECS. -ENTRIES is a list of package entries to get info about packages." - (delq nil - (mapcar - (lambda (spec) - (let* ((id (car spec)) - (outputs (cdr spec)) - (entry (guix-entry-by-id id entries))) - (when entry - (let ((location (guix-entry-value entry 'location))) - (concat (guix-package-entry->name-specification entry) - (when outputs - (concat ":" - (guix-concat-strings outputs ","))) - (when location - (concat "\t(" location ")"))))))) - specs))) - -(defun guix-insert-package-strings (strings action) - "Insert information STRINGS at point for performing package ACTION." - (when strings - (insert "Package(s) to " (propertize action 'face 'bold) ":\n") - (mapc (lambda (str) - (insert " " str "\n")) - strings) - (insert "\n"))) - - -;;; Package 'info' - -(guix-ui-info-define-interface package - :buffer-name "*Guix Package Info*" - :format '(guix-package-info-insert-heading - ignore - (synopsis ignore (simple guix-package-info-synopsis)) - ignore - (description ignore (simple guix-package-info-description)) - ignore - (outputs simple guix-package-info-insert-outputs) - guix-package-info-insert-misc - (source simple guix-package-info-insert-source) - (location simple guix-package-info-insert-location) - (home-url format (format guix-url)) - (license format (format guix-package-license)) - (systems format guix-package-info-insert-systems) - (inputs format (format guix-package-input)) - (native-inputs format (format guix-package-native-input)) - (propagated-inputs format - (format guix-package-propagated-input))) - :titles '((home-url . "Home page") - (systems . "Supported systems")) - :required '(id name version installed non-unique)) - -(guix-info-define-interface installed-output - :format '((path simple (indent guix-file)) - (dependencies simple (indent guix-file))) - :titles '((path . "Store directory")) - :reduced? t) - -(defface guix-package-info-heading - '((t :inherit guix-info-heading)) - "Face for package name and version headings." - :group 'guix-package-info-faces) - -(defface guix-package-info-name - '((t :inherit font-lock-keyword-face)) - "Face used for a name of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-name-button - '((t :inherit button)) - "Face used for a full name that can be used to describe a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-version - '((t :inherit font-lock-builtin-face)) - "Face used for a version of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-synopsis - '((((type tty pc) (class color)) :weight bold) - (t :height 1.1 :weight bold :inherit variable-pitch)) - "Face used for a synopsis of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-description - '((t)) - "Face used for a description of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-license - '((t :inherit font-lock-string-face)) - "Face used for a license of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-location - '((t :inherit link)) - "Face used for a location of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-source - '((t :inherit link :underline nil)) - "Face used for a source URL of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-installed-outputs - '((default :weight bold) - (((class color) (min-colors 88) (background light)) - :foreground "ForestGreen") - (((class color) (min-colors 88) (background dark)) - :foreground "PaleGreen") - (((class color) (min-colors 8)) - :foreground "green") - (t :underline t)) - "Face used for installed outputs of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-uninstalled-outputs - '((t :weight bold)) - "Face used for uninstalled outputs of a package." - :group 'guix-package-info-faces) - -(defface guix-package-info-obsolete - '((t :inherit error)) - "Face used if a package is obsolete." - :group 'guix-package-info-faces) - -(defcustom guix-package-info-auto-find-package t - "If non-nil, open store directory after pressing \"Show\" package button. -If nil, just display the store directory (or directories) without finding." - :type 'boolean - :group 'guix-package-info) - -(defcustom guix-package-info-auto-find-source nil - "If non-nil, open source file after pressing \"Show\" source button. -If nil, just display the source file name without finding." - :type 'boolean - :group 'guix-package-info) - -(defcustom guix-package-info-auto-download-source t - "If nil, do not automatically download a source file if it doesn't exist. -After pressing a \"Show\" button, a derivation of the package -source is calculated and a store file path is displayed. If this -variable is non-nil and the source file does not exist in the -store, it will be automatically downloaded (with a possible -prompt depending on `guix-operation-confirm' variable)." - :type 'boolean - :group 'guix-package-info) - -(defcustom guix-package-info-button-functions - '(guix-package-info-insert-build-button - guix-package-info-insert-build-log-button) - "List of functions used to insert package buttons in Info buffer. -Each function is called with 2 arguments: package ID and full name." - :type '(repeat function) - :group 'guix-package-info) - -(defvar guix-package-info-download-buffer nil - "Buffer from which a current download operation was performed.") - -(defvar guix-package-info-output-format "%-10s" - "String used to format output names of the packages. -It should be a '%s'-sequence. After inserting an output name -formatted with this string, an action button is inserted.") - -(defvar guix-package-info-obsolete-string "(This package is obsolete)" - "String used if a package is obsolete.") - -(define-button-type 'guix-package-location - :supertype 'guix - 'face 'guix-package-info-location - 'help-echo "Find location of this package" - 'action (lambda (btn) - (guix-find-location (button-label btn)))) - -(define-button-type 'guix-package-license - :supertype 'guix - 'face 'guix-package-info-license - 'help-echo "Display license info" - 'action (lambda (btn) - (require 'guix-ui-license) - (guix-buffer-get-display-entries - 'info 'license - (list 'name (button-label btn)) - 'add))) - -(define-button-type 'guix-package-name - :supertype 'guix - 'face 'guix-package-info-name-button - 'help-echo "Describe this package" - 'action (lambda (btn) - (guix-buffer-get-display-entries-current - 'info guix-package-info-type - (list (guix-ui-current-profile) - 'name (or (button-get btn 'spec) - (button-label btn))) - 'add))) - -(define-button-type 'guix-package-heading - :supertype 'guix-package-name - 'face 'guix-package-info-heading) - -(define-button-type 'guix-package-source - :supertype 'guix - 'face 'guix-package-info-source - 'help-echo "" - 'action (lambda (_) - ;; As a source may not be a real URL (e.g., "mirror://..."), - ;; no action is bound to a source button. - (message "Yes, this is the source URL. What did you expect?"))) - -(defun guix-package-info-insert-heading (entry) - "Insert package ENTRY heading (name and version) at point." - (guix-insert-button - (concat (guix-entry-value entry 'name) " " - (guix-entry-value entry 'version)) - 'guix-package-heading - 'spec (guix-package-entry->name-specification entry))) - -(defun guix-package-info-insert-location (location &optional _) - "Insert package LOCATION at point." - (if (null location) - (guix-format-insert nil) - (let ((location-file (car (split-string location ":")))) - (guix-info-insert-value-indent location 'guix-package-location) - ;; Do not show "Packages" button if a package 'from file' is displayed. - (unless (eq (guix-ui-current-search-type) 'from-file) - (guix-info-insert-indent) - (guix-info-insert-action-button - "Packages" - (lambda (btn) - (guix-package-get-display (guix-ui-current-profile) - 'location - (button-get btn 'location))) - (format "Display packages from location '%s'" location-file) - 'location location-file))))) - -(defun guix-package-info-insert-systems (systems entry) - "Insert supported package SYSTEMS at point." - (guix-info-insert-value-format - systems 'guix-hydra-build-system - 'action (lambda (btn) - (let ((args (guix-hydra-build-latest-prompt-args - :job (button-get btn 'job-name) - :system (button-label btn)))) - (apply #'guix-hydra-build-get-display - 'latest args))) - 'job-name (guix-hydra-job-name-specification - (guix-entry-value entry 'name) - (guix-entry-value entry 'version)))) - -(defmacro guix-package-info-define-insert-inputs (&optional type) - "Define a face and a function for inserting package inputs. -TYPE is a type of inputs. -Function name is `guix-package-info-insert-TYPE-inputs'. -Face name is `guix-package-info-TYPE-inputs'." - (let* ((type-str (symbol-name type)) - (type-name (and type (concat type-str "-"))) - (type-desc (and type (concat type-str " "))) - (face (intern (concat "guix-package-info-" type-name "inputs"))) - (btn (intern (concat "guix-package-" type-name "input")))) - `(progn - (defface ,face - '((t :inherit guix-package-info-name-button)) - ,(concat "Face used for " type-desc "inputs of a package.") - :group 'guix-package-info-faces) - - (define-button-type ',btn - :supertype 'guix-package-name - 'face ',face)))) - -(guix-package-info-define-insert-inputs) -(guix-package-info-define-insert-inputs native) -(guix-package-info-define-insert-inputs propagated) - -(defun guix-package-info-insert-outputs (outputs entry) - "Insert OUTPUTS from package ENTRY at point." - (and (guix-entry-value entry 'obsolete) - (guix-package-info-insert-obsolete-text)) - (and (guix-entry-value entry 'non-unique) - (guix-entry-value entry 'installed) - (guix-package-info-insert-non-unique-text - (guix-package-entry->name-specification entry))) - (insert "\n") - (dolist (output outputs) - (guix-package-info-insert-output output entry))) - -(defun guix-package-info-insert-obsolete-text () - "Insert a message about obsolete package at point." - (guix-info-insert-indent) - (guix-format-insert guix-package-info-obsolete-string - 'guix-package-info-obsolete)) - -(defun guix-package-info-insert-non-unique-text (full-name) - "Insert a message about non-unique package with FULL-NAME at point." - (insert "\n") - (guix-info-insert-indent) - (insert "Installed outputs are displayed for a non-unique ") - (guix-insert-button full-name 'guix-package-name) - (insert " package.")) - -(defun guix-package-info-insert-output (output entry) - "Insert OUTPUT at point. -Make some fancy text with buttons and additional stuff if the -current OUTPUT is installed (if there is such output in -`installed' parameter of a package ENTRY)." - (let* ((installed (guix-entry-value entry 'installed)) - (obsolete (guix-entry-value entry 'obsolete)) - (installed-entry (cl-find-if - (lambda (entry) - (string= (guix-entry-value entry 'output) - output)) - installed)) - (action-type (if installed-entry 'delete 'install)) - (profile (guix-ui-current-profile))) - (guix-info-insert-indent) - (guix-format-insert output - (if installed-entry - 'guix-package-info-installed-outputs - 'guix-package-info-uninstalled-outputs) - guix-package-info-output-format) - ;; Do not allow a user to install/delete anything to/from a system - ;; profile, so add action buttons only for non-system profiles. - (when (and profile - (not (guix-system-profile? profile))) - (guix-package-info-insert-action-button action-type entry output) - (when obsolete - (guix-info-insert-indent) - (guix-package-info-insert-action-button 'upgrade entry output))) - (insert "\n") - (when installed-entry - (guix-info-insert-entry installed-entry 'installed-output 2)))) - -(defun guix-package-info-insert-action-button (type entry output) - "Insert button to process an action on a package OUTPUT at point. -TYPE is one of the following symbols: `install', `delete', `upgrade'. -ENTRY is an alist with package info." - (let ((type-str (capitalize (symbol-name type))) - (full-name (guix-package-entry->name-specification entry output))) - (guix-info-insert-action-button - type-str - (lambda (btn) - (guix-process-package-actions - (guix-ui-current-profile) - `((,(button-get btn 'action-type) (,(button-get btn 'id) - ,(button-get btn 'output)))) - (current-buffer))) - (concat type-str " '" full-name "'") - 'action-type type - 'id (or (guix-entry-value entry 'package-id) - (guix-entry-id entry)) - 'output output))) - -(defun guix-package-info-show-store-path (entry-id package-id) - "Show store directories of the package outputs in the current buffer. -ENTRY-ID is an ID of the current entry (package or output). -PACKAGE-ID is an ID of the package which store path to show." - (let* ((entries (guix-buffer-current-entries)) - (entry (guix-entry-by-id entry-id entries)) - (dirs (guix-package-store-path package-id))) - (or dirs - (error "Couldn't define store directory of the package")) - (let* ((new-entry (cons (cons 'store-path dirs) - entry)) - (new-entries (guix-replace-entry entry-id new-entry entries))) - (setf (guix-buffer-item-entries guix-buffer-item) - new-entries) - (guix-buffer-redisplay-goto-button) - (let ((dir (car dirs))) - (if (file-exists-p dir) - (if guix-package-info-auto-find-package - (find-file dir) - (message nil)) - (message "'%s' does not exist.\nTry to build this package." - dir)))))) - -(defun guix-package-info-insert-misc (entry) - "Insert various buttons and other info for package ENTRY at point." - (if (guix-entry-value entry 'obsolete) - (guix-format-insert nil) - (let* ((entry-id (guix-entry-id entry)) - (package-id (or (guix-entry-value entry 'package-id) - entry-id)) - (full-name (guix-package-entry->name-specification entry)) - (store-path (guix-entry-value entry 'store-path))) - (guix-info-insert-title-simple "Package") - (if store-path - (guix-info-insert-value-indent store-path 'guix-file) - (guix-info-insert-action-button - "Show" - (lambda (btn) - (guix-package-info-show-store-path - (button-get btn 'entry-id) - (button-get btn 'package-id))) - "Show the store directory of the current package" - 'entry-id entry-id - 'package-id package-id)) - (when guix-package-info-button-functions - (insert "\n") - (guix-mapinsert (lambda (fun) - (funcall fun package-id full-name)) - guix-package-info-button-functions - (guix-info-get-indent) - :indent guix-info-indent - :column (guix-info-fill-column)))))) - -(defun guix-package-info-insert-build-button (id full-name) - "Insert button to build a package defined by ID." - (guix-info-insert-action-button - "Build" - (lambda (btn) - (guix-build-package (button-get btn 'id) - (format "Build '%s' package?" full-name))) - (format "Build the current package") - 'id id)) - -(defun guix-package-info-insert-build-log-button (id _name) - "Insert button to show build log of a package defined by ID." - (guix-info-insert-action-button - "Build Log" - (lambda (btn) - (guix-package-find-build-log (button-get btn 'id))) - "View build log of the current package" - 'id id)) - -(defun guix-package-info-show-source (entry-id package-id) - "Show file name of a package source in the current info buffer. -Find the file if needed (see `guix-package-info-auto-find-source'). -ENTRY-ID is an ID of the current entry (package or output). -PACKAGE-ID is an ID of the package which source to show." - (let* ((entries (guix-buffer-current-entries)) - (entry (guix-entry-by-id entry-id entries)) - (file (guix-package-source-path package-id))) - (or file - (error "Couldn't define file name of the package source")) - (let* ((new-entry (cons (cons 'source-file file) - entry)) - (new-entries (guix-replace-entry entry-id new-entry entries))) - (setf (guix-buffer-item-entries guix-buffer-item) - new-entries) - (guix-buffer-redisplay-goto-button) - (if (file-exists-p file) - (if guix-package-info-auto-find-source - (guix-find-file file) - (message "The source store path is displayed.")) - (if guix-package-info-auto-download-source - (guix-package-info-download-source package-id) - (message "The source does not exist in the store.")))))) - -(defun guix-package-info-download-source (package-id) - "Download a source of the package PACKAGE-ID." - (setq guix-package-info-download-buffer (current-buffer)) - (guix-package-source-build-derivation - package-id - "The source does not exist in the store. Download it?")) - -(defun guix-package-info-insert-source (source entry) - "Insert SOURCE from package ENTRY at point. -SOURCE is a list of URLs." - (if (null source) - (guix-format-insert nil) - (let* ((source-file (guix-entry-value entry 'source-file)) - (entry-id (guix-entry-id entry)) - (package-id (or (guix-entry-value entry 'package-id) - entry-id))) - (if (null source-file) - (guix-info-insert-action-button - "Show" - (lambda (btn) - (guix-package-info-show-source (button-get btn 'entry-id) - (button-get btn 'package-id))) - "Show the source store directory of the current package" - 'entry-id entry-id - 'package-id package-id) - (unless (file-exists-p source-file) - (guix-info-insert-action-button - "Download" - (lambda (btn) - (guix-package-info-download-source - (button-get btn 'package-id))) - "Download the source into the store" - 'package-id package-id)) - (guix-info-insert-value-indent source-file 'guix-file)) - (guix-info-insert-value-indent source 'guix-package-source)))) - -(defun guix-package-info-redisplay-after-download () - "Redisplay an 'info' buffer after downloading the package source. -This function is used to hide a \"Download\" button if needed." - (when (buffer-live-p guix-package-info-download-buffer) - (with-current-buffer guix-package-info-download-buffer - (guix-buffer-redisplay-goto-button)) - (setq guix-package-info-download-buffer nil))) - -(add-hook 'guix-after-source-download-hook - 'guix-package-info-redisplay-after-download) - - -;;; Package 'list' - -(guix-ui-list-define-interface package - :buffer-name "*Guix Package List*" - :format '((name guix-package-list-get-name 20 t) - (version nil 10 nil) - (outputs nil 13 t) - (installed guix-package-list-get-installed-outputs 13 t) - (synopsis guix-list-get-one-line 30 nil)) - :sort-key '(name) - :marks '((install . ?I) - (upgrade . ?U) - (delete . ?D))) - -(let ((map guix-package-list-mode-map)) - (define-key map (kbd "B") 'guix-package-list-latest-builds) - (define-key map (kbd "e") 'guix-package-list-edit) - (define-key map (kbd "x") 'guix-package-list-execute) - (define-key map (kbd "i") 'guix-package-list-mark-install) - (define-key map (kbd "d") 'guix-package-list-mark-delete) - (define-key map (kbd "U") 'guix-package-list-mark-upgrade) - (define-key map (kbd "^") 'guix-package-list-mark-upgrades)) - -(defface guix-package-list-installed - '((t :inherit guix-package-info-installed-outputs)) - "Face used if there are installed outputs for the current package." - :group 'guix-package-list-faces) - -(defface guix-package-list-obsolete - '((t :inherit guix-package-info-obsolete)) - "Face used if a package is obsolete." - :group 'guix-package-list-faces) - -(defcustom guix-package-list-generation-marking-enabled nil - "If non-nil, allow putting marks in a list with 'generation packages'. - -By default this is disabled, because it may be confusing. For -example, a package is installed in some generation, so a user can -mark it for deletion in the list of packages from this -generation, but the package may not be installed in the latest -generation, so actually it cannot be deleted. - -If you managed to understand the explanation above or if you -really know what you do or if you just don't care, you can set -this variable to t. It should not do much harm anyway (most -likely)." - :type 'boolean - :group 'guix-package-list) - -(defun guix-package-list-get-name (name entry) - "Return NAME of the package ENTRY. -Colorize it with `guix-package-list-installed' or -`guix-package-list-obsolete' if needed." - (guix-get-string name - (cond ((guix-entry-value entry 'obsolete) - 'guix-package-list-obsolete) - ((guix-entry-value entry 'installed) - 'guix-package-list-installed)))) - -(defun guix-package-list-get-installed-outputs (installed &optional _) - "Return string with outputs from INSTALLED entries." - (guix-get-string - (mapcar (lambda (entry) - (guix-entry-value entry 'output)) - installed))) - -(defun guix-package-list-marking-check () - "Signal an error if marking is disabled for the current buffer." - (when (and (not guix-package-list-generation-marking-enabled) - (or (derived-mode-p 'guix-package-list-mode) - (derived-mode-p 'guix-output-list-mode)) - (eq (guix-ui-current-search-type) 'generation)) - (error "Action marks are disabled for lists of 'generation packages'"))) - -(defun guix-package-list-mark-outputs (mark default - &optional prompt available) - "Mark the current package with MARK and move to the next line. -If PROMPT is non-nil, use it to ask a user for outputs from -AVAILABLE list, otherwise mark all DEFAULT outputs." - (let ((outputs (if prompt - (guix-completing-read-multiple - prompt available nil t) - default))) - (apply #'guix-list--mark mark t outputs))) - -(defun guix-package-list-mark-install (&optional arg) - "Mark the current package for installation and move to the next line. -With ARG, prompt for the outputs to install (several outputs may -be separated with \",\")." - (interactive "P") - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (all (guix-entry-value entry 'outputs)) - (installed (guix-package-installed-outputs entry)) - (available (cl-set-difference all installed :test #'string=))) - (or available - (user-error "This package is already installed")) - (guix-package-list-mark-outputs - 'install '("out") - (and arg "Output(s) to install: ") - available))) - -(defun guix-package-list-mark-delete (&optional arg) - "Mark the current package for deletion and move to the next line. -With ARG, prompt for the outputs to delete (several outputs may -be separated with \",\")." - (interactive "P") - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (installed (guix-package-installed-outputs entry))) - (or installed - (user-error "This package is not installed")) - (guix-package-list-mark-outputs - 'delete installed - (and arg "Output(s) to delete: ") - installed))) - -(defun guix-package-list-mark-upgrade (&optional arg) - "Mark the current package for upgrading and move to the next line. -With ARG, prompt for the outputs to upgrade (several outputs may -be separated with \",\")." - (interactive "P") - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (installed (guix-package-installed-outputs entry))) - (or installed - (user-error "This package is not installed")) - (when (or (guix-entry-value entry 'obsolete) - (y-or-n-p "This package is not obsolete. Try to upgrade it anyway? ")) - (guix-package-list-mark-outputs - 'upgrade installed - (and arg "Output(s) to upgrade: ") - installed)))) - -(defun guix-package-mark-upgrades (fun) - "Mark all obsolete packages for upgrading. -Use FUN to perform marking of the current line. FUN should -take an entry as argument." - (guix-package-list-marking-check) - (let ((obsolete (cl-remove-if-not - (lambda (entry) - (guix-entry-value entry 'obsolete)) - (guix-buffer-current-entries)))) - (guix-list-for-each-line - (lambda () - (let* ((id (guix-list-current-id)) - (entry (cl-find-if - (lambda (entry) - (equal id (guix-entry-id entry))) - obsolete))) - (when entry - (funcall fun entry))))))) - -(defun guix-package-list-mark-upgrades () - "Mark all obsolete packages for upgrading." - (interactive) - (guix-package-mark-upgrades - (lambda (entry) - (apply #'guix-list--mark - 'upgrade nil - (guix-package-installed-outputs entry))))) - -(defun guix-package-assert-non-system-profile () - "Verify that the current profile is not a system one. -The current profile is the one used by the current buffer." - (let ((profile (guix-ui-current-profile))) - (and profile - (guix-system-profile? profile) - (user-error "Packages cannot be installed or removed to/from \ -profile '%s'. -Use 'guix system reconfigure' shell command to modify a system profile." - profile)))) - -(defun guix-package-execute-actions (fun) - "Perform actions on the marked packages. -Use FUN to define actions suitable for `guix-process-package-actions'. -FUN should take action-type as argument." - (guix-package-assert-non-system-profile) - (let ((actions (delq nil - (mapcar fun '(install delete upgrade))))) - (if actions - (guix-process-package-actions (guix-ui-current-profile) - actions (current-buffer)) - (user-error "No operations specified")))) - -(defun guix-package-list-execute () - "Perform actions on the marked packages." - (interactive) - (guix-package-execute-actions #'guix-package-list-make-action)) - -(defun guix-package-list-make-action (action-type) - "Return action specification for the packages marked with ACTION-TYPE. -Return nil, if there are no packages marked with ACTION-TYPE. -The specification is suitable for `guix-process-package-actions'." - (let ((specs (guix-list-get-marked-args action-type))) - (and specs (cons action-type specs)))) - -(defun guix-package-list-edit (&optional directory) - "Go to the location of the current package. -See `guix-find-location' for the meaning of DIRECTORY." - (interactive (list (guix-read-directory))) - (guix-edit (guix-list-current-id) directory)) - -(defun guix-package-list-latest-builds (number &rest args) - "Display latest NUMBER of Hydra builds of the current package. -Interactively, prompt for NUMBER. With prefix argument, prompt -for all ARGS." - (interactive - (let ((entry (guix-list-current-entry))) - (guix-hydra-build-latest-prompt-args - :job (guix-hydra-job-name-specification - (guix-entry-value entry 'name) - (guix-entry-value entry 'version))))) - (apply #'guix-hydra-latest-builds number args)) - - -;;; Output 'info' - -(guix-ui-info-define-interface output - :buffer-name "*Guix Package Info*" - :format '((name format (format guix-package-info-name)) - (version format guix-output-info-insert-version) - (output format guix-output-info-insert-output) - (synopsis simple (indent guix-package-info-synopsis)) - guix-package-info-insert-misc - (source simple guix-package-info-insert-source) - (path simple (indent guix-file)) - (dependencies simple (indent guix-file)) - (location simple guix-package-info-insert-location) - (home-url format (format guix-url)) - (license format (format guix-package-license)) - (systems format guix-package-info-insert-systems) - (inputs format (format guix-package-input)) - (native-inputs format (format guix-package-native-input)) - (propagated-inputs format - (format guix-package-propagated-input)) - (description simple (indent guix-package-info-description))) - :titles guix-package-info-titles - :required '(id package-id installed non-unique)) - -(defun guix-output-info-insert-version (version entry) - "Insert output VERSION and obsolete text if needed at point." - (guix-info-insert-value-format version - 'guix-package-info-version) - (and (guix-entry-value entry 'obsolete) - (guix-package-info-insert-obsolete-text))) - -(defun guix-output-info-insert-output (output entry) - "Insert OUTPUT and action buttons at point." - (let* ((installed (guix-entry-value entry 'installed)) - (obsolete (guix-entry-value entry 'obsolete)) - (action-type (if installed 'delete 'install))) - (guix-info-insert-value-format - output - (if installed - 'guix-package-info-installed-outputs - 'guix-package-info-uninstalled-outputs)) - (guix-info-insert-indent) - (guix-package-info-insert-action-button action-type entry output) - (when obsolete - (guix-info-insert-indent) - (guix-package-info-insert-action-button 'upgrade entry output)))) - - -;;; Output 'list' - -(guix-ui-list-define-interface output - :buffer-name "*Guix Package List*" - :describe-function 'guix-output-list-describe - :format '((name guix-package-list-get-name 20 t) - (version nil 10 nil) - (output nil 9 t) - (installed nil 12 t) - (synopsis guix-list-get-one-line 30 nil)) - :required '(id package-id) - :sort-key '(name) - :marks '((install . ?I) - (upgrade . ?U) - (delete . ?D))) - -(let ((map guix-output-list-mode-map)) - (define-key map (kbd "B") 'guix-package-list-latest-builds) - (define-key map (kbd "e") 'guix-output-list-edit) - (define-key map (kbd "x") 'guix-output-list-execute) - (define-key map (kbd "i") 'guix-output-list-mark-install) - (define-key map (kbd "d") 'guix-output-list-mark-delete) - (define-key map (kbd "U") 'guix-output-list-mark-upgrade) - (define-key map (kbd "^") 'guix-output-list-mark-upgrades)) - -(defun guix-output-list-mark-install () - "Mark the current output for installation and move to the next line." - (interactive) - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (installed (guix-entry-value entry 'installed))) - (if installed - (user-error "This output is already installed") - (guix-list--mark 'install t)))) - -(defun guix-output-list-mark-delete () - "Mark the current output for deletion and move to the next line." - (interactive) - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (installed (guix-entry-value entry 'installed))) - (if installed - (guix-list--mark 'delete t) - (user-error "This output is not installed")))) - -(defun guix-output-list-mark-upgrade () - "Mark the current output for upgrading and move to the next line." - (interactive) - (guix-package-list-marking-check) - (let* ((entry (guix-list-current-entry)) - (installed (guix-entry-value entry 'installed))) - (or installed - (user-error "This output is not installed")) - (when (or (guix-entry-value entry 'obsolete) - (y-or-n-p "This output is not obsolete. Try to upgrade it anyway? ")) - (guix-list--mark 'upgrade t)))) - -(defun guix-output-list-mark-upgrades () - "Mark all obsolete package outputs for upgrading." - (interactive) - (guix-package-mark-upgrades - (lambda (_) (guix-list--mark 'upgrade)))) - -(defun guix-output-list-execute () - "Perform actions on the marked outputs." - (interactive) - (guix-package-execute-actions #'guix-output-list-make-action)) - -(defun guix-output-list-make-action (action-type) - "Return action specification for the outputs marked with ACTION-TYPE. -Return nil, if there are no outputs marked with ACTION-TYPE. -The specification is suitable for `guix-process-output-actions'." - (let ((ids (guix-list-get-marked-id-list action-type))) - (and ids (cons action-type - (mapcar #'guix-package-id-and-output-by-output-id - ids))))) - -(defun guix-output-list-describe (ids) - "Describe outputs with IDS (list of output identifiers). -See `guix-package-info-type'." - (if (eq guix-package-info-type 'output) - (guix-buffer-get-display-entries - 'info 'output - (cl-list* (guix-ui-current-profile) 'id ids) - 'add) - (let ((pids (mapcar (lambda (oid) - (car (guix-package-id-and-output-by-output-id - oid))) - ids))) - (guix-buffer-get-display-entries - 'info 'package - (cl-list* (guix-ui-current-profile) - 'id (cl-remove-duplicates pids)) - 'add)))) - -(defun guix-output-list-edit (&optional directory) - "Go to the location of the current package. -See `guix-find-location' for the meaning of DIRECTORY." - (interactive (list (guix-read-directory))) - (guix-edit (guix-entry-value (guix-list-current-entry) - 'package-id) - directory)) - - -;;; Interactive commands - -(defvar guix-package-search-params '(name synopsis description) - "Default list of package parameters for searching by regexp.") - -(defvar guix-package-search-history nil - "A history of minibuffer prompts.") - -;;;###autoload -(defun guix-packages-by-name (name &optional profile) - "Display Guix packages with NAME. -NAME is a string with name specification. It may optionally contain -a version number. Examples: \"guile\", \"guile@2.0.11\". - -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (guix-read-package-name) - (guix-ui-read-profile))) - (guix-package-get-display profile 'name name)) - -;;;###autoload -(defun guix-packages-by-license (license &optional profile) - "Display Guix packages with LICENSE. -LICENSE is a license name string. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (guix-read-license-name) - (guix-ui-read-profile))) - (guix-package-get-display profile 'license license)) - -;;;###autoload -(defun guix-packages-by-location (location &optional profile) - "Display Guix packages placed in LOCATION file. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (guix-read-package-location) - (guix-ui-read-profile))) - (guix-package-get-display profile 'location location)) - -;;;###autoload -(defun guix-package-from-file (file &optional profile) - "Display Guix package that the code from FILE evaluates to. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (read-file-name "File with package: ") - (guix-ui-read-profile))) - (guix-buffer-get-display-entries - 'info 'package - (list (or profile guix-current-profile) 'from-file file) - 'add)) - -;;;###autoload -(defun guix-search-by-regexp (regexp &optional params profile) - "Search for Guix packages by REGEXP. -PARAMS are package parameters that should be searched. -If PARAMS are not specified, use `guix-package-search-params'. - -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (read-regexp "Regexp: " nil 'guix-package-search-history) - nil (guix-ui-read-profile))) - (guix-package-get-display profile 'regexp regexp - (or params guix-package-search-params))) - -;;;###autoload -(defun guix-search-by-name (regexp &optional profile) - "Search for Guix packages matching REGEXP in a package name. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive - (list (read-string "Package name by regexp: " - nil 'guix-package-search-history) - (guix-ui-read-profile))) - (guix-search-by-regexp regexp '(name) profile)) - -;;;###autoload -(defun guix-installed-packages (&optional profile) - "Display information about installed Guix packages. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive (list (guix-ui-read-profile))) - (guix-package-get-display profile 'installed)) - -;;;###autoload -(defun guix-installed-user-packages () - "Display information about Guix packages installed in a user profile." - (interactive) - (guix-installed-packages guix-user-profile)) - -;;;###autoload -(defun guix-installed-system-packages () - "Display information about Guix packages installed in a system profile." - (interactive) - (guix-installed-packages - (guix-packages-profile guix-system-profile nil t))) - -;;;###autoload -(defun guix-obsolete-packages (&optional profile) - "Display information about obsolete Guix packages. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive (list (guix-ui-read-profile))) - (guix-package-get-display profile 'obsolete)) - -;;;###autoload -(defun guix-all-available-packages (&optional profile) - "Display information about all available Guix packages. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive (list (guix-ui-read-profile))) - (guix-package-get-display profile 'all-available)) - -;;;###autoload -(defun guix-newest-available-packages (&optional profile) - "Display information about the newest available Guix packages. -If PROFILE is nil, use `guix-current-profile'. -Interactively with prefix, prompt for PROFILE." - (interactive (list (guix-ui-read-profile))) - (guix-package-get-display profile 'newest-available)) - -(provide 'guix-ui-package) - -;;; guix-ui-package.el ends here diff --git a/emacs/guix-ui-system-generation.el b/emacs/guix-ui-system-generation.el deleted file mode 100644 index 7f4d76d489..0000000000 --- a/emacs/guix-ui-system-generation.el +++ /dev/null @@ -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 diff --git a/emacs/guix-ui.el b/emacs/guix-ui.el deleted file mode 100644 index 1b696314cd..0000000000 --- a/emacs/guix-ui.el +++ /dev/null @@ -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 diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el deleted file mode 100644 index 3e4ecc36ab..0000000000 --- a/emacs/guix-utils.el +++ /dev/null @@ -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 diff --git a/emacs/local.mk b/emacs/local.mk deleted file mode 100644 index 959ec2dd34..0000000000 --- a/emacs/local.mk +++ /dev/null @@ -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 diff --git a/etc/git/pre-push b/etc/git/pre-push new file mode 100755 index 0000000000..c894c5a9ec --- /dev/null +++ b/etc/git/pre-push @@ -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 diff --git a/gnu/build/cross-toolchain.scm b/gnu/build/cross-toolchain.scm new file mode 100644 index 0000000000..450443ca63 --- /dev/null +++ b/gnu/build/cross-toolchain.scm @@ -0,0 +1,178 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> +;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build cross-toolchain) + #:use-module (guix build utils) + #:use-module (guix build gnu-build-system) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match) + #:use-module (ice-9 ftw) + #:export (cross-gcc-build-phases)) + +;;; Commentary: +;;; +;;; This module provides tools to build a cross-compiler. +;;; +;;; Code: + +(define %gcc-include-paths + ;; Environment variables for header search paths. + ;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'. + '("C_INCLUDE_PATH" + "CPLUS_INCLUDE_PATH" + "OBJC_INCLUDE_PATH" + "OBJCPLUS_INCLUDE_PATH")) + +(define %gcc-cross-include-paths + ;; Search path for target headers when cross-compiling. + (map (cut string-append "CROSS_" <>) %gcc-include-paths)) + +(define* (make-cross-binutils-visible #:key outputs inputs target + #:allow-other-keys) + "Create symlinks for 'as', 'nm', and 'ld' in the \"out\" output, under +libexec/gcc, so that the cross-GCC can find them." + (let* ((out (assoc-ref outputs "out")) + (libexec (string-append out "/libexec/gcc/" target)) + (binutils (string-append (assoc-ref inputs "binutils-cross") + "/bin/" target "-")) + (wrapper (string-append (assoc-ref inputs "ld-wrapper-cross") + "/bin/" target "-ld"))) + (for-each (lambda (file) + (symlink (string-append binutils file) + (string-append libexec "/" file))) + '("as" "nm")) + (symlink wrapper (string-append libexec "/ld")) + #t)) + +(define* (set-cross-path #:key inputs #:allow-other-keys) + "Add the cross kernel headers to CROSS_CPATH, and remove them from +C_INCLUDE_PATH et al." + (match (assoc-ref inputs "libc") + ((? string? libc) + (let ((kernel (assoc-ref inputs "xkernel-headers"))) + (define (cross? x) + ;; Return #t if X is a cross-libc or cross Linux. + (or (string-prefix? libc x) + (string-prefix? kernel x))) + + (let ((cpath (string-append libc "/include" + ":" kernel "/include"))) + (for-each (cut setenv <> cpath) + %gcc-cross-include-paths)) + + (setenv "CROSS_LIBRARY_PATH" + (string-append libc "/lib:" kernel "/lib")) ;for Hurd's libihash + + (for-each (lambda (var) + (and=> (getenv var) + (lambda (value) + (let* ((path (search-path-as-string->list value)) + (native-path (list->search-path-as-string + (remove cross? path) ":"))) + (setenv var native-path))))) + (cons "LIBRARY_PATH" %gcc-include-paths)) + #t)) + (#f + ;; We're building the sans-libc cross-compiler, so nothing to do. + #t))) + +(define* (set-cross-path/mingw #:key inputs #:allow-other-keys) + "Add the cross MinGW headers to CROSS_C_*_INCLUDE_PATH, and remove them from +C_*INCLUDE_PATH." + (let ((libc (assoc-ref inputs "libc")) + (gcc (assoc-ref inputs "gcc"))) + (define (cross? x) + (and libc (string-prefix? libc x))) + + (define (unpacked-mingw-dir) + (match (scandir "." (lambda (name) + (string-contains name "mingw-w64"))) + ((mingw-dir) + (string-append + (getcwd) "/" mingw-dir "/mingw-w64-headers")))) + + (if libc + (let ((cpath (string-append libc "/include" + ":" libc "/i686-w64-mingw32/include"))) + (for-each (cut setenv <> cpath) + %gcc-cross-include-paths)) + + ;; libc is false, so we are building xgcc-sans-libc. + ;; Add essential headers from mingw-w64. + (let ((mingw-source (assoc-ref inputs "mingw-source"))) + (system* "tar" "xvf" mingw-source) + (let ((mingw-headers (unpacked-mingw-dir))) + ;; We need _mingw.h which will gets built from _mingw.h.in by + ;; mingw-w64's configure. We cannot configure mingw-w64 until we + ;; have xgcc-sans-libc; substitute to the rescue. + (copy-file (string-append mingw-headers "/crt/_mingw.h.in") + (string-append mingw-headers "/crt/_mingw.h")) + + (substitute* (string-append mingw-headers "/crt/_mingw.h") + (("@MINGW_HAS_SECURE_API@") + "#define MINGW_HAS_SECURE_API 1")) + + (let ((cpath (string-append mingw-headers "/include" + ":" mingw-headers "/crt" + ":" mingw-headers + "/defaults/include"))) + (for-each (cut setenv <> cpath) + (cons "CROSS_LIBRARY_PATH" + %gcc-cross-include-paths)))))) + + (when libc + (setenv "CROSS_LIBRARY_PATH" + (string-append libc "/lib" + ":" libc "/i686-w64-mingw32/lib"))) + + (setenv "CPP" (string-append gcc "/bin/cpp")) + (for-each (lambda (var) + (and=> (getenv var) + (lambda (value) + (let* ((path (search-path-as-string->list + value)) + (native-path (list->search-path-as-string + (remove cross? path) ":"))) + (setenv var native-path))))) + (cons "LIBRARY_PATH" %gcc-include-paths)) + #t)) + +(define (install-strip . _) + "Install a stripped GCC." + ;; Unlike our 'strip' phase, this will do the right thing for + ;; cross-compilers. + (zero? (system* "make" "install-strip"))) + +(define* (cross-gcc-build-phases target + #:optional (phases %standard-phases)) + "Modify PHASES to include everything needed to build a cross-GCC for TARGET, +a target triplet." + (modify-phases phases + (add-before 'configure 'set-cross-path + (if (string-contains target "mingw") + set-cross-path/mingw + set-cross-path)) + (add-after 'install 'make-cross-binutils-visible + (cut make-cross-binutils-visible #:target target <...>)) + (replace 'install install-strip))) + +;;; cross-toolchain.scm ends here diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm index 0d55e91978..c121ca5f8b 100644 --- a/gnu/build/file-systems.scm +++ b/gnu/build/file-systems.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016 David Craven <david@craven.ch> ;;; ;;; This file is part of GNU Guix. ;;; @@ -71,67 +72,69 @@ "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)))))) ;;; @@ -146,37 +149,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." @@ -267,7 +255,7 @@ returns #t if that partition's volume name is LABEL." ext2-superblock-uuid bytevector=?)) -(define partition-luks-uuid-predicate +(define luks-partition-uuid-predicate (partition-predicate read-luks-header luks-header-uuid bytevector=?)) @@ -289,7 +277,7 @@ or #f if none was found." (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) + (and=> (find (luks-partition-uuid-predicate uuid) (disk-partitions)) (cut string-append "/dev/" <>))) @@ -464,6 +452,27 @@ form: DEVICE, MOUNT-POINT, and TYPE must be strings; OPTIONS can be a string or #f; FLAGS must be a list of symbols. CHECK? is a Boolean indicating whether to run a file system check." + + (define (mount-nfs source mount-point type flags options) + (let* ((idx (string-rindex source #\:)) + (host-part (string-take source idx)) + ;; Strip [] from around host if present + (host (match (string-split host-part (string->char-set "[]")) + (("" h "") h) + ((h) h))) + (aa (match (getaddrinfo host "nfs") ((x . _) x))) + (sa (addrinfo:addr aa)) + (inet-addr (inet-ntop (sockaddr:fam sa) + (sockaddr:addr sa)))) + + ;; Mounting an NFS file system requires passing the address + ;; of the server in the addr= option + (mount source mount-point type flags + (string-append "addr=" + inet-addr + (if options + (string-append "," options) + ""))))) (match spec ((source title mount-point type (flags ...) options check?) (let ((source (canonicalize-device-spec source title)) @@ -481,7 +490,11 @@ run a file system check." (call-with-output-file mount-point (const #t))) (mkdir-p mount-point)) - (mount source mount-point type flags options) + (cond + ((string-prefix? "nfs" type) + (mount-nfs source mount-point type flags options)) + (else + (mount source mount-point type flags options))) ;; For read-only bind mounts, an extra remount is needed, as per ;; <http://lwn.net/Articles/281157/>, which still applies to Linux 4.0. diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index cc5cf45362..60ee18ebe0 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -79,12 +79,9 @@ it via /dev/hda. REFERENCES-GRAPHS can specify a list of reference-graph files as produced by the #:references-graphs parameter of 'derivation'." - (define image-file - (string-append "image." disk-image-format)) - (when make-disk-image? (unless (zero? (system* "qemu-img" "create" "-f" disk-image-format - image-file + output (number->string disk-image-size))) (error "qemu-img failed"))) @@ -115,7 +112,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-drive" ,(string-append "file=" image-file + `("-drive" ,(string-append "file=" output ",if=virtio")) '()) ;; Only enable kvm if we see /dev/kvm exists. @@ -126,11 +123,10 @@ the #:references-graphs parameter of 'derivation'." '())))) (error "qemu failed" qemu)) - (if make-disk-image? - (copy-file image-file output) - (begin - (mkdir output) - (copy-recursively "xchg" output)))) + ;; When MAKE-DISK-IMAGE? is true, the image is in OUTPUT already. + (unless make-disk-image? + (mkdir output) + (copy-recursively "xchg" output))) ;;; diff --git a/gnu/local.mk b/gnu/local.mk index 55d56e1852..6dcd174bc3 100644 --- a/gnu/local.mk +++ b/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. @@ -123,7 +123,6 @@ GNU_SYSTEM_MODULES = \ %D%/packages/entr.scm \ %D%/packages/erlang.scm \ %D%/packages/fcitx.scm \ - %D%/packages/feh.scm \ %D%/packages/figlet.scm \ %D%/packages/file.scm \ %D%/packages/finance.scm \ @@ -147,7 +146,6 @@ GNU_SYSTEM_MODULES = \ %D%/packages/gd.scm \ %D%/packages/gdb.scm \ %D%/packages/geo.scm \ - %D%/packages/geeqie.scm \ %D%/packages/gettext.scm \ %D%/packages/gforth.scm \ %D%/packages/ghostscript.scm \ @@ -185,8 +183,10 @@ 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 \ %D%/packages/imagemagick.scm \ %D%/packages/indent.scm \ %D%/packages/inklingreader.scm \ @@ -249,10 +249,12 @@ GNU_SYSTEM_MODULES = \ %D%/packages/mc.scm \ %D%/packages/mcrypt.scm \ %D%/packages/messaging.scm \ + %D%/packages/mingw.scm \ %D%/packages/mg.scm \ %D%/packages/microcom.scm \ %D%/packages/mit-krb5.scm \ %D%/packages/moe.scm \ + %D%/packages/monitoring.scm \ %D%/packages/mono.scm \ %D%/packages/moreutils.scm \ %D%/packages/mpd.scm \ @@ -284,7 +286,6 @@ GNU_SYSTEM_MODULES = \ %D%/packages/openstack.scm \ %D%/packages/orpheus.scm \ %D%/packages/ots.scm \ - %D%/packages/owncloud.scm \ %D%/packages/package-management.scm \ %D%/packages/parallel.scm \ %D%/packages/password-utils.scm \ @@ -294,6 +295,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/pdf.scm \ %D%/packages/pem.scm \ %D%/packages/perl.scm \ + %D%/packages/perl-web.scm \ %D%/packages/photo.scm \ %D%/packages/php.scm \ %D%/packages/pkg-config.scm \ @@ -320,6 +322,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 \ @@ -347,7 +350,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/statistics.scm \ %D%/packages/suckless.scm \ %D%/packages/swig.scm \ - %D%/packages/sxiv.scm \ + %D%/packages/sync.scm \ %D%/packages/synergy.scm \ %D%/packages/syndication.scm \ %D%/packages/task-management.scm \ @@ -358,6 +361,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/texinfo.scm \ %D%/packages/tex.scm \ %D%/packages/textutils.scm \ + %D%/packages/text-editors.scm \ %D%/packages/time.scm \ %D%/packages/tls.scm \ %D%/packages/tmux.scm \ @@ -400,6 +404,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/avahi.scm \ %D%/services/base.scm \ %D%/services/configuration.scm \ + %D%/services/cuirass.scm \ %D%/services/cups.scm \ %D%/services/databases.scm \ %D%/services/dbus.scm \ @@ -434,6 +439,7 @@ GNU_SYSTEM_MODULES = \ %D%/system/vm.scm \ \ %D%/build/activation.scm \ + %D%/build/cross-toolchain.scm \ %D%/build/file-systems.scm \ %D%/build/install.scm \ %D%/build/linux-boot.scm \ @@ -446,7 +452,9 @@ 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 @@ -486,9 +494,11 @@ dist_patch_DATA = \ %D%/packages/patches/binutils-loongson-workaround.patch \ %D%/packages/patches/binutils-mips-bash-bug.patch \ %D%/packages/patches/byobu-writable-status.patch \ + %D%/packages/patches/cairo-CVE-2016-9082.patch \ %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 \ @@ -502,8 +512,6 @@ dist_patch_DATA = \ %D%/packages/patches/crda-optional-gcrypt.patch \ %D%/packages/patches/crossmap-allow-system-pysam.patch \ %D%/packages/patches/csound-header-ordering.patch \ - %D%/packages/patches/cssc-gets-undeclared.patch \ - %D%/packages/patches/cssc-missing-include.patch \ %D%/packages/patches/clucene-contribs-lib.patch \ %D%/packages/patches/cursynth-wave-rand.patch \ %D%/packages/patches/cyrus-sasl-CVE-2013-4122.patch \ @@ -534,6 +542,8 @@ dist_patch_DATA = \ %D%/packages/patches/fasthenry-spUtils.patch \ %D%/packages/patches/fasthenry-spSolve.patch \ %D%/packages/patches/fasthenry-spFactor.patch \ + %D%/packages/patches/fcgi-2.4.0-gcc44-fixes.patch \ + %D%/packages/patches/fcgi-2.4.0-poll.patch \ %D%/packages/patches/findutils-localstatedir.patch \ %D%/packages/patches/findutils-test-xargs.patch \ %D%/packages/patches/flint-ldconfig.patch \ @@ -549,9 +559,11 @@ dist_patch_DATA = \ %D%/packages/patches/gcc-libiberty-printf-decl.patch \ %D%/packages/patches/gcc-libvtv-runpath.patch \ %D%/packages/patches/gcc-strmov-store-file-names.patch \ + %D%/packages/patches/gcc-4.9.3-mingw-gthr-default.patch \ %D%/packages/patches/gcc-5.0-libvtv-runpath.patch \ %D%/packages/patches/gcc-6-arm-none-eabi-multilib.patch \ %D%/packages/patches/gcc-6-cross-environment-variables.patch \ + %D%/packages/patches/gcj-arm-mode.patch \ %D%/packages/patches/gd-CVE-2016-7568.patch \ %D%/packages/patches/gd-CVE-2016-8670.patch \ %D%/packages/patches/gd-fix-chunk-size-on-boundaries.patch \ @@ -578,6 +590,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 \ @@ -586,10 +599,6 @@ dist_patch_DATA = \ %D%/packages/patches/grub-gets-undeclared.patch \ %D%/packages/patches/grub-freetype.patch \ %D%/packages/patches/gsl-test-i686.patch \ - %D%/packages/patches/gst-plugins-good-fix-crashes.patch \ - %D%/packages/patches/gst-plugins-good-fix-invalid-read.patch \ - %D%/packages/patches/gst-plugins-good-fix-signedness.patch \ - %D%/packages/patches/gst-plugins-good-flic-bounds-check.patch \ %D%/packages/patches/guile-1.8-cpp-4.5.patch \ %D%/packages/patches/guile-arm-fixes.patch \ %D%/packages/patches/guile-default-utf8.patch \ @@ -618,21 +627,22 @@ dist_patch_DATA = \ %D%/packages/patches/hdf-eos5-fortrantests.patch \ %D%/packages/patches/higan-remove-march-native-flag.patch \ %D%/packages/patches/hop-linker-flags.patch \ + %D%/packages/patches/httpd-CVE-2016-8740.patch \ %D%/packages/patches/hydra-disable-darcs-test.patch \ %D%/packages/patches/hypre-doc-tables.patch \ %D%/packages/patches/hypre-ldflags.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ %D%/packages/patches/icecat-binutils.patch \ - %D%/packages/patches/icecat-CVE-2016-9064.patch \ %D%/packages/patches/icu4c-CVE-2014-6585.patch \ %D%/packages/patches/icu4c-CVE-2015-1270.patch \ %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 \ @@ -651,6 +661,7 @@ dist_patch_DATA = \ %D%/packages/patches/libcanberra-sound-theme-freedesktop.patch \ %D%/packages/patches/libcmis-fix-test-onedrive.patch \ %D%/packages/patches/libdrm-symbol-check.patch \ + %D%/packages/patches/libepoxy-gl-null-checks.patch \ %D%/packages/patches/libevent-dns-tests.patch \ %D%/packages/patches/libextractor-ffmpeg-3.patch \ %D%/packages/patches/libjxr-fix-function-signature.patch \ @@ -662,12 +673,14 @@ 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/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 \ @@ -682,6 +695,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 \ @@ -709,27 +724,19 @@ dist_patch_DATA = \ %D%/packages/patches/mesa-wayland-egl-symbols-check-mips.patch \ %D%/packages/patches/metabat-remove-compilation-date.patch \ %D%/packages/patches/mhash-keygen-test-segfault.patch \ + %D%/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch \ %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/mupdf-CVE-2016-6265.patch \ - %D%/packages/patches/mupdf-CVE-2016-6525.patch \ - %D%/packages/patches/mupdf-CVE-2016-7504.patch \ - %D%/packages/patches/mupdf-CVE-2016-7505.patch \ - %D%/packages/patches/mupdf-CVE-2016-7506.patch \ - %D%/packages/patches/mupdf-CVE-2016-7563.patch \ - %D%/packages/patches/mupdf-CVE-2016-7564.patch \ - %D%/packages/patches/mupdf-CVE-2016-8674.patch \ - %D%/packages/patches/mupdf-CVE-2016-9017.patch \ - %D%/packages/patches/mupdf-CVE-2016-9136.patch \ %D%/packages/patches/mupen64plus-ui-console-notice.patch \ %D%/packages/patches/musl-CVE-2016-8859.patch \ %D%/packages/patches/mutt-store-references.patch \ - %D%/packages/patches/nasm-no-ps-pdf.patch \ %D%/packages/patches/net-tools-bitrot.patch \ - %D%/packages/patches/netcdf-config-date.patch \ + %D%/packages/patches/netcdf-date-time.patch \ + %D%/packages/patches/netcdf-tst_h_par.patch \ %D%/packages/patches/netsurf-about.patch \ %D%/packages/patches/ngircd-handle-zombies.patch \ %D%/packages/patches/ngircd-no-dns-in-tests.patch \ @@ -740,17 +747,18 @@ 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/onionshare-fix-install-paths.patch \ %D%/packages/patches/openexr-missing-samples.patch \ - %D%/packages/patches/openjpeg-CVE-2015-6581.patch \ %D%/packages/patches/openjpeg-CVE-2016-5157.patch \ %D%/packages/patches/openjpeg-CVE-2016-7163.patch \ + %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 \ @@ -801,43 +809,41 @@ dist_patch_DATA = \ %D%/packages/patches/pyqt-configure.patch \ %D%/packages/patches/python-2-deterministic-build-info.patch \ %D%/packages/patches/python-2.7-search-paths.patch \ + %D%/packages/patches/python-2.7-site-prefixes.patch \ %D%/packages/patches/python-2.7-source-date-epoch.patch \ %D%/packages/patches/python-3-deterministic-build-info.patch \ %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 \ - %D%/packages/patches/python-rarfile-fix-tests.patch \ %D%/packages/patches/python2-rdflib-drop-sparqlwrapper.patch \ %D%/packages/patches/python-statsmodels-fix-tests.patch \ %D%/packages/patches/python-configobj-setuptools.patch \ %D%/packages/patches/python-paste-remove-website-test.patch \ %D%/packages/patches/python-paste-remove-timing-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/qt4-ldflags.patch \ %D%/packages/patches/quickswitch-fix-dmenu-check.patch \ %D%/packages/patches/rapicorn-isnan.patch \ %D%/packages/patches/ratpoison-shell.patch \ %D%/packages/patches/readline-link-ncurses.patch \ %D%/packages/patches/readline-6.2-CVE-2014-2524.patch \ + %D%/packages/patches/readline-7.0-mingw.patch \ %D%/packages/patches/ripperx-missing-file.patch \ %D%/packages/patches/rpm-CVE-2014-8118.patch \ %D%/packages/patches/rsem-makefile.patch \ %D%/packages/patches/ruby-concurrent-ignore-broken-test.patch \ %D%/packages/patches/ruby-puma-ignore-broken-test.patch \ %D%/packages/patches/ruby-rack-ignore-failing-test.patch \ - %D%/packages/patches/ruby-symlinkfix.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/scheme48-tests.patch \ %D%/packages/patches/scotch-test-threading.patch \ %D%/packages/patches/sdl-libx11-1.6.patch \ + %D%/packages/patches/seq24-rename-mutex.patch \ %D%/packages/patches/serf-comment-style-fix.patch \ %D%/packages/patches/serf-deflate-buckets-test-fix.patch \ %D%/packages/patches/slim-session.patch \ @@ -845,7 +851,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 \ @@ -862,6 +867,7 @@ dist_patch_DATA = \ %D%/packages/patches/tclxml-3.2-install.patch \ %D%/packages/patches/tcsh-do-not-define-BSDWAIT.patch \ %D%/packages/patches/tcsh-fix-autotest.patch \ + %D%/packages/patches/tcsh-fix-out-of-bounds-read.patch \ %D%/packages/patches/teensy-loader-cli-help.patch \ %D%/packages/patches/texi2html-document-encoding.patch \ %D%/packages/patches/texi2html-i18n.patch \ @@ -873,6 +879,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 \ @@ -895,7 +902,6 @@ dist_patch_DATA = \ %D%/packages/patches/vpnc-script.patch \ %D%/packages/patches/vte-CVE-2012-2738-pt1.patch \ %D%/packages/patches/vte-CVE-2012-2738-pt2.patch \ - %D%/packages/patches/vtk-mesa-10.patch \ %D%/packages/patches/weechat-python.patch \ %D%/packages/patches/wicd-bitrate-none-fix.patch \ %D%/packages/patches/wicd-get-selected-profile-fix.patch \ diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm index 88d9cdc21b..9e912a9543 100644 --- a/gnu/packages/admin.scm +++ b/gnu/packages/admin.scm @@ -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> @@ -144,14 +144,14 @@ and provides a \"top-like\" mode (monitoring).") (define-public shepherd (package (name "shepherd") - (version "0.3.1") + (version "0.3.2") (source (origin (method url-fetch) (uri (string-append "ftp://alpha.gnu.org/gnu/dmd/shepherd-" version ".tar.gz")) (sha256 (base32 - "0f3yi3n4sl9myiay95yhv2a9an338qddfjrbv7da753ip66dkfz6")))) + "174q1qg7yg6w1hfvlfv720hr6hid4h5xzw15y3ycfpspllzldhcb")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--localstatedir=/var"))) @@ -164,7 +164,8 @@ the execution of system services, replacing similar functionality found in typical init systems. It provides dependency-handling through a convenient interface and is based on GNU Guile.") (license license:gpl3+) - (home-page "http://www.gnu.org/software/shepherd/"))) + (home-page "https://www.gnu.org/software/shepherd/") + (properties '((ftp-server . "alpha.gnu.org"))))) (define-public dfc (package @@ -364,7 +365,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, @@ -719,7 +720,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 @@ -792,7 +793,7 @@ system administrator.") (define-public sudo (package (name "sudo") - (version "1.8.17p1") + (version "1.8.19p1") (source (origin (method url-fetch) (uri @@ -802,7 +803,7 @@ system administrator.") version ".tar.gz"))) (sha256 (base32 - "1k2mn65l1kmsxm8wh0gjxy496xhbpiimbpm6yv6kw6snzc3xg466")))) + "14pwdwl03kdbbyjkvxrfx409x3c1fjqz8aqz2wgwddinhz7v3bxq")))) (build-system gnu-build-system) (arguments `(#:configure-flags @@ -1335,8 +1336,6 @@ specified directories.") (("/usr") out) (("distro_ver = .*") "distro_ver = ''")) #t)))))) - (inputs - `(("python-setuptools" ,python2-setuptools))) (home-page "https://github.com/shawn-sterling/graphios") (synopsis "Emit Nagios metrics to Graphite, Statsd, and Librato") (description @@ -1359,8 +1358,7 @@ of supported upstream metrics systems simultaneously.") "1bfc2xiplpad6f2nwi48y0kps7xqnsll85dlz63cy8k5bysl6d20")))) (build-system python-build-system) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-pycrypto" ,python2-pycrypto) + `(("python2-pycrypto" ,python2-pycrypto) ("python2-httplib2" ,python2-httplib2) ("python2-passlib" ,python2-passlib) ("python2-nose" ,python2-nose) @@ -1573,14 +1571,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 @@ -1702,13 +1700,15 @@ throughput (in the same interval).") (base32 "04q2cn8c83f6z6wn1scla1ilrpi5ssjc64987hvmwfvwvb82bvkp")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (inputs `(("python-colorama" ,python-colorama) ("python-decorator" ,python-decorator) ("python-psutil" ,python-psutil) ("python-six" ,python-six))) + (inputs + ;; Requires setuptools >= 17.1 due to some features used, while our + ;; python currently only includes 12.0. TODO: Remove this input. + `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/nvbn/thefuck") (synopsis "Correct mistyped console command") (description @@ -1868,14 +1868,14 @@ Kerberos and Heimdal and FAST is supported with recent MIT Kerberos.") (define-public sunxi-tools (package (name "sunxi-tools") - (version "1.4.1") + (version "1.4.2") (source (origin (method url-fetch) (uri (string-append "https://github.com/linux-sunxi/" "sunxi-tools/archive/v" version ".tar.gz")) (sha256 - (base32 "06qd2b4dlzbmzfy4q9n8v5rkkbmgcfdbv4nkkcp4nysi10k7cpfs")) + (base32 "08iqwj95qw2s7ilhrdi2lkbc8dx64zk5lzz1qk587jr0lla81x41")) (modules '((guix build utils))) (snippet ;; Remove binaries contained in the tarball which are only for the diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm index 76f385e340..d09e2e83b2 100644 --- a/gnu/packages/algebra.scm +++ b/gnu/packages/algebra.scm @@ -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> @@ -544,7 +544,8 @@ a C program.") "1kwbx92ps0r7s2mqy7lxbxanslxdzj7dp7r7gmdkzv1j8yqf3kwf")))) (build-system gnu-build-system) (arguments - '(#:configure-flags '("--enable-shared" "--enable-openmp") + '(#:configure-flags + '("--enable-shared" "--enable-openmp" "--enable-threads") #:phases (alist-cons-before 'build 'no-native (lambda _ @@ -576,6 +577,23 @@ cosine/ sine transforms or DCT/DST).") (string-append (package-description fftw) " Single-precision version.")))) +(define (pthread-variant p) + (package + (inherit p) + (name (string-append (package-name p) "-pthreads")) + (arguments + (substitute-keyword-arguments (package-arguments fftw) + ((#:configure-flags flags) + `(cons "--enable-threads" ,flags)))))) + +;; 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 + (pthread-variant fftw)) + +(define-public fftwf-with-threads + (pthread-variant fftwf)) + (define-public fftw-openmpi (package (inherit fftw) (name "fftw-openmpi") diff --git a/gnu/packages/aspell.scm b/gnu/packages/aspell.scm index b3ca380533..188e91d1e1 100644 --- a/gnu/packages/aspell.scm +++ b/gnu/packages/aspell.scm @@ -3,6 +3,8 @@ ;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com> ;;; 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. ;;; @@ -64,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 @@ -80,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 @@ -108,10 +112,10 @@ dictionaries, including personal ones.") (define-public aspell-dict-en (aspell-dictionary "en" "English" - #:version "2016.01.19-0" + #:version "2016.11.20-0" #:sha256 (base32 - "01h4cl4lngp6mcfbyb47cjrc2gspyg2519dvknd97ki896nx7vcn"))) + "1496jnhh2jvhkzcj0p4vy89bcs4g5wz6a76m33vw4dhchn5xm9jw"))) (define-public aspell-dict-eo (aspell-dictionary "eo" "Esperanto" @@ -163,3 +167,26 @@ dictionaries, including personal ones.") #:sha256 (base32 "13bhbghx5b8g0119g3wxd4n8mlf707y41vlf59irxjj0kynankfn"))) + +(define-public aspell-dict-sv + (aspell-dictionary "sv" "Swedish" + #:version "0.51-0" + #:prefix "aspell-" + #: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"))) diff --git a/gnu/packages/assembly.scm b/gnu/packages/assembly.scm index 29ccf1f08a..fbc5cdd16f 100644 --- a/gnu/packages/assembly.scm +++ b/gnu/packages/assembly.scm @@ -34,24 +34,32 @@ (define-public nasm (package (name "nasm") - (version "2.12.01") + (version "2.12.02") (source (origin (method url-fetch) (uri (string-append "http://www.nasm.us/pub/nasm/releasebuilds/" version "/" name "-" version ".tar.xz")) (sha256 (base32 - "12bl6vc5sjp9nnhf0iwy6l27vq783y0rxrjpp8sy84h5cb7a3fwx")) - (patches (search-patches "nasm-no-ps-pdf.patch")))) + "08a3ah791cl7xdyrlz33mwv4xzs08rxh0p902p3ypi5iq1h6p1jc")))) (build-system gnu-build-system) (native-inputs `(("perl" ,perl) ;for doc and test target ("texinfo" ,texinfo))) (arguments `(#:test-target "test" - #:phases (modify-phases %standard-phases - (add-after 'install 'install-info - (lambda _ - (zero? (system* "make" "install_doc"))))))) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'dont-build-ps-pdf-outputs + (lambda _ + (substitute* "doc/Makefile.in" + (("info html nasmdoc.txt nasmdoc.ps nasmdoc.pdf") + "info html nasmdoc.txt") + (("nasmdoc.ps nasmdoc.pdf nasmdoc.txt \\$\\(INSTALLROOT\\)\\$\\(docdir\\)") + "nasmdoc.txt $(INSTALLROOT)$(docdir)")) + #t)) + (add-after 'install 'install-info + (lambda _ + (zero? (system* "make" "install_doc"))))))) (home-page "http://www.nasm.us/") (synopsis "80x86 and x86-64 assembler") (description @@ -62,7 +70,6 @@ Windows32 and Windows64. It will also output plain binary files. Its syntax is designed to be simple and easy to understand, similar to Intel's but less complex. It supports all currently known x86 architectural extensions, and has strong support for macros.") - (supported-systems '("x86_64-linux" "i686-linux")) (license license:bsd-3))) (define-public yasm diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm index b535448af1..f0a6a54de7 100644 --- a/gnu/packages/audio.scm +++ b/gnu/packages/audio.scm @@ -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> @@ -186,7 +186,7 @@ streams from live audio.") (define-public ardour (package (name "ardour") - (version "5.4") + (version "5.5") (source (origin (method git-fetch) (uri (git-reference @@ -196,14 +196,14 @@ streams from live audio.") ;; Ardour expects this file to exist at build time. The revision ;; is the output of ;; git describe HEAD | sed 's/^[A-Za-z]*+//' - '(call-with-output-file + `(call-with-output-file "libs/ardour/revision.cc" (lambda (port) - (format port "#include \"ardour/revision.h\" -namespace ARDOUR { const char* revision = \"5.4\" ; }")))) + (format port ,(string-append "#include \"ardour/revision.h\" +namespace ARDOUR { const char* revision = \"" version "\" ; }"))))) (sha256 (base32 - "1yrg0d86k9fqw7lmzjglilbadb4cjqxqkf6ii4bjs6rihj6b0qrf")) + "1a3whv2dhl073pkd803hcp53rdmm31adjwn40qi06lkjb7rgwrlh")) (file-name (string-append name "-" version)))) (build-system waf-build-system) (arguments @@ -238,8 +238,8 @@ namespace ARDOUR { const char* revision = \"5.4\" ; }")))) ("lv2" ,lv2) ("vamp" ,vamp) ("curl" ,curl) - ("fftw" ,fftw) - ("fftwf" ,fftwf) + ("fftw" ,fftw-with-threads) + ("fftwf" ,fftwf-with-threads) ("jack" ,jack-1) ("serd" ,serd) ("sord" ,sord) @@ -1448,7 +1448,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 @@ -1493,9 +1493,10 @@ implementation of the Open Sound Control (OSC) protocol.") "13vry6xhxm7adnbyj28w1kpwrh0kf7nw83cz1yq74wl21faz2rzw")))) (build-system python-build-system) (arguments `(#:tests? #f)) ;no tests + (native-inputs + `(("python-cython" ,python-cython))) (inputs - `(("python-cython" ,python-cython) - ("liblo" ,liblo))) + `(("liblo" ,liblo))) (home-page "http://das.nasophon.de/pyliblo/") (synopsis "Python bindings for liblo") (description @@ -1551,15 +1552,14 @@ significantly faster and have minimal dependencies.") (define-public lv2 (package (name "lv2") - (version "1.12.0") + (version "1.14.0") (source (origin (method url-fetch) (uri (string-append "http://lv2plug.in/spec/lv2-" - version - ".tar.bz2")) + version ".tar.bz2")) (sha256 (base32 - "1saq0vwqy5zjdkgc5ahs8kcabxfmff2mmg68fiqrkv8hiw9m6jks")))) + "0chxwys3vnn3nxc9x2vchm74s9sx0vfra6y893byy12ci61jc1dq")))) (build-system waf-build-system) (arguments `(#:tests? #f ; no check target @@ -1653,9 +1653,16 @@ software.") (setenv "LDFLAGS" (string-append "-L" (assoc-ref inputs "boost") "/lib " - "-lboost_system"))))))) + "-lboost_system")) + ;; Needed for gtkmm + (substitute* '("src/wscript_build" + "examples/wscript_build") + (("cxxflags.*= \\[" line) + (string-append line "\"-std=c++11\", "))) + #t))))) (inputs `(("boost" ,boost) + ("gtkmm" ,gtkmm-2) ("lv2" ,lv2))) (native-inputs `(("pkg-config" ,pkg-config))) @@ -1798,6 +1805,23 @@ and ALSA.") aimed at audio/musical applications.") (license license:gpl2+))) +(define-public raul-devel + (let ((commit "f8bf77d3c3b77830aedafb9ebb5cdadfea7ed07a") + (revision "1")) + (package (inherit raul) + (name "raul") + (version (string-append "0.8.4-" revision "." + (string-take commit 9))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "http://git.drobilla.net/raul.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "1lby508fb0n8ks6iz959sh18fc37br39d6pbapwvbcw5nckdrxwj"))))))) + (define-public rubberband (package (name "rubberband") @@ -2255,7 +2279,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 @@ -2675,7 +2699,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) @@ -2683,7 +2707,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))) diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm index d127769986..8308616a1f 100644 --- a/gnu/packages/backup.scm +++ b/gnu/packages/backup.scm @@ -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. ;;; @@ -66,8 +67,7 @@ "duplicity-test_selection-tmp.patch")))) (build-system python-build-system) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("util-linux" ,util-linux))) ;setsid command, for the tests + `(("util-linux" ,util-linux))) ;setsid command, for the tests (inputs `(("python" ,python-2) ("librsync" ,librsync) @@ -79,16 +79,17 @@ (arguments `(#:python ,python-2 ;setup assumes Python 2 #:test-target "test" - #:phases (alist-cons-before - 'check 'check-setup - (lambda* (#:key inputs #:allow-other-keys) - (substitute* "testing/functional/__init__.py" - (("/bin/sh") (which "sh"))) - (setenv "HOME" (getcwd)) ;gpg needs to write to $HOME - (setenv "TZDIR" ;some timestamp checks need TZDIR - (string-append (assoc-ref inputs "tzdata") - "/share/zoneinfo"))) - %standard-phases))) + #:phases + (modify-phases %standard-phases + (add-before 'check 'check-setup + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "testing/functional/__init__.py" + (("/bin/sh") (which "sh"))) + (setenv "HOME" (getcwd)) ;gpg needs to write to $HOME + (setenv "TZDIR" ;some timestamp checks need TZDIR + (string-append (assoc-ref inputs "tzdata") + "/share/zoneinfo")) + #t))))) (home-page "http://duplicity.nongnu.org/index.html") (synopsis "Encrypted backup using rsync algorithm") (description @@ -334,8 +335,6 @@ errors.") (base32 "1nwmmh816f96h0ff1jxk95ad38ilbhbdl5dgibx1d4cl81dsi48d")))) (build-system python-build-system) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (inputs `(("python" ,python-2) ("librsync" ,librsync))) @@ -401,13 +400,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 @@ -433,20 +432,29 @@ detection, and lossless compression.") ;; The tests need to be run after Borg is installed. (delete 'check) (add-after 'install 'check - (lambda _ - (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"))))) + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Make the installed package available for the test suite. + (add-installed-pythonpath inputs outputs) + ;; 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")) @@ -532,3 +540,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)))) diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 66c5e0cdcb..93b598f808 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -46,7 +46,8 @@ #:use-module (guix build-system gnu) #:use-module (guix build-system trivial) #:use-module (ice-9 match) - #:export (glibc)) + #:export (glibc + libiconv-if-needed)) ;;; Commentary: ;;; @@ -681,14 +682,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. @@ -738,6 +739,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. @@ -956,15 +960,15 @@ command.") (define-public tzdata (package (name "tzdata") - (version "2016g") + (version "2016j") (source (origin (method url-fetch) (uri (string-append - "http://www.iana.org/time-zones/repository/releases/tzdata" + "https://www.iana.org/time-zones/repository/releases/tzdata" version ".tar.gz")) (sha256 (base32 - "1lgbh49bsbysibzr7imjsh1xa7pqmimphxvvwh6kncj7pjr3fw9w")))) + "1j4xycpwhs57qnkcxwh3np8wnf3km69n3cf4w6p2yv2z247lxvpm")))) (build-system gnu-build-system) (arguments '(#:tests? #f @@ -1012,8 +1016,8 @@ command.") version ".tar.gz")) (sha256 (base32 - "0azsz436vd65bkdkdmjgsh7zhh0whnqqfliva45191krmm3hpy8z")))))) - (home-page "http://www.iana.org/time-zones") + "1dxhrk4z0n2di8p0yd6q00pa6bwyz5xqbrfbasiz8785ni7zrvxr")))))) + (home-page "https://www.iana.org/time-zones") (synopsis "Database of current and historical time zones") (description "The Time Zone Database (often called tz or zoneinfo) contains code and data that represent the history of local time for many @@ -1049,6 +1053,16 @@ program. It supports a wide variety of different encodings.") (home-page "http://www.gnu.org/software/libiconv/") (license lgpl3+))) +(define* (libiconv-if-needed #:optional (target (%current-target-system))) + "Return either a libiconv package specification to include in a dependency +list for platforms that have an incomplete libc, or the empty list. If a +package needs iconv ,@(libiconv-if-needed) should be added." + ;; POSIX C libraries provide iconv. Platforms with an incomplete libc + ;; without iconv, such as MinGW, must return the then clause. + (if (target-mingw? target) + `(("libiconv" ,libiconv)) + '())) + (define-public (canonical-package package) ;; Avoid circular dependency by lazily resolving 'commencement'. (let* ((iface (resolve-interface '(gnu packages commencement))) diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm index 8d2cb93c7c..14daf59c92 100644 --- a/gnu/packages/bioinformatics.scm +++ b/gnu/packages/bioinformatics.scm @@ -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. ;;; @@ -50,6 +51,7 @@ #:use-module (gnu packages documentation) #:use-module (gnu packages datastructures) #:use-module (gnu packages file) + #:use-module (gnu packages flex) #:use-module (gnu packages gawk) #:use-module (gnu packages gcc) #:use-module (gnu packages gd) @@ -96,7 +98,7 @@ (define-public aragorn (package (name "aragorn") - (version "1.2.37") + (version "1.2.38") (source (origin (method url-fetch) (uri (string-append @@ -104,7 +106,7 @@ version ".tgz")) (sha256 (base32 - "1c7zxk0h8wsjbix82fmmfyywcq6zn3q9h5y67kcl5y3qal2bv2xr")))) + "09i1rg716smlbnixfm7q1ml2mfpaa2fpn3hwjg625ysmfwwy712b")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; there are no tests @@ -215,8 +217,7 @@ structure of the predicted RNA.") ("libtool" ,libtool) ("zlib" ,zlib) ("python-nose" ,python2-nose) - ("python-pysam" ,python2-pysam) - ("python-setuptools" ,python2-setuptools))) + ("python-pysam" ,python2-pysam))) (inputs `(("htslib" ,htslib) ("samtools" ,samtools) @@ -523,15 +524,14 @@ intended to behave exactly the same as the original BWK awk.") (build-system python-build-system) (arguments `(#:python ,python-2)) ; no Python 3 support (inputs - `(("python-cython" ,python2-cython) - ("python-matplotlib" ,python2-matplotlib))) + `(("python-matplotlib" ,python2-matplotlib))) (propagated-inputs `(("bedtools" ,bedtools) ("samtools" ,samtools))) (native-inputs - `(("python-pyyaml" ,python2-pyyaml) - ("python-nose" ,python2-nose) - ("python-setuptools" ,python2-setuptools))) + `(("python-cython" ,python2-cython) + ("python-pyyaml" ,python2-pyyaml) + ("python-nose" ,python2-nose))) (home-page "https://pythonhosted.org/pybedtools/") (synopsis "Python wrapper for BEDtools programs") (description @@ -586,9 +586,7 @@ e.g. microbiome samples, genomes, metagenomes.") (substitute* "setup.py" (("install_requires.append\\(\"pyqi\"\\)") "pass")) #t))) - ,@(package-arguments base))) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + ,@(package-arguments base)))))) (define-public bioperl-minimal (let* ((inputs `(("perl-module-build" ,perl-module-build) @@ -673,7 +671,7 @@ provide a coordinated and extensible framework to do computational biology.") (add-before 'check 'set-home ;; Some tests require a home directory to be set. (lambda _ (setenv "HOME" "/tmp") #t))))) - (inputs + (propagated-inputs `(("python-numpy" ,python-numpy))) (home-page "http://biopython.org/") (synopsis "Tools for biological computation in Python") @@ -684,15 +682,10 @@ bioinformatics programs; a standard sequence class and tools for performing common operations on them; code to perform data classification; code for dealing with alignments; code making it easy to split up parallelizable tasks into separate processes; and more.") - (license (license:non-copyleft "http://www.biopython.org/DIST/LICENSE")) - (properties `((python2-variant . ,(delay python2-biopython)))))) + (license (license:non-copyleft "http://www.biopython.org/DIST/LICENSE")))) (define-public python2-biopython - (let ((base (package-with-python2 (strip-python2-variant python-biopython)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-biopython)) ;; An outdated version of biopython is required for seqmagick, see ;; https://github.com/fhcrc/seqmagick/issues/59 @@ -1104,7 +1097,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 @@ -1339,8 +1332,7 @@ well as many of the command line options.") `(("python-numpy" ,python2-numpy) ("zlib" ,zlib))) (native-inputs - `(("python-nose" ,python2-nose) - ("python-setuptools" ,python2-setuptools))) + `(("python-nose" ,python2-nose))) (home-page "http://bitbucket.org/james_taylor/bx-python/") (synopsis "Tools for manipulating biological data") (description @@ -1404,7 +1396,6 @@ multiple sequence alignments.") ("zlib" ,zlib))) (native-inputs `(("python-cython" ,python-cython) - ("python-setuptools" ,python-setuptools) ;; Dependencies below are are for tests only. ("samtools" ,samtools) ("bcftools" ,bcftools) @@ -1430,7 +1421,6 @@ also includes an interface for tabix.") (sha256 (base32 "1q8wnj2kga9nz1lwc4w7qv52smfm536hp6mc8w6s53lhyj0mpi22")))) - (properties `((python2-variant . ,(delay python2-twobitreader)))) (build-system python-build-system) (arguments '(;; Tests are not distributed in the PyPi release. @@ -1447,11 +1437,7 @@ UCSC genome browser.") (license license:artistic2.0))) (define-public python2-twobitreader - (let ((base (package-with-python2 (strip-python2-variant python-twobitreader)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-twobitreader)) (define-public python-plastid (package @@ -1463,7 +1449,6 @@ UCSC genome browser.") (sha256 (base32 "1sqkz5d3b9kf688mp7k771c87ins42j7j0whmkb49cb3fsg8s8lj")))) - (properties `((python2-variant . ,(delay python2-plastid)))) (build-system python-build-system) (arguments ;; Some test files are not included. @@ -1488,25 +1473,20 @@ high-throughput sequencing data – with an emphasis on simplicity.") (license license:bsd-3))) (define-public python2-plastid - (let ((base (package-with-python2 (strip-python2-variant python-plastid)))) - (package - (inherit base) - ;; setuptools is required at runtime - (propagated-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-propagated-inputs base)))))) + (package-with-python2 python-plastid)) (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 @@ -1580,9 +1560,8 @@ databases.") ("python-numpy" ,python2-numpy) ("python-scipy" ,python2-scipy))) (native-inputs - `(("python-mock" ,python2-mock) ; for tests - ("python-pytz" ,python2-pytz) ; for tests - ("python-setuptools" ,python2-setuptools))) + `(("python-mock" ,python2-mock) ; for tests + ("python-pytz" ,python2-pytz))) ; for tests (home-page "https://github.com/YeoLab/clipper") (synopsis "CLIP peak enrichment recognition") (description @@ -1755,8 +1734,7 @@ time.") ("zlib" ,zlib))) (native-inputs `(("python-cython" ,python2-cython) - ("python-nose" ,python2-nose) - ("python-setuptools" ,python2-setuptools))) + ("python-nose" ,python2-nose))) (home-page "http://crossmap.sourceforge.net/") (synopsis "Convert genome coordinates between assemblies") (description @@ -1826,7 +1804,7 @@ preparation protocols.") (define-public cutadapt (package (name "cutadapt") - (version "1.8") + (version "1.12") (source (origin (method url-fetch) (uri (string-append @@ -1835,28 +1813,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) - ("python-setuptools" ,python-setuptools))) - (home-page "https://code.google.com/p/cutadapt/") + ("python-nose" ,python-nose))) + (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 @@ -1945,27 +1925,19 @@ accessing bigWig files.") (license license:expat))) (define-public python2-pybigwig - (let ((pybigwig (package-with-python2 python-pybigwig))) - (package (inherit pybigwig) - (native-inputs - `(("python-setuptools" ,python2-setuptools)))))) + (package-with-python2 python-pybigwig)) (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") @@ -1980,15 +1952,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 @@ -1997,8 +1960,7 @@ trees (phylogenies) and characters.") ;; There is currently a test failure that only happens on some ;; systems, and only using "setup.py test" (lambda _ (zero? (system* "nosetests"))))))) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-nose" ,python2-nose) + (native-inputs `(("python2-nose" ,python2-nose) ,@(package-native-inputs base)))))) @@ -2026,9 +1988,8 @@ trees (phylogenies) and characters.") ("python-pysam" ,python2-pysam) ("python-pybigwig" ,python2-pybigwig))) (native-inputs - `(("python-mock" ,python2-mock) ;for tests - ("python-pytz" ,python2-pytz) ;for tests - ("python-setuptools" ,python2-setuptools))) + `(("python-mock" ,python2-mock) ;for tests + ("python-pytz" ,python2-pytz))) ;for tests (home-page "https://github.com/fidelram/deepTools") (synopsis "Tools for normalizing and visualizing deep-sequencing data") (description @@ -2045,7 +2006,7 @@ identify enrichments with functional annotations of the genome.") (define-public diamond (package (name "diamond") - (version "0.8.27") + (version "0.8.31") (source (origin (method url-fetch) (uri (string-append @@ -2054,7 +2015,7 @@ identify enrichments with functional annotations of the genome.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0g0zdyfnri9v7nfbh8f7zqs4af1xydqkiw8m0cx4jc2ql4chpf6a")))) + "0nh79f4rpgq8vmlga743r7vd0z0ik6spy34f7vfq0v9lcmvfr7xq")))) (build-system cmake-build-system) (arguments '(#:tests? #f ; no "check" target @@ -2683,8 +2644,7 @@ comment or quality sections.") ("python-pysam" ,python2-pysam) ("python-networkx" ,python2-networkx))) (native-inputs - `(("python-cython" ,python2-cython) - ("python-setuptools" ,python2-setuptools))) + `(("python-cython" ,python2-cython))) (home-page "http://grit-bio.org") (synopsis "Tool for integrative analysis of RNA-seq type assays") (description @@ -2810,8 +2770,6 @@ HMMs).") `(("python-numpy" ,python2-numpy))) (inputs `(("python-pysam" ,python2-pysam))) - (native-inputs - `(("python-setuptools" ,python2-setuptools))) (home-page "http://www-huber.embl.de/users/anders/HTSeq/") (synopsis "Analysing high-throughput sequencing data with Python") (description @@ -2932,8 +2890,7 @@ data. It also provides the bgzip, htsfile, and tabix utilities.") ("python-numpy" ,python-numpy) ("python-matplotlib" ,python-matplotlib))) (native-inputs - `(("python-cython" ,python-cython) - ("python-setuptools" ,python-setuptools))) + `(("python-cython" ,python-cython))) (home-page "https://github.com/nboley/idr") (synopsis "Tool to measure the irreproducible discovery rate (IDR)") (description @@ -3090,8 +3047,6 @@ data.") #:tests? #f)) ; no test target (inputs `(("python-numpy" ,python2-numpy))) - (native-inputs - `(("python-setuptools" ,python2-setuptools))) (home-page "http://github.com/taoliu/MACS/") (synopsis "Model based analysis for ChIP-Seq data") (description @@ -3423,9 +3378,8 @@ linker_so='gcc -shared'); defines"))))) ("python-scipy" ,python2-scipy) ("python-matplotlib" ,python2-matplotlib))) (native-inputs - `(("python-mock" ,python2-mock) ;for tests - ("python-pytz" ,python2-pytz) ;for tests - ("python-setuptools" ,python2-setuptools))) + `(("python-mock" ,python2-mock) ;for tests + ("python-pytz" ,python2-pytz))) ;for tests (home-page "http://genes.mit.edu/burgelab/miso/index.html") (synopsis "Mixture of Isoforms model for RNA-Seq isoform quantitation") (description @@ -3472,10 +3426,49 @@ program for nucleotide and protein sequences.") ;; License information found in 'muscle -h' and usage.cpp. (license license:public-domain))) +(define-public newick-utils + ;; There are no recent releases so we package from git. + (let ((commit "da121155a977197cab9fbb15953ca1b40b11eb87")) + (package + (name "newick-utils") + (version (string-append "1.6-1." (string-take commit 8))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/tjunier/newick_utils.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "1hkw21rq1mwf7xp0rmbb2gqc0i6p11108m69i7mr7xcjl268pxnb")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'autoconf + (lambda _ (zero? (system* "autoreconf" "-vif"))))))) + (inputs + ;; XXX: TODO: Enable Lua and Guile bindings. + ;; https://github.com/tjunier/newick_utils/issues/13 + `(("libxml2" ,libxml2) + ("flex" ,flex) + ("bison" ,bison))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool))) + (synopsis "Programs for working with newick format phylogenetic trees") + (description + "Newick-utils is a suite of utilities for processing phylogenetic trees +in Newick format. Functions include re-rooting, extracting subtrees, +trimming, pruning, condensing, drawing (ASCII graphics or SVG).") + (home-page "https://github.com/tjunier/newick_utils") + (license license:bsd-3)))) + (define-public orfm (package (name "orfm") - (version "0.5.3") + (version "0.6.1") (source (origin (method url-fetch) (uri (string-append @@ -3483,7 +3476,7 @@ program for nucleotide and protein sequences.") version "/orfm-" version ".tar.gz")) (sha256 (base32 - "0vb6d771gl4mix8bwx919x5ayy9pkj44n7ki336nz3rz2rx4c7gk")))) + "19hwp13n82isdvk16710l9m35cmzf0q3fsrcn3r8c5r67biiz39s")))) (build-system gnu-build-system) (inputs `(("zlib" ,zlib))) (native-inputs @@ -3509,18 +3502,15 @@ interrupted by stop codons. OrfM finds and prints these ORFs.") "1kjmv891d6qbpp4shhhvkl02ff4q5xlpnls2513sm2cjcrs52f1i")))) (build-system python-build-system) (arguments `(#:python ,python-2)) ; pbcore requires Python 2.7 - (inputs + (propagated-inputs `(("python-cython" ,python2-cython) ("python-numpy" ,python2-numpy) ("python-pysam" ,python2-pysam) ("python-h5py" ,python2-h5py))) (native-inputs - `(("python-docutils" ,python2-docutils) - ("python-nose" ,python2-nose) - ("python-setuptools" ,python2-setuptools) - ("python-sphinx" ,python2-sphinx))) - (propagated-inputs - `(("python-pyxb" ,python2-pyxb))) + `(("python-nose" ,python2-nose) + ("python-sphinx" ,python2-sphinx) + ("python-pyxb" ,python2-pyxb))) (home-page "http://pacificbiosciences.github.io/pbcore/") (synopsis "Library for reading and writing PacBio data files") (description @@ -3543,18 +3533,7 @@ files and writing bioinformatics applications.") "1agfz6zqa8nc6cw47yh0s3y14gkpa9wqazwcj7mwwj3ffnw39p3j")))) (build-system python-build-system) (arguments - `(#:python ,python-2 ; requires Python 2.7 - #:phases - (modify-phases %standard-phases - (add-after - 'install 'remove-bin-directory - (lambda* (#:key outputs #:allow-other-keys) - ;; The "bin" directory only contains wrappers for running - ;; the module tests. They are not needed after the - ;; "check" phase. - (delete-file-recursively - (string-append (assoc-ref outputs "out") "/bin")) - #t))))) + `(#:python ,python-2)) ; requires Python 2.7 (propagated-inputs `(("python-scipy" ,python2-scipy) ("python-numpy" ,python2-numpy) @@ -3563,8 +3542,7 @@ files and writing bioinformatics applications.") ("python-pandas" ,python2-pandas) ("python-pysnptools" ,python2-pysnptools))) (native-inputs - `(("python-setuptools" ,python2-setuptools) - ("python-mock" ,python2-mock) + `(("python-mock" ,python2-mock) ("python-nose" ,python2-nose) ("unzip" ,unzip))) (home-page "https://github.com/PMBio/warpedLMM") @@ -3598,11 +3576,6 @@ the phenotype as it models the data.") (build-system python-build-system) (arguments `(#:python ,python-2 - ;; With standard flags, the install phase attempts to create a zip'd - ;; egg file, and fails with an error: 'ZIP does not support timestamps - ;; before 1980' - #:configure-flags '("--single-version-externally-managed" - "--record=pbtranscript-tofu.txt") #:phases (modify-phases %standard-phases (add-after 'unpack 'enter-directory @@ -3626,8 +3599,7 @@ the phenotype as it models the data.") ("python-h5py" ,python2-h5py))) (native-inputs `(("python-cython" ,python2-cython) - ("python-nose" ,python2-nose) - ("python-setuptools" ,python2-setuptools))) + ("python-nose" ,python2-nose))) (home-page "https://github.com/PacificBiosciences/cDNA_primer") (synopsis "Analyze transcriptome data generated with the Iso-Seq protocol") (description @@ -4076,7 +4048,6 @@ BAM and Wiggle files in both transcript-coordinate and genomic-coordinate.") `(("python-cython" ,python2-cython) ("python-pysam" ,python2-pysam) ("python-numpy" ,python2-numpy) - ("python-setuptools" ,python2-setuptools) ("zlib" ,zlib))) (native-inputs `(("python-nose" ,python2-nose))) @@ -4282,7 +4253,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 @@ -4638,11 +4609,7 @@ sequence itself can be retrieved from these databases.") (license license:bsd-3))) (define-public python2-screed - (let ((base (package-with-python2 (strip-python2-variant python-screed)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-screed)) (define-public sra-tools (package @@ -4804,8 +4771,7 @@ bioinformatics file formats, sequence alignment, and more.") ;; should be removed. `(("python-biopython" ,python2-biopython-1.66))) (native-inputs - `(("python-setuptools" ,python2-setuptools) - ("python-nose" ,python2-nose))) + `(("python-nose" ,python2-nose))) (home-page "http://github.com/fhcrc/seqmagick") (synopsis "Tools for converting and modifying sequence files") (description @@ -4948,7 +4914,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/" @@ -4956,7 +4922,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 @@ -4965,6 +4931,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) @@ -5246,20 +5213,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 @@ -5323,14 +5291,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 @@ -5653,7 +5621,7 @@ track. The database is exposed as a @code{TxDb} object.") (define-public vsearch (package (name "vsearch") - (version "2.3.0") + (version "2.3.4") (source (origin (method url-fetch) @@ -5663,7 +5631,7 @@ track. The database is exposed as a @code{TxDb} object.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "1r8fk3whkil348y5hfsd4r56qjmchhq4nxm6s7ra5rlisw0mf9fy")) + "1xyraxmhyx62mxx8z7c8waygvcijwkh48ms1ar60w2cv2y2sn4al")) (modules '((guix build utils))) (snippet '(begin @@ -5723,15 +5691,16 @@ Needleman-Wunsch).") (define-public pardre (package (name "pardre") - (version "1.1.5") + ;; The source of 1.1.5 changed in place, so we append "-1" to the version. + (version "1.1.5-1") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/pardre/ParDRe-rel" - version ".tar.gz")) + "1.1.5" ".tar.gz")) (sha256 (base32 - "0zkyjzv4s8q2h5npalhirbk17r5b1h0n2a42mh7njzlf047h9bhy")))) + "17j73nc0viq4f6qj50nrndsrif5d6b71q8fl87m54psiv0ilns2b")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests included @@ -5839,14 +5808,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))) @@ -5975,13 +5944,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) @@ -6110,13 +6079,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) @@ -6162,13 +6131,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) @@ -6191,13 +6160,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) @@ -6217,13 +6186,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 @@ -6243,13 +6212,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 @@ -6281,13 +6250,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") @@ -6336,13 +6305,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) @@ -6468,13 +6437,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) @@ -6645,13 +6614,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) @@ -7257,7 +7226,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) @@ -7265,7 +7234,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") @@ -7298,6 +7267,29 @@ two-dimensional genome scans.") libraries for systems that do not have these available via other means.") (license license:artistic2.0))) +(define-public r-r4rna + (package + (name "r-r4rna") + (version "0.1.4") + (source + (origin + (method url-fetch) + (uri (string-append "http://www.e-rna.org/r-chie/files/R4RNA_" + version ".tar.gz")) + (sha256 + (base32 + "1p0i78wh76jfgmn9jphbwwaz6yy6pipzfg08xs54cxavxg2j81p5")))) + (build-system r-build-system) + (propagated-inputs + `(("r-optparse" ,r-optparse) + ("r-rcolorbrewer" ,r-rcolorbrewer))) + (home-page "http://www.e-rna.org/r-chie/index.cgi") + (synopsis "Analysis framework for RNA secondary structure") + (description + "The R4RNA package aims to be a general framework for the analysis of RNA +secondary structure and comparative analysis in R.") + (license license:gpl3+))) + (define-public r-rhtslib (package (name "r-rhtslib") @@ -7358,7 +7350,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" @@ -7366,7 +7358,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) @@ -7388,6 +7380,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) @@ -7478,6 +7471,141 @@ characterization and visualization of a wide range of mutational patterns in SNV base substitution data.") (license license:expat))) +(define-public r-wgcna + (package + (name "r-wgcna") + (version "1.51") + (source + (origin + (method url-fetch) + (uri (cran-uri "WGCNA" version)) + (sha256 + (base32 + "0hzvnhw76vwg8bl8x368f0c5szpwb8323bmrb3bir93i5bmfjsxx")))) + (properties `((upstream-name . "WGCNA"))) + (build-system r-build-system) + (propagated-inputs + `(("r-annotationdbi" ,r-annotationdbi) + ("r-doparallel" ,r-doparallel) + ("r-dynamictreecut" ,r-dynamictreecut) + ("r-fastcluster" ,r-fastcluster) + ("r-foreach" ,r-foreach) + ("r-go-db" ,r-go-db) + ("r-hmisc" ,r-hmisc) + ("r-impute" ,r-impute) + ("r-matrixstats" ,r-matrixstats) + ("r-preprocesscore" ,r-preprocesscore))) + (home-page + "http://www.genetics.ucla.edu/labs/horvath/CoexpressionNetwork/Rpackages/WGCNA/") + (synopsis "Weighted correlation network analysis") + (description + "This package provides functions necessary to perform Weighted +Correlation Network Analysis on high-dimensional data. It includes functions +for rudimentary data cleaning, construction and summarization of correlation +networks, module identification and functions for relating both variables and +modules to sample traits. It also includes a number of utility functions for +data manipulation and visualization.") + (license license:gpl2+))) + +(define-public r-chipkernels + (let ((commit "c9cfcacb626b1221094fb3490ea7bac0fd625372") + (revision "1")) + (package + (name "r-chipkernels") + (version (string-append "1.1-" revision "." (string-take commit 9))) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/ManuSetty/ChIPKernels.git") + (commit commit))) + (file-name (string-append name "-" version)) + (sha256 + (base32 + "14bj5qhjm1hsm9ay561nfbqi9wxsa7y487df2idsaaf6z10nw4v0")))) + (build-system r-build-system) + (propagated-inputs + `(("r-iranges" ,r-iranges) + ("r-xvector" ,r-xvector) + ("r-biostrings" ,r-biostrings) + ("r-bsgenome" ,r-bsgenome) + ("r-gtools" ,r-gtools) + ("r-genomicranges" ,r-genomicranges) + ("r-sfsmisc" ,r-sfsmisc) + ("r-kernlab" ,r-kernlab) + ("r-s4vectors" ,r-s4vectors) + ("r-biocgenerics" ,r-biocgenerics))) + (home-page "https://github.com/ManuSetty/ChIPKernels") + (synopsis "Build string kernels for DNA Sequence analysis") + (description "ChIPKernels is an R package for building different string +kernels used for DNA Sequence analysis. A dictionary of the desired kernel +must be built and this dictionary can be used for determining kernels for DNA +Sequences.") + (license license:gpl2+)))) + +(define-public r-seqgl + (package + (name "r-seqgl") + (version "1.1.4") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/ManuSetty/SeqGL/" + "archive/" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0pnk1p3sci5yipyc8xnb6jbmydpl80fld927xgnbcv104hy8h8yh")))) + (build-system r-build-system) + (propagated-inputs + `(("r-biostrings" ,r-biostrings) + ("r-chipkernels" ,r-chipkernels) + ("r-genomicranges" ,r-genomicranges) + ("r-spams" ,r-spams) + ("r-wgcna" ,r-wgcna) + ("r-fastcluster" ,r-fastcluster))) + (home-page "https://github.com/ManuSetty/SeqGL") + (synopsis "Group lasso for Dnase/ChIP-seq data") + (description "SeqGL is a group lasso based algorithm to extract +transcription factor sequence signals from ChIP, DNase and ATAC-seq profiles. +This package presents a method which uses group lasso to discriminate between +bound and non bound genomic regions to accurately identify transcription +factors bound at the specific regions.") + (license license:gpl2+))) + +(define-public r-gkmsvm + (package + (name "r-gkmsvm") + (version "0.71.0") + (source + (origin + (method url-fetch) + (uri (cran-uri "gkmSVM" version)) + (sha256 + (base32 + "1zpxgxmf2nd5j5wn00ps6kfxr8wxh7d1swr1rr4spq7sj5z5z0k0")))) + (properties `((upstream-name . "gkmSVM"))) + (build-system r-build-system) + (propagated-inputs + `(("r-biocgenerics" ,r-biocgenerics) + ("r-biostrings" ,r-biostrings) + ("r-genomeinfodb" ,r-genomeinfodb) + ("r-genomicranges" ,r-genomicranges) + ("r-iranges" ,r-iranges) + ("r-kernlab" ,r-kernlab) + ("r-rcpp" ,r-rcpp) + ("r-rocr" ,r-rocr) + ("r-rtracklayer" ,r-rtracklayer) + ("r-s4vectors" ,r-s4vectors) + ("r-seqinr" ,r-seqinr))) + (home-page "http://cran.r-project.org/web/packages/gkmSVM") + (synopsis "Gapped-kmer support vector machine") + (description + "This R package provides tools for training gapped-kmer SVM classifiers +for DNA and protein sequences. This package supports several sequence +kernels, including: gkmSVM, kmer-SVM, mismatch kernel and wildcard kernel.") + (license license:gpl2+))) + (define-public emboss (package (name "emboss") @@ -7667,24 +7795,12 @@ may optionally be provided to further inform the peak-calling process.") (build-system python-build-system) (arguments `(#:python ,python-2 ; python2 only - #:tests? #f ; no tests included - #:phases - (modify-phases %standard-phases - ;; When setuptools is used a ".egg" archive is generated and - ;; installed. This makes it hard to actually run PePr. This issue - ;; has been reported upstream: - ;; https://github.com/shawnzhangyx/PePr/issues/9 - (add-after 'unpack 'disable-egg-generation - (lambda _ - (substitute* "setup.py" - (("from setuptools import setup") - "from distutils.core import setup")) - #t))))) + #:tests? #f)) ; no tests included (propagated-inputs `(("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 @@ -7725,15 +7841,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) + (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) @@ -7741,8 +7862,6 @@ replacement for strverscmp.") ("python-click" ,python-click) ("python-matplotlib" ,python-matplotlib) ("python-numpy" ,python-numpy))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://multiqc.info") (synopsis "Aggregate bioinformatics analysis reports") (description @@ -7750,3 +7869,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))) diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm index eff1b5a1c4..43ec087bf5 100644 --- a/gnu/packages/bittorrent.scm +++ b/gnu/packages/bittorrent.scm @@ -2,7 +2,9 @@ ;;; 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> ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,11 +31,15 @@ #:use-module (gnu packages adns) #:use-module (gnu packages check) #:use-module (gnu packages compression) + #:use-module (gnu packages crypto) #:use-module (gnu packages curl) #:use-module (gnu packages cyrus-sasl) #:use-module (gnu packages databases) #:use-module (gnu packages file) #:use-module (gnu packages glib) + #:use-module (gnu packages gnome) + #:use-module (gnu packages gnupg) + #:use-module (gnu packages gstreamer) #:use-module (gnu packages gtk) #:use-module (gnu packages libevent) #:use-module (gnu packages linux) @@ -208,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/" @@ -216,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" @@ -231,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))) @@ -251,3 +258,71 @@ interface, for the Transmission BitTorrent daemon.") download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink. Aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.") (license l:gpl2+))) + +(define-public uget + (package + (name "uget") + (version "2.0.8") + (source (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/urlget/" + "uget%20%28stable%29/" version "/uget-" + version ".tar.gz")) + (sha256 + (base32 + "0919cf7lfk1djdl003cahqjvafdliv7v2l8r5wg95n4isqggdk75")))) + (build-system gnu-build-system) + (native-inputs + `(("intltool" ,intltool))) + (inputs + `(("curl" ,curl) + ("gtk+" ,gtk+) + ("glib" ,glib) + ("gnutls" ,gnutls) + ("gstreamer" ,gstreamer) + ("libgcrypt" ,libgcrypt) + ("libnotify" ,libnotify) + ("openssl" ,openssl))) + (native-inputs + `(("intltool" ,intltool) + ("pkg-config" ,pkg-config))) + (home-page "http://ugetdm.com/") + (synopsis "Universal download manager with GTK+ interface") + (description + "uGet is portable download manager with GTK+ interface supporting +HTTP, HTTPS, BitTorrent and Metalink, supporting multi-connection +downloads, download scheduling, download rate limiting.") + (license l:lgpl2.1+))) + +(define-public mktorrent + (package + (name "mktorrent") + (version "1.0") + (source (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/mktorrent/mktorrent/" + version "/" name "-" version ".tar.gz")) + (sha256 + (base32 + "17qi3nfky240pq6qcmf5qg324mxm83vk9r3nvsdhsvinyqm5d3kg")))) + (build-system gnu-build-system) + (arguments + `(#:phases (modify-phases %standard-phases + (delete 'configure)) ; no configure script + #:make-flags (list "CC=gcc" + (string-append "PREFIX=" (assoc-ref %outputs "out")) + "NO_HASH_CHECK=1" + "USE_LARGE_FILES=1" + "USE_LONG_OPTIONS=1" + "USE_PTHREADS=1") + #:tests? #f)) ; no tests + (home-page "http://mktorrent.sourceforge.net/") + (synopsis "Utility to create BitTorrent metainfo files") + (description "mktorrent is a simple command-line utility to create +BitTorrent @dfn{metainfo} files, often known simply as @dfn{torrents}, from +both single files and whole directories. It can add multiple trackers and web +seed URLs, and set the @code{private} flag to disallow advertisement through +the distributed hash table (DHT) and Peer Exchange. Hashing is multi-threaded +and will take advantage of multiple processor cores where possible.") + (license (list l:public-domain ; sha1.*, used to build without OpenSSL + l:gpl2+)))) ; with permission to link with OpenSSL diff --git a/gnu/packages/boost.scm b/gnu/packages/boost.scm index ab31fa8c5c..e6abf4d5e3 100644 --- a/gnu/packages/boost.scm +++ b/gnu/packages/boost.scm @@ -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 diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index 64a82393af..c4a3fc3e7c 100644 --- a/gnu/packages/bootstrap.scm +++ b/gnu/packages/bootstrap.scm @@ -175,6 +175,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" @@ -288,7 +289,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 diff --git a/gnu/packages/busybox.scm b/gnu/packages/busybox.scm index ecbdd6f939..988154eed4 100644 --- a/gnu/packages/busybox.scm +++ b/gnu/packages/busybox.scm @@ -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. diff --git a/gnu/packages/calendar.scm b/gnu/packages/calendar.scm index 306c949066..70bf8f9573 100644 --- a/gnu/packages/calendar.scm +++ b/gnu/packages/calendar.scm @@ -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")))) @@ -96,10 +97,9 @@ data units.") `(#:phases (modify-phases %standard-phases ;; Building the manpage requires khal to be installed. (add-after 'install 'manpage - (lambda* (#:key outputs #:allow-other-keys) - (setenv "PYTHONPATH" - (string-append - (getenv "PYTHONPATH") ":" (assoc-ref outputs "out"))) + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) (zero? (system* "make" "--directory=doc/" "man")) (install-file "doc/build/man/khal.1" diff --git a/gnu/packages/cdrom.scm b/gnu/packages/cdrom.scm index 829156a7c8..44f4eb035a 100644 --- a/gnu/packages/cdrom.scm +++ b/gnu/packages/cdrom.scm @@ -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))) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index b394571d6f..f0a6ff4d1c 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -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") diff --git a/gnu/packages/ci.scm b/gnu/packages/ci.scm index 3f54ff1298..05c51bbc4d 100644 --- a/gnu/packages/ci.scm +++ b/gnu/packages/ci.scm @@ -1,5 +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> ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,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) @@ -181,3 +184,61 @@ release that uses a purely functional language to describe build jobs and their dependencies.") (license l:gpl3+)))) + +(define-public cuirass + (let ((commit "cbdb59af8e7a1b40d687f80e62c5892686d384d2") + (revision "2")) + (package + (name "cuirass") + (version (string-append "0.0.1-" revision "." (string-take commit 7))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://notabug.org/mthl/cuirass") + (commit commit))) + (file-name (string-append name "-" version)) + (sha256 + (base32 + "0qmhchazg8wyrfn6d2im4jg7d52gb0xp8afjan5szl3bpphi4s28")))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'bootstrap + (lambda _ (zero? (system* "sh" "bootstrap")))) + (add-after 'install 'wrap-program + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Wrap the 'cuirass' command to refer to the right modules. + (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))) + #t)))))) + (inputs + `(("guile" ,guile-2.0) + ("guile-json" ,guile-json) + ("guile-sqlite3" ,guile-sqlite3) + ("guix" ,guix) + ("git" ,git))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("pkg-config" ,pkg-config) + ("texinfo" ,texinfo))) + (synopsis "Continuous integration system") + (description + "Cuirass is a continuous integration tool using GNU Guix. It is +intended as a replacement for Hydra.") + (home-page "https://notabug.org/mthl/cuirass") + (license l:gpl3+)))) diff --git a/gnu/packages/code.scm b/gnu/packages/code.scm index baa9861622..f5aa7f4faf 100644 --- a/gnu/packages/code.scm +++ b/gnu/packages/code.scm @@ -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) diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm index 1238f5cf5b..273e3ca808 100644 --- a/gnu/packages/commencement.scm +++ b/gnu/packages/commencement.scm @@ -497,7 +497,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 = " @@ -522,7 +522,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)) '()) @@ -806,6 +806,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 diff --git a/gnu/packages/connman.scm b/gnu/packages/connman.scm index 65214271b5..870001237d 100644 --- a/gnu/packages/connman.scm +++ b/gnu/packages/connman.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2017 Mathieu OTHACEHE <m.othacehe@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,10 +25,13 @@ #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages admin) + #:use-module (gnu packages enlightenment) #: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) @@ -49,7 +53,7 @@ (arguments `(#:configure-flags (list "--enable-nmcompat" - ;; "--enable-polkit" + "--enable-polkit" "--enable-openconnect" "--enable-openvpn" "--enable-vpnc" @@ -70,7 +74,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. @@ -90,3 +94,78 @@ cases. Connman implements DNS resolving and caching, DHCP clients for both IPv4 and IPv6, link-local IPv4 address handling and tethering (IP connection sharing) to clients via USB, ethernet, WiFi, cellular and Bluetooth.") (license gpl2))) + +(define-public econnman + (package + (name "econnman") + (version "1.1") + (source + (origin + (method url-fetch) + (uri (string-append "https://download.enlightenment.org/rel/apps/" + "econnman/econnman-" version ".tar.gz")) + (sha256 + (base32 + "057pwwavlvrrq26bncqnfrf449zzaim0zq717xv86av4n940gwv0")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags '("--localstatedir=/var") + #:phases + (modify-phases %standard-phases + (add-after 'install 'wrap-binary + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin/econnman-bin"))) + (wrap-program bin + `("PYTHONPATH" ":" prefix (,(getenv "PYTHONPATH")))) + #t)))))) + (native-inputs `(("pkg-config" ,pkg-config))) + (inputs + `(("efl" ,efl) + ("python-2" ,python-2) + ("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))) diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm index da2efc3642..47e0958193 100644 --- a/gnu/packages/cross-base.scm +++ b/gnu/packages/cross-base.scm @@ -20,12 +20,12 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages cross-base) - #:use-module (guix licenses) #:use-module (gnu packages) #:use-module (gnu packages gcc) #:use-module (gnu packages base) #:use-module (gnu packages linux) #:use-module (gnu packages hurd) + #:use-module (gnu packages mingw) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix utils) @@ -37,13 +37,26 @@ #:use-module (ice-9 regex) #:export (cross-binutils cross-libc - cross-gcc)) + cross-gcc + cross-newlib?)) (define %xgcc ;; GCC package used as the basis for cross-compilation. It doesn't have to ;; be 'gcc' and can be a specific variant such as 'gcc-4.8'. gcc) +(define %gcc-include-paths + ;; Environment variables for header search paths. + ;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'. + '("C_INCLUDE_PATH" + "CPLUS_INCLUDE_PATH" + "OBJC_INCLUDE_PATH" + "OBJCPLUS_INCLUDE_PATH")) + +(define %gcc-cross-include-paths + ;; Search path for target headers when cross-compiling. + (map (cut string-append "CROSS_" <>) %gcc-include-paths)) + (define (cross p target) (package (inherit p) (name (string-append (package-name p) "-cross-" target)) @@ -104,7 +117,7 @@ may be either a libc package or #f.)" `(append (list ,(string-append "--target=" target) ,@(if libc `( ;; Disable libcilkrts because it is not - ;; ported to GNU/Hurd. + ;; ported to GNU/Hurd. "--disable-libcilkrts") `( ;; Disable features not needed at this stage. "--disable-shared" "--enable-static" @@ -131,7 +144,12 @@ may be either a libc package or #f.)" "--disable-libitm" "--disable-libvtv" "--disable-libsanitizer" - ))) + )) + + ;; For a newlib (non-glibc) target + ,@(if (cross-newlib? target) + '("--with-newlib") + '())) ,(if libc flags @@ -146,80 +164,24 @@ may be either a libc package or #f.)" ,flags)) flags)) ((#:phases phases) - (let ((phases - `(alist-cons-after - 'install 'make-cross-binutils-visible - (lambda* (#:key outputs inputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (libexec (string-append out "/libexec/gcc/" - ,target)) - (binutils (string-append - (assoc-ref inputs "binutils-cross") - "/bin/" ,target "-")) - (wrapper (string-append - (assoc-ref inputs "ld-wrapper-cross") - "/bin/" ,target "-ld"))) - (for-each (lambda (file) - (symlink (string-append binutils file) - (string-append libexec "/" - file))) - '("as" "nm")) - (symlink wrapper (string-append libexec "/ld")) - #t)) - (alist-replace - 'install - (lambda _ - ;; Unlike our 'strip' phase, this will do the right thing - ;; for cross-compilers. - (zero? (system* "make" "install-strip"))) - ,phases)))) - (if libc - `(alist-cons-before - 'configure 'set-cross-path - (lambda* (#:key inputs #:allow-other-keys) - ;; Add the cross kernel headers to CROSS_CPATH, and remove them - ;; from CPATH. - (let ((libc (assoc-ref inputs "libc")) - (kernel (assoc-ref inputs "xkernel-headers"))) - (define (cross? x) - ;; Return #t if X is a cross-libc or cross Linux. - (or (string-prefix? libc x) - (string-prefix? kernel x))) - (let ((cpath (string-append - libc "/include" - ":" kernel "/include"))) - (for-each (cut setenv <> cpath) - '("CROSS_C_INCLUDE_PATH" - "CROSS_CPLUS_INCLUDE_PATH" - "CROSS_OBJC_INCLUDE_PATH" - "CROSS_OBJCPLUS_INCLUDE_PATH"))) - (setenv "CROSS_LIBRARY_PATH" - (string-append libc "/lib:" - kernel "/lib")) ;for Hurd's libihash - (for-each - (lambda (var) - (and=> (getenv var) - (lambda (value) - (let* ((path (search-path-as-string->list value)) - (native-path (list->search-path-as-string - (remove cross? path) ":"))) - (setenv var native-path))))) - '("C_INCLUDE_PATH" - "CPLUS_INCLUDE_PATH" - "OBJC_INCLUDE_PATH" - "OBJCPLUS_INCLUDE_PATH" - "LIBRARY_PATH")) - #t)) - ,phases) - phases))))))) + `(cross-gcc-build-phases ,target ,phases)))))) (define (cross-gcc-patches target) "Return GCC patches needed for TARGET." (cond ((string-prefix? "xtensa-" target) ;; Patch by Qualcomm needed to build the ath9k-htc firmware. (search-patches "ath9k-htc-firmware-gcc.patch")) + ((target-mingw? target) + (search-patches "gcc-4.9.3-mingw-gthr-default.patch")) (else '()))) +(define (cross-gcc-snippet target) + "Return GCC snippet needed for TARGET." + (cond ((target-mingw? target) + '(copy-recursively "libstdc++-v3/config/os/mingw32-w64" + "libstdc++-v3/config/os/newlib")) + (else #f))) + (define* (cross-gcc target #:optional (xbinutils (cross-binutils target)) libc) "Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use @@ -234,7 +196,10 @@ GCC that does not target a libc; otherwise, target that libc." (append (origin-patches (package-source %xgcc)) (cons (search-patch "gcc-cross-environment-variables.patch") - (cross-gcc-patches target)))))) + (cross-gcc-patches target)))) + (modules '((guix build utils))) + (snippet + (cross-gcc-snippet target)))) ;; For simplicity, use a single output. Otherwise libgcc_s & co. are not ;; found by default, etc. @@ -242,11 +207,14 @@ GCC that does not target a libc; otherwise, target that libc." (arguments `(#:implicit-inputs? #f + #:imported-modules ((gnu build cross-toolchain) + ,@%gnu-build-system-modules) #:modules ((guix build gnu-build-system) (guix build utils) - (ice-9 regex) + (gnu build cross-toolchain) (srfi srfi-1) - (srfi srfi-26)) + (srfi srfi-26) + (ice-9 regex)) ,@(cross-gcc-arguments target libc))) @@ -264,34 +232,32 @@ GCC that does not target a libc; otherwise, target that libc." ;; Remaining inputs. ,@(let ((inputs (append (package-inputs %xgcc) (alist-delete "libc" (%final-inputs))))) - (if libc - `(("libc" ,libc) - ("xkernel-headers" ;the target headers - ,@(assoc-ref (package-propagated-inputs libc) - "kernel-headers")) - ,@inputs) - inputs)))) + (cond + ((target-mingw? target) + (if libc + `(("libc" ,mingw-w64) + ,@inputs) + `(("mingw-source" ,(package-source mingw-w64)) + ,@inputs))) + (libc + `(("libc" ,libc) + ("xkernel-headers" ;the target headers + ,@(assoc-ref (package-propagated-inputs libc) + "kernel-headers")) + ,@inputs)) + (else inputs))))) (inputs '()) ;; Only search target inputs, not host inputs. - ;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'. - (search-paths - (list (search-path-specification - (variable "CROSS_C_INCLUDE_PATH") - (files '("include"))) - (search-path-specification - (variable "CROSS_CPLUS_INCLUDE_PATH") - (files '("include"))) - (search-path-specification - (variable "CROSS_OBJC_INCLUDE_PATH") - (files '("include"))) - (search-path-specification - (variable "CROSS_OBJCPLUS_INCLUDE_PATH") - (files '("include"))) - (search-path-specification - (variable "CROSS_LIBRARY_PATH") - (files '("lib" "lib64"))))) + (search-paths (cons (search-path-specification + (variable "CROSS_LIBRARY_PATH") + (files '("lib" "lib64"))) + (map (lambda (variable) + (search-path-specification + (variable variable) + (files '("include")))) + %gcc-cross-include-paths))) (native-search-paths '()))) (define* (cross-kernel-headers target @@ -344,10 +310,7 @@ GCC that does not target a libc; otherwise, target that libc." (let* ((mach (assoc-ref inputs "cross-gnumach-headers")) (cpath (string-append mach "/include"))) (for-each (cut setenv <> cpath) - '("CROSS_C_INCLUDE_PATH" - "CROSS_CPLUS_INCLUDE_PATH" - "CROSS_OBJC_INCLUDE_PATH" - "CROSS_OBJCPLUS_INCLUDE_PATH")))) + ',%gcc-cross-include-paths))) %standard-phases) #:configure-flags (list ,(string-append "--target=" target)) ,@(package-arguments mig))) @@ -362,7 +325,6 @@ GCC that does not target a libc; otherwise, target that libc." (name (string-append (package-name hurd-headers) "-cross-" target)) - (propagated-inputs `(("cross-mig" ,xmig))) (native-inputs `(("cross-gcc" ,xgcc) ("cross-binutils" ,xbinutils) ("cross-mig" ,xmig) @@ -388,10 +350,7 @@ GCC that does not target a libc; otherwise, target that libc." (cpath (string-append mach "/include:" hurd "/include"))) (for-each (cut setenv <> cpath) - '("CROSS_C_INCLUDE_PATH" - "CROSS_CPLUS_INCLUDE_PATH" - "CROSS_OBJC_INCLUDE_PATH" - "CROSS_OBJCPLUS_INCLUDE_PATH")))) + ',%gcc-cross-include-paths))) ,phases)))) (propagated-inputs `(("gnumach-headers" ,xgnumach-headers) @@ -419,10 +378,7 @@ GCC that does not target a libc; otherwise, target that libc." (let* ((glibc-headers (assoc-ref inputs "cross-glibc-hurd-headers")) (cpath (string-append glibc-headers "/include"))) (for-each (cut setenv <> cpath) - '("CROSS_C_INCLUDE_PATH" - "CROSS_CPLUS_INCLUDE_PATH" - "CROSS_OBJC_INCLUDE_PATH" - "CROSS_OBJCPLUS_INCLUDE_PATH")))) + ',%gcc-cross-include-paths))) ,phases)))) (inputs `(("cross-glibc-hurd-headers" ,xglibc/hurd-headers))) @@ -464,61 +420,69 @@ XBINUTILS and the cross tool chain." (_ glibc/linux))) ;; Use (cross-libc-for-target ...) to determine the correct libc to use. - (let ((libc (cross-libc-for-target target))) - (package (inherit libc) - (name (string-append "glibc-cross-" target)) - (arguments - (substitute-keyword-arguments - `(;; Disable stripping (see above.) - #:strip-binaries? #f - - ;; This package is used as a target input, but it should not have - ;; the usual cross-compilation inputs since that would include - ;; itself. - #:implicit-cross-inputs? #f - - ;; We need SRFI 26. - #:modules ((guix build gnu-build-system) - (guix build utils) - (srfi srfi-26)) - ,@(package-arguments libc)) - ((#:configure-flags flags) - `(cons ,(string-append "--host=" target) - ,flags)) - ((#:phases phases) - `(alist-cons-before - 'configure 'set-cross-kernel-headers-path - (lambda* (#:key inputs #:allow-other-keys) - (let* ((kernel (assoc-ref inputs "kernel-headers")) - (cpath (string-append kernel "/include"))) - (for-each (cut setenv <> cpath) - '("CROSS_C_INCLUDE_PATH" - "CROSS_CPLUS_INCLUDE_PATH" - "CROSS_OBJC_INCLUDE_PATH" - "CROSS_OBJCPLUS_INCLUDE_PATH")) - (setenv "CROSS_LIBRARY_PATH" - (string-append kernel "/lib")) ;for Hurd's libihash - #t)) - ,phases)))) - - ;; Shadow the native "kernel-headers" because glibc's recipe expects the - ;; "kernel-headers" input to point to the right thing. - (propagated-inputs `(("kernel-headers" ,xheaders))) - - ;; FIXME: 'static-bash' should really be an input, not a native input, but - ;; to do that will require building an intermediate cross libc. - (inputs '()) - - (native-inputs `(("cross-gcc" ,xgcc) - ("cross-binutils" ,xbinutils) - ,@(if (string-match (or "i586-pc-gnu" "i586-gnu") target) - `(("cross-mig" - ,@(assoc-ref (package-native-inputs xheaders) - "cross-mig"))) - '()) - ,@(package-inputs libc) ;FIXME: static-bash - ,@(package-native-inputs libc)))))) + (if (cross-newlib? target) + (native-libc target) + (let ((libc (cross-libc-for-target target))) + (package (inherit libc) + (name (string-append "glibc-cross-" target)) + (arguments + (substitute-keyword-arguments + `(;; Disable stripping (see above.) + #:strip-binaries? #f + + ;; This package is used as a target input, but it should not have + ;; the usual cross-compilation inputs since that would include + ;; itself. + #:implicit-cross-inputs? #f + + ;; We need SRFI 26. + #:modules ((guix build gnu-build-system) + (guix build utils) + (srfi srfi-26)) + + ,@(package-arguments libc)) + ((#:configure-flags flags) + `(cons ,(string-append "--host=" target) + ,flags)) + ((#:phases phases) + `(alist-cons-before + 'configure 'set-cross-kernel-headers-path + (lambda* (#:key inputs #:allow-other-keys) + (let* ((kernel (assoc-ref inputs "kernel-headers")) + (cpath (string-append kernel "/include"))) + (for-each (cut setenv <> cpath) + ',%gcc-cross-include-paths) + (setenv "CROSS_LIBRARY_PATH" + (string-append kernel "/lib")) ;for Hurd's libihash + #t)) + ,phases)))) + + ;; Shadow the native "kernel-headers" because glibc's recipe expects the + ;; "kernel-headers" input to point to the right thing. + (propagated-inputs `(("kernel-headers" ,xheaders))) + + ;; FIXME: 'static-bash' should really be an input, not a native input, but + ;; to do that will require building an intermediate cross libc. + (inputs '()) + + (native-inputs `(("cross-gcc" ,xgcc) + ("cross-binutils" ,xbinutils) + ,@(if (hurd-triplet? target) + `(("cross-mig" + ,@(assoc-ref (package-native-inputs xheaders) + "cross-mig"))) + '()) + ,@(package-inputs libc) ;FIXME: static-bash + ,@(package-native-inputs libc))))))) + +(define (native-libc target) + (if (target-mingw? target) + mingw-w64 + glibc)) + +(define (cross-newlib? target) + (not (eq? (native-libc target) glibc))) ;;; Concrete cross tool chains are instantiated like this: diff --git a/gnu/packages/crypto.scm b/gnu/packages/crypto.scm index c7445a1eba..e4a8a4bd54 100644 --- a/gnu/packages/crypto.scm +++ b/gnu/packages/crypto.scm @@ -56,7 +56,7 @@ (define-public libsodium (package (name "libsodium") - (version "1.0.10") + (version "1.0.11") (source (origin (method url-fetch) (uri (list (string-append @@ -67,7 +67,7 @@ "releases/old/libsodium-" version ".tar.gz"))) (sha256 (base32 - "1gn45g956lyz8l6iq187yc6l627vyivyp8qc5dkr6dnhdnlqddvi")))) + "0rf7z6bgpnf8lyz8sph4h43fbb28pmj4dgybf0hsxxj97kdljid1")))) (build-system gnu-build-system) (synopsis "Portable NaCl-based crypto library") (description diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm index 0a8a10ecb4..baa77f7aac 100644 --- a/gnu/packages/cups.scm +++ b/gnu/packages/cups.scm @@ -416,7 +416,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) diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm index 790f542a52..7329d870de 100644 --- a/gnu/packages/curl.scm +++ b/gnu/packages/curl.scm @@ -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"))))))) diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm index 2f46c2a4ec..c5e8599028 100644 --- a/gnu/packages/databases.scm +++ b/gnu/packages/databases.scm @@ -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 @@ -601,7 +601,7 @@ extremely small.") (define-public perl-dbix-class (package (name "perl-dbix-class") - (version "0.082810") + (version "0.082840") (source (origin (method url-fetch) @@ -609,7 +609,7 @@ extremely small.") "DBIx-Class-" version ".tar.gz")) (sha256 (base32 - "1zlsswk8j2k024gwhdhia8ksrmb8065n98dahkk8c0r69wv85n04")))) + "1vw1f756g8m5hq11nqf5dk2cw2y4mqq91ca5p75fn5g3fp8syja0")))) (build-system perl-build-system) (native-inputs `(("perl-dbd-sqlite" ,perl-dbd-sqlite) @@ -655,7 +655,7 @@ single query, \"JOIN\", \"LEFT JOIN\", \"COUNT\", \"DISTINCT\", \"GROUP BY\", (define-public perl-dbix-class-cursor-cached (package (name "perl-dbix-class-cursor-cached") - (version "1.001002") + (version "1.001004") (source (origin (method url-fetch) @@ -663,7 +663,7 @@ single query, \"JOIN\", \"LEFT JOIN\", \"COUNT\", \"DISTINCT\", \"GROUP BY\", "DBIx-Class-Cursor-Cached-" version ".tar.gz")) (sha256 (base32 - "19r7jr6pknxiirrybq0cd0lnr76xiw05arnfqgk9nrhp6c7vvil0")))) + "09b2jahn2x12qm4f7qm1jzsxbz7qn1czp6a3fnl5l2i3l4r5421p")))) (build-system perl-build-system) (native-inputs `(("perl-cache-cache" ,perl-cache-cache) @@ -680,15 +680,15 @@ built-in caching support.") (define-public perl-dbix-class-introspectablem2m (package (name "perl-dbix-class-introspectablem2m") - (version "0.001001") + (version "0.001002") (source (origin (method url-fetch) - (uri (string-append "mirror://cpan/authors/id/G/GR/GRODITI/" + (uri (string-append "mirror://cpan/authors/id/I/IL/ILMARI/" "DBIx-Class-IntrospectableM2M-" version ".tar.gz")) (sha256 (base32 - "0p9zx1yc1f6jg583l206wilsni2v8mlngc2vf2q8yn10pmy4y6wm")))) + "1w47rh2241iy5x3a9bqsyd5kdp9sk43dksr99frzv4qn4jsazfn6")))) (build-system perl-build-system) (propagated-inputs `(("perl-dbix-class" ,perl-dbix-class))) @@ -705,7 +705,7 @@ introspected and examined.") (define-public perl-dbix-class-schema-loader (package (name "perl-dbix-class-schema-loader") - (version "0.07042") + (version "0.07046") (source (origin (method url-fetch) @@ -713,7 +713,7 @@ introspected and examined.") "DBIx-Class-Schema-Loader-" version ".tar.gz")) (sha256 (base32 - "0sb48as7azmj6s4acxh98wcvcik7lxm7dcjz1c3wdrkrbmbbz0jf")))) + "08cgn0dx42y9xsxas9np7s55a7qmy4kf6sfmx0jmk4hryvbapml3")))) (build-system perl-build-system) (native-inputs `(("perl-config-any" ,perl-config-any) @@ -784,15 +784,15 @@ columns, primary keys, unique constraints and relationships.") (define-public perl-dbd-mysql (package (name "perl-dbd-mysql") - (version "4.039") + (version "4.041") (source (origin (method url-fetch) - (uri (string-append "mirror://cpan/authors/id/C/CA/CAPTTOFU/" + (uri (string-append "mirror://cpan/authors/id/M/MI/MICHIELB/" "DBD-mysql-" version ".tar.gz")) (sha256 (base32 - "0k4p3bjdbmxm2amb0qiiwmn8v83zrjkz5qp84xdjrg8k5v9aj0hn")))) + "0h4h6zwzj8fwh9ljb8svnsa0a3ch4p10hp59kpdibdb4qh8xwxs7")))) (build-system perl-build-system) ;; Tests require running MySQL server (arguments `(#:tests? #f)) @@ -808,7 +808,7 @@ columns, primary keys, unique constraints and relationships.") (define-public perl-dbd-sqlite (package (name "perl-dbd-sqlite") - (version "1.42") + (version "1.52") (source (origin (method url-fetch) (uri (string-append @@ -816,7 +816,7 @@ columns, primary keys, unique constraints and relationships.") version ".tar.gz")) (sha256 (base32 - "14x9cjsc8dz8ad1nad0bqiq9cbk1rjfb8h5y0rpk3pdl38y6afxb")))) + "0kimb2qr1rh07yylbbfybwcizpmy61ck667amypn4clmkfg0knm6")))) (build-system perl-build-system) (inputs `(("sqlite" ,sqlite))) (propagated-inputs `(("perl-dbi" ,perl-dbi))) diff --git a/gnu/packages/dav.scm b/gnu/packages/dav.scm index 835b8fcf39..dd03d8964b 100644 --- a/gnu/packages/dav.scm +++ b/gnu/packages/dav.scm @@ -35,13 +35,7 @@ "1c5lv8qca21mndkx350wxv34qypqh6gb4rhzms4anr642clq3jg2")))) (build-system python-build-system) (arguments - `(#:phases - (modify-phases %standard-phases - (replace 'check - (lambda _ - (zero? (system* "py.test"))))))) - (native-inputs - `(("python-pytest" ,python-pytest))) + '(#:tests? #f)) ; The tests are not distributed in the PyPi release. (propagated-inputs ;; TODO: Add python-pam `(("python-requests" ,python-requests))) @@ -60,24 +54,21 @@ 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 ;; vdirsyncer requires itself to be installed in order to build ;; the manpage. (add-after 'install 'manpage - (lambda* (#:key outputs #:allow-other-keys) - (setenv "PYTHONPATH" - (string-append - (getenv "PYTHONPATH") - ":" (assoc-ref outputs "out"))) + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) (zero? (system* "make" "--directory=docs/" "man")) (install-file "docs/_build/man/vdirsyncer.1" diff --git a/gnu/packages/debug.scm b/gnu/packages/debug.scm index 54ed5cd36a..b7d6bbc0eb 100644 --- a/gnu/packages/debug.scm +++ b/gnu/packages/debug.scm @@ -314,3 +314,25 @@ no race conditions.") ;; and patched GNU Make is under its own license. (license (list (non-copyleft "COPYING.md") (package-license gnu-make)))))) + +(define-public zzuf + (package + (name "zzuf") + (version "0.15") + (source + (origin + (method url-fetch) + (uri (string-append + "https://github.com/samhocevar/zzuf/releases/download/v" + version "/" name "-" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1mpzjaksc2qg2hzqflf39pl06p53qam2dn3hkhkcv6p00d2n4kx3")))) + (build-system gnu-build-system) + (home-page "https://github.com/samhocevar/zzuf") + (synopsis "Transparent application input fuzzer") + (description "Zzuf is a transparent application input fuzzer. It works by +intercepting file operations and changing random bits in the program's +input. Zzuf's behaviour is deterministic, making it easy to reproduce bugs.") + (license (non-copyleft "http://www.wtfpl.net/txt/copying/")))) diff --git a/gnu/packages/disk.scm b/gnu/packages/disk.scm index 4afd2c2df3..a4bb0be134 100644 --- a/gnu/packages/disk.scm +++ b/gnu/packages/disk.scm @@ -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") diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm index 0eca94550b..80b45af103 100644 --- a/gnu/packages/display-managers.scm +++ b/gnu/packages/display-managers.scm @@ -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 diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm index f56ed58363..bbb2d71db1 100644 --- a/gnu/packages/django.scm +++ b/gnu/packages/django.scm @@ -54,10 +54,6 @@ (string-append ".:" (getenv "PYTHONPATH"))) (zero? (system* "python" "tests/runtests.py"))))))) ;; TODO: Install extras/django_bash_completion. - (propagated-inputs - ;; Django uses 'pkg_resources' (part of setuptools) to locate templates - ;; at run-time. - `(("python-setuptools" ,python-setuptools))) (native-inputs `(("tzdata", tzdata) ;; bcrypt and argon2-cffi are extra requirements not yet in guix @@ -112,8 +108,6 @@ to the @dfn{don't repeat yourself} (DRY) principle.") (build-system python-build-system) (propagated-inputs `(("python-django" ,python-django))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/alsoicode/django-simple-math-captcha") (synopsis "Easy-to-use math field/widget captcha for Django forms") (description @@ -147,23 +141,16 @@ with arguments to the field constructor.") (native-inputs `(("python-django" ,python-django) ("python-setuptools-scm" ,python-setuptools-scm))) - (inputs - `(("python-py" ,python-py) - ("python-pytest" ,python-pytest))) + (propagated-inputs + `(("python-pytest" ,python-pytest))) (home-page "http://pytest-django.readthedocs.org/") (synopsis "Django plugin for py.test") (description "Pytest-django is a plugin for py.test that provides a set of useful tools for testing Django applications and projects.") - (properties `((python2-variant . ,(delay python2-pytest-django)))) (license license:bsd-3))) (define-public python2-pytest-django - (let ((base (package-with-python2 - (strip-python2-variant python-pytest-django)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pytest-django)) (define-public python-django-filter (package @@ -186,13 +173,7 @@ useful tools for testing Django applications and projects.") some of the more mundane bits of view code. Specifically, it allows users to filter down a queryset based on a model’s fields, displaying the form to let them do this.") - (properties `((python2-variant . ,(delay python2-django-filter)))) (license license:bsd-3))) (define-public python2-django-filter - (let ((base (package-with-python2 - (strip-python2-variant python-django-filter)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-django-filter)) diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm index b49a0b7392..55cfc02e95 100644 --- a/gnu/packages/dns.scm +++ b/gnu/packages/dns.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2016 John Darrington <jmd@gnu.org> ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,7 +27,9 @@ #:use-module (gnu packages autotools) #:use-module (gnu packages base) #:use-module (gnu packages databases) + #:use-module (gnu packages crypto) #:use-module (gnu packages groff) + #:use-module (gnu packages libevent) #:use-module (gnu packages linux) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) @@ -134,6 +137,97 @@ high-volume and high-reliability applications. The name BIND stands for (home-page "https://www.isc.org/downloads/bind") (license (list license:isc)))) +(define-public dnscrypt-proxy + (package + (name "dnscrypt-proxy") + (version "1.8.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://download.dnscrypt.org/dnscrypt-proxy/" + "dnscrypt-proxy-" version ".tar.bz2")) + (sha256 + (base32 + "1dz0knslf7ysc2xx33ljrdlqyr4b0fpm9ifrwvwgcjaxgh94l7m8")) + (modules '((guix build utils))) + (snippet + ;; Delete bundled libltdl. XXX: This package also bundles + ;; a modified libevent that cannot currently be removed. + '(delete-file-recursively "libltdl")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-before 'configure 'autoreconf + (lambda _ + ;; Re-generate build files due to unbundling ltdl. + ;; TODO: Prevent generating new libltdl and building it. + ;; The system version is still favored and referenced. + (zero? (system* "autoreconf" "-vif"))))))) + (native-inputs + `(("pkg-config" ,pkg-config) + ("automake" ,automake) + ("autoconf" ,autoconf) + ("libtool" ,libtool))) + (inputs + `(("libltdl" ,libltdl) + ("libsodium" ,libsodium))) + (home-page "https://www.dnscrypt.org/") + (synopsis "Securely send DNS requests to a remote server") + (description + "@command{dnscrypt-proxy} is a tool for securing communications +between a client and a DNS resolver. It verifies that responses you get +from a DNS provider was actually sent by that provider, and haven't been +tampered with. For optimal performance it is recommended to use this as +a forwarder for a caching DNS resolver such as @command{dnsmasq}, but it +can also be used as a normal DNS \"server\". A list of public dnscrypt +servers is included, and an up-to-date version is available at +@url{https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-resolvers.csv}.") + (license (list license:isc + ;; Libevent and src/ext/queue.h is 3-clause BSD. + license:bsd-3)))) + +(define-public dnscrypt-wrapper + (package + (name "dnscrypt-wrapper") + (version "0.2.2") + (source (origin + (method url-fetch) + (uri (string-append + "https://github.com/cofyc/dnscrypt-wrapper/releases" + "/download/v" version "/" name "-v" version ".tar.bz2")) + (sha256 + (base32 + "1vhg4g0r687f51wcdn7z9w1hxapazx6vyh5rsr8wa48sljzd583g")))) + (build-system gnu-build-system) + (arguments + `(#:make-flags '("CC=gcc") + ;; TODO: Tests require ruby-cucumber and ruby-aruba. + #:tests? #f + #:phases + (modify-phases %standard-phases + (add-before 'configure 'create-configure + (lambda _ + (zero? (system* "make" "configure"))))))) + (native-inputs + `(("autoconf" ,autoconf))) + (inputs + `(("libevent" ,libevent) + ("libsodium" ,libsodium))) + (home-page "https://github.com/Cofyc/dnscrypt-wrapper") + (synopsis "Server-side dnscrypt proxy") + (description + "@command{dnscrypt-wrapper} is a tool to expose a name server over +the @code{dnscrypt} protocol. It can be used as an endpoint for the +@command{dnscrypt-proxy} client to securely tunnel DNS requests between +the two.") + (license (list license:isc + ;; Bundled argparse is MIT. TODO: package and unbundle. + license:expat + ;; dns-protocol.h and rfc1035.{c,h} is gpl2 or gpl3 (either). + license:gpl2 + license:gpl3)))) + (define-public libasr (package (name "libasr") @@ -167,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))) @@ -189,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"))) diff --git a/gnu/packages/docbook.scm b/gnu/packages/docbook.scm index 3d18d459bd..067ad1c3b0 100644 --- a/gnu/packages/docbook.scm +++ b/gnu/packages/docbook.scm @@ -132,14 +132,14 @@ by no means limited to these applications.) This package provides XML DTDs.") (define-public docbook-xsl (package (name "docbook-xsl") - (version "1.78.1") + (version "1.79.1") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/docbook/docbook-xsl/" version "/docbook-xsl-" version ".tar.bz2")) (sha256 (base32 - "0rxl013ncmz1n6ymk2idvx3hix9pdabk8xn01cpcv32wmfb753y9")))) + "0s59lihif2fr7rznckxr2kfyrvkirv76r1zvidp9b5mj28p4apvj")))) (build-system trivial-build-system) (arguments `(#:builder (let ((name-version (string-append ,name "-" ,version))) @@ -173,7 +173,7 @@ by no means limited to these applications.) This package provides XML DTDs.") (define-public dblatex (package (name "dblatex") - (version "0.3.5") + (version "0.3.9") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/dblatex/dblatex/" @@ -181,18 +181,26 @@ by no means limited to these applications.) This package provides XML DTDs.") version ".tar.bz2")) (sha256 (base32 - "0h3472n33pabrn8qwggsahkrjx8lybpwlc3zprby3w3w3x5i830f")))) + "0pdizc5rjywwzxa1qqhdmba5zr35pbmdwbysalsid7xw87w3kq06")))) (build-system python-build-system) ;; TODO: Add xfig/transfig for fig2dev utility (inputs - `(("python-setuptools" ,python-setuptools) - ("texlive" ,texlive) + `(("texlive" ,texlive) ("imagemagick" ,imagemagick) ;for convert ("inkscape" ,inkscape) ;for svg conversion ("docbook" ,docbook-xml) ("libxslt" ,libxslt))) ;for xsltproc (arguments `(#:python ,python-2 ;'print' syntax + ;; Using setuptools causes an invalid "package_base" path in + ;; out/bin/.dblatex-real due to a missing leading '/'. This is caused + ;; by dblatex's setup.py stripping the root path when creating the + ;; script. (dblatex's setup.py still uses distutils and thus has to + ;; create the script by itself. The feature for creating scripts is one + ;; of setuptools' features.) + ;; See this thread for details: + ;; https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00030.html + #:use-setuptools? #f #:tests? #f ;no 'test' command #:phases (alist-cons-after diff --git a/gnu/packages/docker.scm b/gnu/packages/docker.scm index 0760001da7..3cfdb7ef55 100644 --- a/gnu/packages/docker.scm +++ b/gnu/packages/docker.scm @@ -42,7 +42,6 @@ (arguments '(#:tests? #f)) (inputs `(("python-requests" ,python-requests) - ("python-setuptools" ,python-setuptools) ("python-six" ,python-six) ("python-websocket-client" ,python-websocket-client))) (home-page "https://github.com/docker/docker-py/") @@ -93,7 +92,6 @@ client.") ("python-jsonschema" ,python-jsonschema) ("python-pyyaml" ,python-pyyaml) ("python-requests" ,python-requests-2.7) - ("python-setuptools" ,python-setuptools) ("python-six" ,python-six) ("python-texttable" ,python-texttable) ("python-websocket-client" ,python-websocket-client))) diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm index ad1871688e..0a53e6ca99 100644 --- a/gnu/packages/ebook.scm +++ b/gnu/packages/ebook.scm @@ -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.63.0") + (version "2.76.0") (source (origin (method url-fetch) @@ -70,7 +70,7 @@ version ".tar.xz")) (sha256 (base32 - "1rwgv6rsmy3ljfwcpv42w203ghngw86s5kzb0yjm1zgsxmas2wh6")) + "1xfm586n6gm44mkyn25mbiyhj6w9ji9yl6fvmnr4zk1q6qcga3v8")) ;; Remove non-free or doubtful code, see ;; https://lists.gnu.org/archive/html/guix-devel/2015-02/msg00478.html (modules '((guix build utils))) @@ -83,7 +83,7 @@ (build-system python-build-system) (native-inputs `(("pkg-config" ,pkg-config) - ("qt" ,qt) ; for qmake + ("qtbase" ,qtbase) ; for qmake ;; xdg-utils is supposed to be used for desktop integration, but it ;; also creates lots of messages ;; mkdir: cannot create directory '/homeless-shelter': Permission denied @@ -118,14 +118,16 @@ ("python2-mechanize" ,python2-mechanize) ("python2-netifaces" ,python2-netifaces) ("python2-pillow" ,python2-pillow) - ("python2-pyqt" ,python2-pyqt-5.5) + ("python2-pyqt" ,python2-pyqt) ("python2-sip" ,python2-sip) - ("qt" ,qt) ("sqlite" ,sqlite))) (arguments `(#:python ,python-2 #:test-target "check" #:tests? #f ; FIXME: enable once flake8 is packaged + ;; Calibre is using setuptools by itself, but the setup.py is not + ;; compatible with the shim wrapper (taken from pip) we are using. + #:use-setuptools? #f #:phases (modify-phases %standard-phases (add-before 'build 'configure diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index c1f12667a3..7b476e1a0a 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -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> @@ -273,7 +273,7 @@ editor (without an X toolkit)" ) "/geiser-" version ".tar.gz")) (sha256 (base32 - "1n772ysl1dmn0vy3gk230ymyjm14h93zw99y6h2rqp1ixy7v43dm")))) + "0phz9d8wjk4p13vqannv0003fwh8qqrp0gfzcs2hgq1mrmv1srss")))) (build-system gnu-build-system) (arguments '(#:phases (alist-cons-after @@ -298,36 +298,8 @@ metadata.") (license license:bsd-3))) (define-public geiser-next - ;; Geiser's upcoming version supports Chibi and Chez, while it was forgot to - ;; include some required files in 0.9. When the next Geiser release comes - ;; out, we can remove this. - (let ((commit "16035b9fa475496f7f89a57fa81455057af749a0") - (revision "1")) - (package - (inherit geiser) - (name "geiser-next") - (version (string-append "0.9-" revision "." (string-take commit 7))) - (source (origin - (method git-fetch) - (file-name (string-append name "-" version ".tar.gz")) - (uri (git-reference - (url "git://git.sv.gnu.org/geiser.git") - (commit commit))) - (sha256 - (base32 - "1rrafizrhjkai0msryjiz4c5dcdyihf0i2wmgiy8br74rwbxpyl5")))) - (native-inputs - `(("autoconf" ,autoconf) - ("automake" ,automake) - ("texinfo" ,texinfo) - ,@(package-native-inputs geiser))) - (arguments - (substitute-keyword-arguments (package-arguments geiser) - ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'autogen - (lambda _ - (zero? (system* "sh" "autogen.sh"))))))))))) + ;; This has become "geiser". + (deprecated-package "geiser-next" geiser)) (define-public paredit (package @@ -426,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.6") + (version "2.5.9") (source (origin (method url-fetch) (uri (string-append @@ -435,7 +407,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "14vypqj3wqym5yd0nggfm1xdgq5hv1kwxkg6i8ymlpxcdfxj45w7")))) + "0znfznyqr360ryi7za9szbz1l5236v2cig25s4k7kkw0w8828xzh")))) (build-system emacs-build-system) (propagated-inputs `(("emacs-dash" ,emacs-dash))) @@ -451,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 @@ -459,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))) @@ -587,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))) @@ -897,14 +869,14 @@ provides an optional IDE-like error list.") (define-public emms (package (name "emacs-emms") - (version "4.1") + (version "4.2") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/emms/emms-" version ".tar.gz")) (sha256 (base32 - "0ay6631p3dr6xnhkm7skwn0gp317r1mxbip28m126w4zqf05cbh3")) + "1xa9y64g5z8gfnxk1c2rf3plfjhqn4r6j8dpiygnfs6w4giysn22")) (modules '((guix build utils))) (snippet '(substitute* "Makefile" @@ -974,22 +946,19 @@ provides an optional IDE-like error list.") (string-append "\"" mp3info "/bin/mp3info\""))))))) (add-before 'install 'pre-install (lambda* (#:key outputs #:allow-other-keys) - ;; The 'install' rule expects the target directory to exist. + ;; The 'install' rule expects the target directories to exist. (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) (man1 (string-append out "/share/man/man1"))) + (mkdir-p bin) (mkdir-p man1) #t))) (add-after 'install 'post-install (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (target (string-append - out "/bin/emms-print-metadata"))) + (let ((out (assoc-ref outputs "out"))) (symlink "emms-auto.el" (string-append out "/share/emacs/site-lisp/" - "emms-autoloads.el")) - (mkdir-p (dirname target)) - (copy-file "src/emms-print-metadata" target) - (chmod target #o555))))) + "emms-autoloads.el")))))) #:tests? #f)) (native-inputs `(("emacs" ,emacs-minimal) ;for (guix build emacs-utils) ("texinfo" ,texinfo))) @@ -1276,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.0.1") + (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 + "0vsh1v99xxm6hhqp0vg9fbs230kawa7xb5dnd8fidf3vwm622aqh")))) + (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.1") + (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 + "0nhx0c3xc16frpyqikaml73hjyn8a0jijq5ibq8a4zrjiw1pqxwy")))) + (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") @@ -1368,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") @@ -1445,7 +1517,7 @@ mode, which displays information about Elasticsearch clusters.") (define-public emacs-expand-region (package (name "emacs-expand-region") - (version "0.10.0") + (version "0.11.0") (source (origin (method url-fetch) @@ -1454,7 +1526,7 @@ mode, which displays information about Elasticsearch clusters.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "1zfiaqyb3zqiyqjkpqsjw660j09805nqsg25q6ars2h8gs0rnvxb")))) + "08dy1f411sh9wwww53rjw80idcf3vpki6ba2arl4hl5jcw9651g0")))) (build-system emacs-build-system) (home-page "https://github.com/magnars/expand-region.el") (synopsis "Increase selected region by semantic units") @@ -2257,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 @@ -2266,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") @@ -2286,7 +2358,7 @@ well as completely new features.") (define-public emacs-hl-todo (package (name "emacs-hl-todo") - (version "1.7.1") + (version "1.7.4") (source (origin (method url-fetch) (uri (string-append @@ -2295,7 +2367,7 @@ well as completely new features.") (file-name (string-append "hl-todo-" version ".el")) (sha256 (base32 - "0flhz9vy8w1vvwwji92pi5k4659hl368bakj2qf2zfd26z8x583h")))) + "016ivl4s0ysrm1xbfi86j5xcs759fcb0mkspxw81x8mpi3yb46ya")))) (build-system emacs-build-system) (home-page "https://github.com/tarsius/hl-todo") (synopsis "Emacs mode to highlight TODO and similar keywords") @@ -3220,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") diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm index bd064e618f..70de5e53b8 100644 --- a/gnu/packages/embedded.scm +++ b/gnu/packages/embedded.scm @@ -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)))) diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm index 25b8caf306..ca97104958 100644 --- a/gnu/packages/enlightenment.scm +++ b/gnu/packages/enlightenment.scm @@ -31,6 +31,7 @@ #:use-module (gnu packages compression) #:use-module (gnu packages curl) #:use-module (gnu packages fontutils) + #:use-module (gnu packages freedesktop) #:use-module (gnu packages fribidi) #:use-module (gnu packages game-development) #:use-module (gnu packages gettext) @@ -56,7 +57,7 @@ (define-public efl (package (name "efl") - (version "1.18.2") + (version "1.18.4") (source (origin (method url-fetch) (uri (string-append @@ -64,7 +65,7 @@ version ".tar.xz")) (sha256 (base32 - "1vbvsrrpkvvrmvjavwnp5q77kw5i7vmbaj2vq5mnmrbzamvaybr9")))) + "09c0ajszjarcs6d62zlgnf1aha2f921mfr0gxg6nwza36xzc1srr")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) @@ -196,7 +197,7 @@ Libraries with some extra bells and whistles.") (define-public enlightenment (package (name "enlightenment") - (version "0.21.3") + (version "0.21.5") (source (origin (method url-fetch) (uri @@ -204,7 +205,7 @@ Libraries with some extra bells and whistles.") name "/" name "-" version ".tar.xz")) (sha256 (base32 - "1ljzcq775njhbcaj8vdnypf2rgc6yqqdwfkf7c22603qvv9if1dr")))) + "1fslq70z4s6v9ipahnk8s5fgqnqq4njv4rlqv951r1bh1xk5lx7h")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--enable-mount-eeze"))) @@ -298,3 +299,33 @@ that tries to lower the barrier to getting involved in Enlightenment development and in creating applications based on the Enlightenment Foundation Library suite.") (license (list license:public-domain ; data/extra/skeleton license:gpl2)))) ; edi + +(define-public lekha + (package + (name "lekha") + (version "0.2.1") + (source (origin + (method url-fetch) + (uri (pypi-uri "Lekha" version)) + (sha256 + (base32 + "0zr6i74ik58pbzrd7r9l7sawqbdv0r2c1a9927qkqzwga27x8j15")))) + (build-system python-build-system) + (arguments + `(#:tests? #f ; no test target + #:python ,python-2 + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-data-location + (lambda _ (substitute* "setup.py" + (("'/usr/")"'")) + #t))))) + (propagated-inputs + `(("python2-efl" ,python2-efl) + ("python2-pypdf2" ,python2-pypdf2) + ("python2-pyxdg" ,python2-pyxdg))) + (synopsis "Simple PDF viewer") + (description + "Simple PDF viewer based on the Enlightenment Foundation Libraries.") + (home-page "https://github.com/kaihu/lekha") + (license license:gpl3+))) diff --git a/gnu/packages/feh.scm b/gnu/packages/feh.scm deleted file mode 100644 index 6b998aa983..0000000000 --- a/gnu/packages/feh.scm +++ /dev/null @@ -1,67 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net> -;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> -;;; -;;; This file is part of GNU Guix. -;;; -;;; GNU Guix is free software; you can redistribute it and/or modify it -;;; under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 3 of the License, or (at -;;; your option) any later version. -;;; -;;; GNU Guix is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. - -(define-module (gnu packages feh) - #:use-module (gnu packages) - #:use-module (gnu packages image) - #:use-module (gnu packages curl) - #:use-module (gnu packages xorg) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module ((guix licenses) #:prefix license:)) - -(define-public feh - (package - (name "feh") - (version "2.14.1") - (home-page "https://feh.finalrewind.org/") - (source (origin - (method url-fetch) - (uri (string-append home-page - name "-" version ".tar.bz2")) - (sha256 - (base32 - "1hlzgr0masgbm1vdn085vz81s9kpnah8kjkb1w1xfsxr1b99x8f0")))) - (build-system gnu-build-system) - (arguments - '(#:phases (alist-delete 'configure %standard-phases) - #:tests? #f - #:make-flags - (list "CC=gcc" (string-append "PREFIX=" (assoc-ref %outputs "out"))))) - (inputs `(("imlib2" ,imlib2) - ("curl" ,curl) - ("libpng" ,libpng) - ("libxt" ,libxt) - ("libx11" ,libx11) - ("libxinerama" ,libxinerama))) - (synopsis "Fast and light imlib2-based image viewer") - (description - "feh is an X11 image viewer aimed mostly at console users. -Unlike most other viewers, it does not have a fancy GUI, but simply -displays images. It can also be used to set the desktop wallpaper. -It is controlled via commandline arguments and configurable key/mouse -actions.") - - ;; The license is really the Expat license, with additional wording in the - ;; 2nd paragraph: "acknowledgment shall be given in the documentation and - ;; software packages that this Software was used." - (license (license:x11-style - "file://COPYING" - "See 'COPYING' in the distribution.")))) diff --git a/gnu/packages/flashing-tools.scm b/gnu/packages/flashing-tools.scm index a55ed96edd..f25c25fbfb 100644 --- a/gnu/packages/flashing-tools.scm +++ b/gnu/packages/flashing-tools.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2014 Manolis Fragkiskos Ragkousis <manolis837@gmail.com> ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,6 +23,7 @@ (define-module (gnu packages flashing-tools) #:use-module (guix licenses) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix packages) #:use-module (gnu packages) #:use-module (guix build-system gnu) @@ -211,3 +213,37 @@ You need to add the udev rules to make the Teensy update available for non-root users.") (home-page "https://www.pjrc.com/teensy/loader_cli.html") (license gpl3)))) + +(define-public rkflashtool + (let ((commit "094bd6410cb016e487e2ccb1050c59eeac2e6dd1") + (revision "1")) + (package + (name "rkflashtool") + (version (string-append "0.0.0-" revision "." (string-take commit 7))) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/linux-rockchip/rkflashtool.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "1zkd8zxir3rfg3sy9r20bcnxclnplryn583gqpcr3iad0k3xbah7")))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (delete 'configure)) ; no configure + #:make-flags (list (string-append "PREFIX=" %output)) + #:tests? #f)) ; no tests + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("libusb" ,libusb))) + (home-page "https://github.com/linux-rockchip/rkflashtool") + (synopsis "Tools for flashing Rockchip devices") + (description "Allows flashing of Rockchip based embedded linux devices. +The list of currently supported devices is: RK2818, RK2918, RK2928, RK3026, +RK3036, RK3066, RK312X, RK3168, RK3188, RK3288, RK3368.") + (license bsd-2)))) diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm index 009efd2955..f01b831559 100644 --- a/gnu/packages/fonts.scm +++ b/gnu/packages/fonts.scm @@ -13,6 +13,7 @@ ;;; 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> ;;; ;;; This file is part of GNU Guix. ;;; @@ -604,7 +605,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 @@ -612,7 +613,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 @@ -624,9 +625,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) @@ -898,3 +899,38 @@ powerline support.") "Source Code Pro is a set of monospaced OpenType fonts that have been designed to work well in user interface environments.") (license license:silofl1.1))) + +(define-public font-fira-mono + (package + (name "font-fira-mono") + (version "3.206") + (source (origin + (method url-fetch) + (uri (string-append "https://carrois.com/downloads/fira_mono_3_2/" + "FiraMonoFonts" + (string-replace-substring version "." "") + ".zip")) + (sha256 + (base32 + "1z65x0dw5dq6rs6p9wyfrir50rlh95vgzsxr8jcd40nqazw4jhpi")))) + (build-system trivial-build-system) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (let ((unzip (string-append (assoc-ref %build-inputs "unzip") + "/bin/unzip")) + (font-dir (string-append %output "/share/fonts/opentype"))) + (mkdir-p font-dir) + (system* unzip + "-j" + (assoc-ref %build-inputs "source") + "*.otf" + "-d" font-dir))))) + (native-inputs + `(("unzip" ,unzip))) + (home-page "http://mozilla.github.io/Fira/") + (synopsis "Mozilla's monospace font") + (description "This is the typeface used by Mozilla in Firefox OS.") + (license license:silofl1.1))) diff --git a/gnu/packages/fpga.scm b/gnu/packages/fpga.scm index bb199096dc..f65eae8673 100644 --- a/gnu/packages/fpga.scm +++ b/gnu/packages/fpga.scm @@ -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") diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm index 456d569063..18e609751f 100644 --- a/gnu/packages/freedesktop.scm +++ b/gnu/packages/freedesktop.scm @@ -85,14 +85,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 +211,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, @@ -256,8 +257,7 @@ of a the system to know what users are logged in, and where.") (native-inputs `(("shared-mime-info" ,shared-mime-info) ;for tests ("hicolor-icon-theme" ,hicolor-icon-theme) ;for tests - ("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + ("python-nose" ,python-nose))) (home-page "http://freedesktop.org/wiki/Software/pyxdg") (synopsis "Implementations of freedesktop.org standards in Python") (description @@ -451,17 +451,19 @@ Analysis and Reporting Technology) functionality.") (define-public udisks (package (name "udisks") - (version "2.1.7") + (version "2.1.8") (source (origin (method url-fetch) (uri (string-append "https://udisks.freedesktop.org/releases/" name "-" version ".tar.bz2")) (sha256 (base32 - "119pr2zbff8vkwlhghim7d7ir24c1dil9hp4q49wm4f6pnrjpbmb")))) + "1nkxhnqh39c9pzvm4zfj50rgv6apqawdx09bv3sfaxrah4a6jhfs")))) (build-system gnu-build-system) (native-inputs - `(("glib:bin" ,glib "bin") ; for glib-mkenums + `(("docbook-xml" ,docbook-xml-4.3) ; to build the manpages + ("docbook-xsl" ,docbook-xsl) + ("glib:bin" ,glib "bin") ; for glib-mkenums ("gobject-introspection" ,gobject-introspection) ("intltool" ,intltool) ("pkg-config" ,pkg-config) @@ -480,13 +482,28 @@ Analysis and Reporting Technology) functionality.") `(#:tests? #f ; requiring system message dbus #:disallowed-references ("doc") ;enforce separation of "doc" #:configure-flags - (list "--disable-man" + (list "--enable-man" "--localstatedir=/var" "--enable-fhs-media" ;mount devices in /media, not /run/media (string-append "--with-html-dir=" (assoc-ref %outputs "doc") "/share/doc/udisks/html") (string-append "--with-udevdir=" %output "/lib/udev")) + #:make-flags + (let* ((docbook-xsl-name-version ,(string-append + (package-name docbook-xsl) "-" + (package-version docbook-xsl))) + (docbook-xsl-catalog-file (string-append + (assoc-ref %build-inputs "docbook-xsl") + "/xml/xsl/" + docbook-xsl-name-version + "/catalog.xml")) + (docbook-xml-catalog-file (string-append + (assoc-ref %build-inputs "docbook-xml") + "/xml/dtd/docbook/catalog.xml"))) + ;; Reference the catalog files required to build the manpages. + (list (string-append "XML_CATALOG_FILES=" docbook-xsl-catalog-file " " + docbook-xml-catalog-file))) #:phases (modify-phases %standard-phases (add-before @@ -509,7 +526,7 @@ Analysis and Reporting Technology) functionality.") "/run/current-system/profile/bin" "/run/current-system/profile/sbin"))) #t)))))) - (home-page "http://www.freedesktop.org/wiki/Software/udisks/") + (home-page "https://www.freedesktop.org/wiki/Software/udisks/") (synopsis "Disk manager service") (description "UDisks provides interfaces to enumerate and perform operations on disks diff --git a/gnu/packages/ftp.scm b/gnu/packages/ftp.scm index 7d3cae626a..5ff56d7eae 100644 --- a/gnu/packages/ftp.scm +++ b/gnu/packages/ftp.scm @@ -36,16 +36,23 @@ (define-public lftp (package (name "lftp") - (version "4.7.3") + (version "4.7.4") (source (origin (method url-fetch) - (uri (list (string-append "https://lftp.yar.ru/ftp/lftp-" + ;; XXX: Downloads from main site redirects to 'get.html' and + ;; returns HTTP 200, leading Guix to download that instead. + ;; Try official mirror first. See: + ;; https://github.com/lavv17/lftp/issues/299 and + ;; https://lftp.tech/get.html (mirror list) + (uri (list (string-append "ftp://ftp.st.ryukoku.ac.jp/pub/network/" + "ftp/lftp/lftp-" version ".tar.xz") + (string-append "https://lftp.tech/ftp/lftp-" version ".tar.xz") - (string-append "https://lftp.yar.ru/ftp/old/lftp-" + (string-append "https://lftp.tech/ftp/old/lftp-" version ".tar.xz"))) (sha256 (base32 - "0z4flhqvq9w9md1348jdw0lnk0dlljyicz8597inl6jcvjf2a8iv")))) + "0b6r1gbpazvml1hvfjm2ccsfxibrjrm3fir912j6kxxn538w8rxz")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) @@ -65,7 +72,7 @@ #:configure-flags (list (string-append "--with-readline=" (assoc-ref %build-inputs "readline"))))) - (home-page "https://lftp.yar.ru/") + (home-page "https://lftp.tech/") (synopsis "Command-line file transfer program") (description "LFTP is a sophisticated FTP/HTTP client, and a file transfer program diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm index 76c06ecc72..619c2f1bc2 100644 --- a/gnu/packages/game-development.scm +++ b/gnu/packages/game-development.scm @@ -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))) @@ -591,8 +591,6 @@ interface (API).") (string-append v4l-ref "/include/libv4l1-videodev.h") "linux/videodev.h") (system* "ln" "--symbolic" "Setup.in" "Setup"))))))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (inputs `(("sdl" ,sdl) ("sdl-image" ,sdl-image) diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm index 8b1d80dda7..c449f59549 100644 --- a/gnu/packages/games.scm +++ b/gnu/packages/games.scm @@ -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" diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm index 8381392ba4..206c67ed99 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; 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 © 2014, 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> @@ -380,14 +380,14 @@ Go. It also includes runtime support libraries for these languages.") (define-public gcc-6 (package (inherit gcc-5) - (version "6.2.0") + (version "6.3.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/gcc/gcc-" version "/gcc-" version ".tar.bz2")) (sha256 (base32 - "1idpf43988v1a6i8lw9ak1r7igcfg1bm5kn011iydlr2qygmhi4r")) + "17xjz30jb65hcf714vn9gcxvrrji8j20xm7n33qg1ywhyzryfsph")) (patches (search-patches "gcc-strmov-store-file-names.patch" "gcc-5.0-libvtv-runpath.patch")))))) @@ -510,8 +510,11 @@ as the 'native-search-paths' field." %generic-search-paths)) (define-public gfortran - (custom-gcc gcc "gfortran" '("fortran") - %generic-search-paths)) + ;; Note: Update this when GCC changes! We cannot use + ;; (custom-gcc gcc "fortran" …) because that would lead to a package object + ;; that is not 'eq?' with GFORTRAN-4.9, and thus 'fold-packages' would + ;; report two gfortran@4.9 that are in fact identical. + gfortran-4.9) (define-public gfortran-5 (custom-gcc gcc-5 "gfortran" '("fortran") @@ -537,6 +540,7 @@ as the 'native-search-paths' field." (define-public gcj (package (inherit gcc) (name "gcj") + (version (package-version gcc)) (inputs `(("fastjar" ,fastjar) ("perl" ,perl) @@ -545,6 +549,15 @@ as the 'native-search-paths' field." ,@(package-inputs gcc))) (native-inputs `(("dejagnu" ,dejagnu) + ,@(if (string-prefix? "armhf" (or (%current-system) + (%current-target-system))) + `(("arm-patch" ,(origin + (method url-fetch) + (uri (search-patch "gcj-arm-mode.patch")) + (sha256 + (base32 + "1z15xs5yx6qinnb572swzxrn9f668sw7ga5280q3gznj1jyrynfn"))))) + '()) ,@(package-native-inputs gcc))) (native-search-paths %generic-search-paths) @@ -572,6 +585,14 @@ as the 'native-search-paths' field." ,flags)))) ((#:phases phases) `(modify-phases ,phases + ;; Conditionally add phase to apply patch + ,@(if (string-prefix? "armhf" (or (%current-system) + (%current-target-system))) + `((add-after 'unpack 'apply-arm-patch + (lambda* (#:key inputs #:allow-other-keys) + (zero? (system* "patch" "-p1" + "-i" (assoc-ref inputs "arm-patch")))))) + '()) (add-after 'unpack 'add-lib-output-to-rpath (lambda _ @@ -584,6 +605,10 @@ as the 'native-search-paths' field." 'unpack 'patch-testsuite ;; dejagnu-1.6 removes the 'absolute' command (lambda _ + ;; This test fails on armhf. It seems harmless enough to disable it. + (for-each delete-file '("libjava/testsuite/libjava.lang/Throw_2.java" + "libjava/testsuite/libjava.lang/Throw_2.out" + "libjava/testsuite/libjava.lang/Throw_2.jar")) (substitute* "libjava/testsuite/lib/libjava.exp" (("absolute") "file normalize")) #t)) diff --git a/gnu/packages/geeqie.scm b/gnu/packages/geeqie.scm deleted file mode 100644 index 509819e780..0000000000 --- a/gnu/packages/geeqie.scm +++ /dev/null @@ -1,108 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> -;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> -;;; -;;; This file is part of GNU Guix. -;;; -;;; GNU Guix is free software; you can redistribute it and/or modify it -;;; under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 3 of the License, or (at -;;; your option) any later version. -;;; -;;; GNU Guix is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. - -(define-module (gnu packages geeqie) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module ((guix licenses) #:prefix l:) - #:use-module (guix build-system gnu) - #:use-module (gnu packages autotools) - #:use-module (gnu packages compression) - #:use-module (gnu packages ghostscript) - #:use-module (gnu packages glib) - #:use-module (gnu packages gtk) - #:use-module (gnu packages image) - #:use-module (gnu packages pkg-config) - #:use-module (gnu packages xml)) - -(define-public exiv2 ; XXX: move elsewhere? - (package - (name "exiv2") - (version "0.25") - (source (origin - (method url-fetch) - (uri (list (string-append "http://www.exiv2.org/exiv2-" - version ".tar.gz") - (string-append "https://fossies.org/linux/misc/exiv2-" - version ".tar.gz"))) - (sha256 - (base32 - "197g6vgcpyf9p2cwn5p5hb1r714xsk1v4p96f5pv1z8mi9vzq2y8")))) - (build-system gnu-build-system) - (arguments '(#:tests? #f)) ; no `check' target - (propagated-inputs - `(("expat" ,expat) - ("zlib" ,zlib))) - (native-inputs - `(("intltool" ,intltool))) - (home-page "http://www.exiv2.org/") - (synopsis "Library and command-line utility to manage image metadata") - (description - "Exiv2 is a C++ library and a command line utility to manage image -metadata. It provides fast and easy read and write access to the Exif, IPTC -and XMP metadata of images in various formats.") - - ;; Files under `xmpsdk' are a copy of Adobe's XMP SDK, licensed under the - ;; 3-clause BSD license: <http://www.adobe.com/devnet/xmp/sdk/eula.html>. - ;; The core is GPLv2+: - ;; <https://launchpad.net/ubuntu/precise/+source/exiv2/+copyright>. - (license l:gpl2+))) - -(define-public geeqie - (package - (name "geeqie") - (version "1.3") - (source (origin - (method url-fetch) - (uri (string-append "https://github.com/BestImageViewer/geeqie/" - "releases/download/v" version "/geeqie-" - version ".tar.xz")) - (sha256 - (base32 - "0gzc82sy66pbsmq7lnmq4y37zqad1zfwfls3ik3dmfm8s5nmcvsb")))) - (build-system gnu-build-system) - (arguments - `(#:phases - (modify-phases %standard-phases - (add-after 'unpack 'autogen - (lambda _ - (setenv "NOCONFIGURE" "true") - (zero? (system* "sh" "autogen.sh"))))))) - (inputs - `(;; ("libchamplain" ,libchamplain) - ("lcms" ,lcms) - ("exiv2" ,exiv2) - ("libpng" ,libpng) - ("gtk+" ,gtk+-2))) - (native-inputs - `(("autoconf" ,autoconf) - ("automake" ,automake) - ("glib" ,glib "bin") ; glib-gettextize - ("intltool" ,intltool) - ("pkg-config" ,pkg-config))) - (home-page "http://www.geeqie.org/") - (synopsis "Lightweight GTK+ based image viewer") - (description - "Geeqie is a lightweight GTK+ based image viewer for Unix like operating -systems. It features: EXIF, IPTC and XMP metadata browsing and editing -interoperability; easy integration with other software; geeqie works on files -and directories, there is no need to import images; fast preview for many raw -image formats; tools for image comparison, sorting and managing photo -collection. Geeqie was initially based on GQview.") - (license l:gpl2+))) diff --git a/gnu/packages/ghostscript.scm b/gnu/packages/ghostscript.scm index b254b80782..46b8c51299 100644 --- a/gnu/packages/ghostscript.scm +++ b/gnu/packages/ghostscript.scm @@ -293,7 +293,7 @@ architecture.") "Ghostscript fonts provides fonts and font metrics customarily distributed with Ghostscript. It currently includes the 35 standard PostScript fonts.") (license license:gpl2) - (home-page "http://sourceforge.net/projects/gs-fonts/"))) + (home-page "https://sourceforge.net/projects/gs-fonts/"))) (define-public libspectre (package diff --git a/gnu/packages/gimp.scm b/gnu/packages/gimp.scm index 6540990b36..169183db62 100644 --- a/gnu/packages/gimp.scm +++ b/gnu/packages/gimp.scm @@ -35,6 +35,7 @@ #:use-module (gnu packages ghostscript) #:use-module (gnu packages compression) #:use-module (gnu packages xml) + #:use-module (gnu packages pdf) #:use-module (gnu packages photo) #:use-module (gnu packages python) #:use-module (gnu packages xorg) @@ -168,6 +169,7 @@ buffers.") ("exif" ,libexif) ;optional, EXIF + XMP support ("lcms" ,lcms) ;optional, color management ("librsvg" ,librsvg) ;optional, SVG support + ("poppler", poppler) ; optional, PDF support ("python" ,python-2) ;optional, Python support ("python2-pygtk" ,python2-pygtk) ;optional, Python support ("gegl" ,gegl))) diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm index 50b474c623..0e9b5ddb5f 100644 --- a/gnu/packages/gl.scm +++ b/gnu/packages/gl.scm @@ -196,7 +196,7 @@ also known as DXTn or DXTC) for Mesa.") (define-public mesa (package (name "mesa") - (version "12.0.1") + (version "13.0.2") (source (origin (method url-fetch) @@ -204,7 +204,9 @@ also known as DXTn or DXTC) for Mesa.") version "/mesa-" version ".tar.xz")) (sha256 (base32 - "12b3i59xdn2in2hchrkgh4fwij8zhznibx976l3pdj3qkyvlzcms")))) + "1m8n8kd8kcs5ddyvldiw09wvpi5wwpfmmxlb87d63vgl8lk65vd6")) + (patches + (search-patches "mesa-wayland-egl-symbols-check-mips.patch")))) (build-system gnu-build-system) (propagated-inputs `(("glproto" ,glproto) @@ -227,20 +229,10 @@ also known as DXTn or DXTC) for Mesa.") ("makedepend" ,makedepend) ("presentproto" ,presentproto) ("s2tc" ,s2tc) - ("udev" ,eudev) ("wayland" ,wayland))) (native-inputs `(("pkg-config" ,pkg-config) - ("python" ,python-2) - - ;; XXX To prevent a large number of rebuilds on other systems, - ;; apply the following patch on MIPS systems only. In the next - ;; core-updates cycle, this patch could be applied on all platforms. - ,@(if (string-prefix? "mips" (or (%current-target-system) - (%current-system))) - `(("mips-patch" - ,(search-patch "mesa-wayland-egl-symbols-check-mips.patch"))) - '()))) + ("python" ,python-2))) (arguments `(#:configure-flags '(;; drop r300 from default gallium drivers, as it requires llvm @@ -267,16 +259,6 @@ also known as DXTn or DXTC) for Mesa.") '("--with-dri-drivers=nouveau,r200,radeon,swrast")))) #:phases (modify-phases %standard-phases - ;; Add an 'apply-mips-patch' phase conditionally (see above.) - ,@(if (string-prefix? "mips" (or (%current-target-system) - (%current-system))) - `((add-after 'unpack 'apply-mips-patch - (lambda* (#:key inputs #:allow-other-keys) - (let ((patch (assoc-ref inputs "mips-patch"))) - (zero? (system* "patch" "-p1" "--force" - "--input" patch)))))) - '()) - (add-after 'unpack 'patch-create_test_cases (lambda _ @@ -288,7 +270,6 @@ also known as DXTn or DXTC) for Mesa.") 'build 'fix-dlopen-libnames (lambda* (#:key inputs outputs #:allow-other-keys) (let ((s2tc (assoc-ref inputs "s2tc")) - (udev (assoc-ref inputs "udev")) (out (assoc-ref outputs "out"))) ;; Remain agnostic to .so.X.Y.Z versions while doing ;; the substitutions so we're future-safe. @@ -297,10 +278,6 @@ also known as DXTn or DXTC) for Mesa.") "src/mesa/main/texcompress_s3tc.c") (("\"libtxc_dxtn\\.so") (string-append "\"" s2tc "/lib/libtxc_dxtn.so"))) - (substitute* "src/loader/loader.c" - (("udev_handle = dlopen\\(name") - (string-append "udev_handle = dlopen(\"" - udev "/lib/libudev.so\""))) (substitute* "src/glx/dri_common.c" (("dlopen\\(\"libGL\\.so") (string-append "dlopen(\"" out "/lib/libGL.so"))) @@ -485,7 +462,8 @@ OpenGL graphics API.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "1d1brhwfmlzgnphmdwlvn5wbcrxsdyzf1qfcf8nb89xqzznxs037")))) + "1d1brhwfmlzgnphmdwlvn5wbcrxsdyzf1qfcf8nb89xqzznxs037")) + (patches (search-patches "libepoxy-gl-null-checks.patch")))) (arguments `(#:phases (modify-phases %standard-phases diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm index 2b57f85d75..a78b188af0 100644 --- a/gnu/packages/glib.scm +++ b/gnu/packages/glib.scm @@ -64,8 +64,7 @@ (define dbus (package (name "dbus") - (replacement dbus-1.10.12) - (version "1.10.10") + (version "1.10.14") (source (origin (method url-fetch) (uri (string-append @@ -73,7 +72,7 @@ version ".tar.gz")) (sha256 (base32 - "0hwsfczhx2djmc9116vj5v230i7gpjihwh3vbljs1ldlk831v3wx")) + "10x0wvv2ly4lyyfd42k4xw0ar5qdbi9cksw3l5fcwf1y6mq8y8r3")) (patches (search-patches "dbus-helper-search-path.patch")))) (build-system gnu-build-system) (arguments @@ -132,21 +131,6 @@ or through unencrypted TCP/IP suitable for use behind a firewall with shared NFS home directories.") (license license:gpl2+))) ; or Academic Free License 2.1 -(define dbus-1.10.12 - (package - (inherit dbus) - (name "dbus") - (source - (let ((version "1.10.12")) - (origin - (inherit (package-source dbus)) - (uri (string-append - "https://dbus.freedesktop.org/releases/dbus/dbus-" - version ".tar.gz")) - (sha256 - (base32 - "0pa71vf5c0d7k3gni06iascmplj0j5g70wbc833ayvi71d1pj2i1"))))))) - (define glib (package (name "glib") @@ -471,7 +455,7 @@ by GDBus included in Glib.") (define libsigc++ (package (name "libsigc++") - (version "2.8.0") + (version "2.10.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnome/sources/libsigc++/" @@ -479,7 +463,7 @@ by GDBus included in Glib.") name "-" version ".tar.xz")) (sha256 (base32 - "0lcnzzdq6718znfshs1hflpwqq6awbzwdyp4kv5lfaf54z880jbp")))) + "10cd54l4zihss9qxfhd2iip2k7mr292k37i54r2cpgv0c8sdchzq")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) ("m4" ,m4))) diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm index 3aa0f567fd..2d97f228f1 100644 --- a/gnu/packages/gnome.scm +++ b/gnu/packages/gnome.scm @@ -97,7 +97,6 @@ #:use-module (gnu packages scanner) #:use-module (gnu packages ssh) #:use-module (gnu packages xml) - #:use-module (gnu packages geeqie) #:use-module (gnu packages gl) #:use-module (gnu packages compression) #:use-module (gnu packages tex) @@ -682,14 +681,14 @@ update-desktop-database: updates the database containing a cache of MIME types (define-public shared-mime-info (package (name "shared-mime-info") - (version "1.6") + (version "1.7") (source (origin (method url-fetch) (uri (string-append "https://freedesktop.org/~hadess/" "shared-mime-info-" version ".tar.xz")) (sha256 (base32 - "0k637g047gci8g69bg4g19akylpfraxm40hd30j3i4v7cidziy5j")))) + "0bjd2j1rqrj150mr04j7ib71lfdlgbf235fg8d70g8mszqf7ik7a")))) (build-system gnu-build-system) (arguments ;; The build system appears not to be parallel-safe. @@ -2141,7 +2140,7 @@ libxml to ease remote use of the RESTful API.") (define-public libsoup (package (name "libsoup") - (version "2.54.1") + (version "2.56.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnome/sources/libsoup/" @@ -2149,7 +2148,7 @@ libxml to ease remote use of the RESTful API.") name "-" version ".tar.xz")) (sha256 (base32 - "0cyn5pq4xl1gb8413h2p4d5wrn558dc054zhwmk4swrl40ijrd27")))) + "1r8zz270qdg92gbsvy61d51y1cj7hp059h2f4xpvqiw2vrqnn8fq")))) (build-system gnu-build-system) (outputs '("out" "doc")) (arguments @@ -2649,9 +2648,7 @@ services for numerous locations.") "1rvqisrh3lridsb8rvm7spvncyq206ly0245zgpbm8swi5fhfjp8")))) (build-system glib-or-gtk-build-system) (arguments - `(;; Network manager not yet packaged. - #:configure-flags '("--disable-network-manager") - ;; Color management test can't reach the colord system service. + `(;; Color management test can't reach the colord system service. #:tests? #f)) (native-inputs `(("pkg-config" ,pkg-config) @@ -2680,7 +2677,8 @@ services for numerous locations.") ("gsettings-desktop-schemas" ,gsettings-desktop-schemas) ("libwacom" ,libwacom) ("librsvg" ,librsvg) - ("xf86-input-wacom" ,xf86-input-wacom))) + ("xf86-input-wacom" ,xf86-input-wacom) + ("network-manager" ,network-manager))) (home-page "http://www.gnome.org") (synopsis "GNOME settings daemon") (description @@ -3868,7 +3866,7 @@ metadata in photo and video files of various formats.") (define-public shotwell (package (name "shotwell") - (version "0.25.0.1") + (version "0.25.2") (source (origin (method url-fetch) (uri (string-append "mirror://gnome/sources/" name "/" @@ -3876,7 +3874,7 @@ metadata in photo and video files of various formats.") name "-" version ".tar.xz")) (sha256 (base32 - "19h0ckrgv0c6sj85m6ankyqkmy453ph9kq6zhf7ys2k5xsrrd776")))) + "1bih5hr3pvpkx3fck55bnhngn4fl92ryjizc34wb8pwigbkxnaj1")))) (build-system glib-or-gtk-build-system) (propagated-inputs `(("dconf" ,dconf))) @@ -4400,7 +4398,19 @@ users.") "NetworkManager-" version ".tar.xz")) (sha256 (base32 - "016jc21mwjxvnfiblp5lji55sr8aq6w8a08fsjmqvnpnvm3y6r58")))) + "016jc21mwjxvnfiblp5lji55sr8aq6w8a08fsjmqvnpnvm3y6r58")) + (snippet + '(begin + (use-modules (guix build utils)) + (substitute* "configure" + ;; Replace libsystemd-login with libelogind. + (("libsystemd-login") "libelogind")) + (substitute* "src/devices/wwan/nm-modem-manager.c" + (("systemd") "elogind")) + (substitute* "src/nm-session-monitor.c" + (("systemd") "elogind")) + (substitute* "./src/nm-logging.c" + (("systemd") "elogind")))))) (build-system gnu-build-system) (outputs '("out" "doc")) ; 8 MiB of gtk-doc HTML @@ -4410,7 +4420,9 @@ users.") (doc (assoc-ref %outputs "doc")) (dhclient (string-append (assoc-ref %build-inputs "isc-dhcp") "/sbin/dhclient"))) - (list "--with-crypto=gnutls" + (list "--with-systemd-logind=yes" ;In GuixSD, this is provided by elogind. + "--with-consolekit=no" + "--with-crypto=gnutls" "--disable-config-plugin-ibft" "--sysconfdir=/etc" "--localstatedir=/var" @@ -4475,7 +4487,8 @@ users.") ("polkit" ,polkit) ("ppp" ,ppp) ("readline" ,readline) - ("util-linux" ,util-linux))) + ("util-linux" ,util-linux) + ("elogind" ,elogind))) (synopsis "Network connection manager") (home-page "http://www.gnome.org/projects/NetworkManager/") (description @@ -5275,13 +5288,20 @@ existing databases over the internet.") (sha256 (base32 "1fj6wjvnjygzm9br3sw9gya6d18yly1rm69yaiar9spfbkvv4wai")))) - (build-system gnu-build-system) + (build-system glib-or-gtk-build-system) (arguments `(#:configure-flags '("--localstatedir=/tmp" "--sysconfdir=/tmp") #:imported-modules ((guix build python-build-system) - ,@%gnu-build-system-modules) + ,@%glib-or-gtk-build-system-modules) #:phases (modify-phases %standard-phases + (add-after 'install 'wrap-program + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (gi-typelib-path (getenv "GI_TYPELIB_PATH"))) + (wrap-program (string-append out "/bin/gnome-tweak-tool") + `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path)))) + #t)) (add-after 'install 'wrap (@@ (guix build python-build-system) wrap))))) (native-inputs @@ -5289,9 +5309,10 @@ existing databases over the internet.") ("pkg-config" ,pkg-config))) (inputs `(("python" ,python-2) - ("python2-pygobject" ,python2-pygobject))) - (propagated-inputs - `(("libnotify" ,libnotify) + ("python2-pygobject" ,python2-pygobject) + ("gnome-desktop" ,gnome-desktop) + ("libsoup" ,libsoup) + ("libnotify" ,libnotify) ("gobject-introspection" ,gobject-introspection) ("gsettings-desktop-schemas" ,gsettings-desktop-schemas) ("gtk+" ,gtk+))) @@ -5334,7 +5355,7 @@ functionality and behavior.") (define-public arc-theme (package (name "arc-theme") - (version "20160605") + (version "20161119") (source (origin (method url-fetch) (uri (string-append "https://github.com/horst3180/arc-theme" @@ -5342,7 +5363,7 @@ functionality and behavior.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0sq2031xda8jn2ws0x2bvhq77jfh7xy0c3kg86v6vm2kbrrss7y6")))) + "1kbhaxmydyip3vdw4kf8rk776jcd9wf0w7z6h2i4naxdn4rsnw54")))) (build-system gnu-build-system) (arguments '(#:phases @@ -5689,3 +5710,39 @@ only know by its Unicode name or code point.") with many options to write web sites, scripts and other code. Bluefish supports many programming and markup languages.") (license license:gpl3+))) + +(define-public gnome-system-monitor + (package + (name "gnome-system-monitor") + (version "3.20.1") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://gnome/sources/" name "/" + (version-major+minor version) "/" + name "-" version ".tar.xz")) + (sha256 + (base32 + "1ya41b58syf8g5pc12gw1xm6jhdx3crap803bjwm086r7x2an8wv")))) + (build-system glib-or-gtk-build-system) + (native-inputs + `(("glib:bin" ,glib "bin") ; for glib-mkenums. + ("intltool" ,intltool) + ("itstool" ,itstool) + ("libgtop" ,libgtop) + ("pkg-config" ,pkg-config))) + (inputs + `(("gdk-pixbuf" ,gdk-pixbuf) ; for loading SVG files. + ("gtk+" ,gtk+) + ("gtkmm" ,gtkmm) + ("librsvg" ,librsvg) + ("libxml2" ,libxml2))) + (home-page "https://wiki.gnome.org/Apps/SystemMonitor") + (synopsis "Process viewer and system resource monitor for GNOME") + (description + "GNOME System Monitor is a GNOME process viewer and system monitor with +an attractive, easy-to-use interface. It has features, such as a tree view +for process dependencies, icons for processes, the ability to hide processes, +graphical time histories of CPU/memory/swap usage and the ability to +kill/reinice processes.") + (license license:gpl2+))) diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm index 1eb2670743..27e1ffb4e0 100644 --- a/gnu/packages/gnunet.scm +++ b/gnu/packages/gnunet.scm @@ -5,7 +5,7 @@ ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org> -;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,7 +29,6 @@ #:use-module (gnu packages autotools) #:use-module (gnu packages compression) #:use-module (gnu packages curl) - #:use-module (gnu packages geeqie) #:use-module (gnu packages gettext) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) @@ -163,7 +162,7 @@ and support for SSL3 and TLS.") (define-public gnurl (package (name "gnurl") - (version "7.51.0") + (version "7.52.1") (source (origin (method url-fetch) (uri (let ((version-with-underscores @@ -172,13 +171,18 @@ and support for SSL3 and TLS.") name "-" version-with-underscores ".tar.bz2"))) (sha256 (base32 - "1rgl4agrzghvyfz1afk1p5ryq4b9cz28lavx8ikrav6aiv9h00ig")))) + "1gn6mvab2vhfj9637ykg1zjzb23fngfnyd24wlgxmjhf49pn334h")))) (build-system gnu-build-system) + (outputs '("out" + "doc")) ; 1.5 MiB of man3 pages (inputs `(("gnutls" ,gnutls) ("libidn" ,libidn) ("zlib" ,zlib))) (native-inputs - `(("groff" ,groff) + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("groff" ,groff) ("perl" ,perl) ("pkg-config" ,pkg-config) ("python" ,python-2))) @@ -199,10 +203,30 @@ and support for SSL3 and TLS.") #:phases ;; We have to patch runtests.pl in tests/ directory (modify-phases %standard-phases - (add-before 'check 'patch-runtests + (add-after 'install 'move-man3-pages + (lambda* (#:key outputs #:allow-other-keys) + ;; Move section 3 man pages to "doc". + (let ((out (assoc-ref outputs "out")) + (doc (assoc-ref outputs "doc"))) + (mkdir-p (string-append doc "/share/man")) + (rename-file (string-append out "/share/man/man3") + (string-append doc "/share/man/man3")) + #t))) + (add-before 'configure 'autoconf + ;; Clear artifacts left (shebangs) from release preparation. + (lambda _ + (zero? (system* "./buildconf")))) + (replace 'check (lambda _ + ;; It is unclear why test1026 fails, however the content of it + ;; suggests that it is not vital for gnurl. + (delete-file "tests/data/test1026") + (substitute* "tests/runtests.pl" (("/bin/sh") (which "sh"))) + + ;; Make test output more verbose. + (zero? (system* "make" "-C" "tests" "test")) #t))))) (synopsis "Microfork of cURL with support for the HTTP/HTTPS/GnuTLS subset of cURL") (description diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm index e7c2e2739f..151952663b 100644 --- a/gnu/packages/gnupg.scm +++ b/gnu/packages/gnupg.scm @@ -10,6 +10,8 @@ ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net> ;;; Copyright © 2016 Mike Gerwitz <mtg@gnu.org> +;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com> +;;; Copyright © 2017 Leo Famulari <leo@famulari.name> ;;; ;;; This file is part of GNU Guix. ;;; @@ -45,9 +47,11 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages ncurses) #:use-module (gnu packages security-token) + #:use-module (gnu packages swig) #:use-module (gnu packages tls) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system python)) @@ -188,7 +192,7 @@ specifications are building blocks of S/MIME and TLS.") (define-public npth (package (name "npth") - (version "1.2") + (version "1.3") (source (origin (method url-fetch) @@ -197,7 +201,7 @@ specifications are building blocks of S/MIME and TLS.") version ".tar.bz2")) (sha256 (base32 - "12n0nvhw4fzwp0k7gjv3rc6pdml0qiinbbfiz4ilg6pl5kdxvnvd")))) + "0am86vblapwz84254qpmhz0chk70g6qzh3wdxcs0gvba8d01ka5w")))) (build-system gnu-build-system) (home-page "https://www.gnupg.org") (synopsis "Non-preemptive thread library") @@ -213,20 +217,23 @@ compatible to GNU Pth.") (define-public gnupg (package (name "gnupg") - (version "2.1.16") + (version "2.1.17") (source (origin (method url-fetch) (uri (string-append "mirror://gnupg/gnupg/gnupg-" version ".tar.bz2")) (sha256 (base32 - "0i483m9q032a0s50f1izb213g4h5i7pcgn395m6hvl3sg2kadfa9")))) + "1js308b46ifx1gim0c9nivr5yxhans7iq1yvkf7zl2928gdm9p65")) + (patches + ;; This fixes a test failure on 32bit. Remove for next version. + ;; https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00869.html + (search-patches "gnupg-test-segfault-on-32bit-arch.patch")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs - `(("adns" ,adns) - ("bzip2" ,bzip2) + `(("bzip2" ,bzip2) ("curl" ,curl) ("gnutls" ,gnutls) ("libassuan" ,libassuan) @@ -347,7 +354,7 @@ libskba (working with X.509 certificates and CMS data).") (define-public gpgme (package (name "gpgme") - (version "1.6.0") + (version "1.8.0") (source (origin (method url-fetch) @@ -355,7 +362,7 @@ libskba (working with X.509 certificates and CMS data).") ".tar.bz2")) (sha256 (base32 - "17892sclz3yg45wbyqqrzzpq3l0icbnfl28f101b3062g8cy97dh")))) + "0csx3qnycwm0n90ql6gs65if5xi4gqyzzy21fxs2xqicghjrfq2r")))) (build-system gnu-build-system) (propagated-inputs ;; Needs to be propagated because gpgme.h includes gpg-error.h. @@ -363,7 +370,6 @@ libskba (working with X.509 certificates and CMS data).") (inputs `(("gnupg" ,gnupg-2.0) ("libassuan" ,libassuan))) - (arguments '(#:make-flags '("GPG=gpg2"))) (home-page "https://www.gnupg.org/related_software/gpgme/") (synopsis "Library providing simplified access to GnuPG functionality") (description @@ -378,6 +384,33 @@ instead. This way bug fixes or improvements can be done at a central place and every application benefits from this.") (license license:lgpl2.1+))) +(define-public python-gpg + (package + (name "python-gpg") + (version (package-version gpgme)) + (source (origin + (method url-fetch) + (uri (pypi-uri "gpg" version)) + (sha256 + (base32 + "1x74i6q713c0bckls7rdm8kgsmllf9qvy9x62jghszlhgjkyh9nd")))) + (build-system python-build-system) + (arguments + '(#:tests? #f)) ; No test suite. + (inputs + `(("gpgme" ,gpgme))) + (native-inputs + `(("swig" ,swig))) + (home-page (package-home-page gpgme)) + (synopsis "Python bindings for GPGME GnuPG cryptography library") + (description "This package provides Python bindings to the GPGME GnuPG +cryptographic library. It is developed in the GPGME source code, and then +distributed separately.") + (license license:lgpl2.1+))) + +(define-public python2-gpg + (package-with-python2 python-gpg)) + (define-public python-pygpgme (package (name "python-pygpgme") @@ -414,12 +447,7 @@ decrypt messages using the OpenPGP format by making use of GPGME.") (license license:lgpl2.1+))) (define-public python2-pygpgme - (let ((base (package-with-python2 python-pygpgme))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pygpgme)) (define-public python-gnupg (package @@ -462,35 +490,43 @@ and signature functionality from Python programs.") (package-with-python2 python-gnupg)) (define-public pius - (package - (name "pius") - (version "2.2.2") - (source (origin - (method url-fetch) - (uri (string-append - "https://github.com/jaymzh/pius/releases/download/v" - version "/pius-" version ".tar.bz2")) - (sha256 - (base32 - "0k94mlr7l12mplph7pdgjbampqha47d8mfjq69n4xm80qwbn1rq1")))) - (build-system python-build-system) - (inputs `(("perl" ,perl) ;for 'pius-party-worksheet' - ("gpg" ,gnupg-2.0))) ;2.1 fails to talk to gpg-agent 2.0 - (arguments - `(#:tests? #f - #:python ,python-2 ;uses the Python 2 'print' syntax - #:phases - (modify-phases %standard-phases - (add-before - 'build 'set-gpg-file-name - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((gpg (string-append (assoc-ref inputs "gpg") - "/bin/gpg"))) - (substitute* "libpius/constants.py" - (("/usr/bin/gpg2") gpg)))))))) - (synopsis "Programs to simplify GnuPG key signing") - (description - "Pius (PGP Individual UID Signer) helps attendees of PGP keysigning + ;; pius 2.2.2 does not work with gpg-agent 2.1, so we take a newer + ;; commit. When a new pius (> 2.2.2) is released, update this package + ;; and delete this message. + ;; More info: https://github.com/jaymzh/pius/issues/46 + (let ((commit "891687ccb3d232a1fc0e7da7d22572c0318644cb") + (base-version "2.2.2")) ; i.e. there were no releases + ; between BASE-VERSION and COMMIT + (package + (name "pius") + (version (string-append base-version "-0." + (string-take commit 7))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/jaymzh/pius.git") + (commit commit))) + (sha256 + (base32 + "0m2na4bnf1rv0zpf404l9ga6pwyf7ijldp4lw5irgh7gkmpllxr3")))) + (build-system python-build-system) + (inputs `(("perl" ,perl) ;for 'pius-party-worksheet' + ("gpg" ,gnupg))) + (arguments + `(#:tests? #f + #:python ,python-2 ;uses the Python 2 'print' syntax + #:phases + (modify-phases %standard-phases + (add-before + 'build 'set-gpg-file-name + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gpg (string-append (assoc-ref inputs "gpg") + "/bin/gpg"))) + (substitute* "libpius/constants.py" + (("/usr/bin/gpg2") gpg)))))))) + (synopsis "Programs to simplify GnuPG key signing") + (description + "Pius (PGP Individual UID Signer) helps attendees of PGP keysigning parties. It is the main utility and makes it possible to quickly and easily sign each UID on a set of PGP keys. It is designed to take the pain out of the sign-all-the-keys part of PGP Keysigning Party while adding security @@ -498,8 +534,8 @@ to the process. pius-keyring-mgr and pius-party-worksheet help organisers of PGP keysigning parties.") - (license license:gpl2) - (home-page "https://www.phildev.net/pius/index.shtml"))) + (license license:gpl2) + (home-page "https://www.phildev.net/pius/index.shtml")))) (define-public signing-party (package @@ -590,14 +626,14 @@ including tools for signing keys, keyring analysis, and party preparation. (define-public pinentry-tty (package (name "pinentry-tty") - (version "0.9.7") + (version "1.0.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnupg/pinentry/pinentry-" version ".tar.bz2")) (sha256 (base32 - "1cp7wjqr6nx31mdclr61s2h84ijqjl0ph99kgj4vyawpjj1j1633")))) + "0ni7g4plq6x78p32al7m8h2zsakvg1rhfz0qbc3kdc7yq7nw4whn")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--enable-pinentry-tty"))) diff --git a/gnu/packages/gnustep.scm b/gnu/packages/gnustep.scm index 6c365cbbc4..8f72bb3253 100644 --- a/gnu/packages/gnustep.scm +++ b/gnu/packages/gnustep.scm @@ -60,7 +60,13 @@ (string-append "\"" bin "/wmaker.inst"))) (substitute* '("src/defaults.c" "WPrefs.app/Menu.c") (("\"wmsetbg") - (string-append "\"" bin "/wmsetbg"))))) + (string-append "\"" bin "/wmsetbg"))) + ;; Add enough cells to the command character array to + ;; allow passing our large path to the wmsetbg binary. + ;; The path to wmsetbg in Guix requires 67 extra characters. + (substitute* "src/defaults.c" + (("len = strlen\\(text\\) \\+ 40;") + (string-append "len = strlen(text) + 107;"))))) (alist-cons-after 'install 'wrap (lambda* (#:key outputs #:allow-other-keys) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index 3b00d3c717..d87d592b4d 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -152,7 +152,7 @@ in C/C++.") (define-public nspr (package (name "nspr") - (version "4.12") + (version "4.13.1") (source (origin (method url-fetch) (uri (string-append @@ -160,7 +160,7 @@ in C/C++.") version "/src/nspr-" version ".tar.gz")) (sha256 (base32 - "1pk98bmc5xzbl62q5wf2d6mryf0v95z6rsmxz27nclwiaqg0mcg0")))) + "1arkg08l6zlp8v44shqbk2c8qzwd913lgh60fb3yfxls6d8ifk2y")))) (build-system gnu-build-system) (native-inputs `(("perl" ,perl))) @@ -186,6 +186,10 @@ in the Mozilla clients.") (define-public nss (package (name "nss") + ;; FIXME: NSS 3.27.2 fails its tests on armhf. At least some of the test + ;; failures appear to be caused by test certificates that have expired. + ;; Search the test suite output for 'PayPalEE.cert' for an example: + ;; <https://hydra.gnu.org/build/1712083> (version "3.27.1") (source (origin (method url-fetch) @@ -303,71 +307,49 @@ standards.") (define-public icecat (package (name "icecat") - (version "45.3.0-gnu1-beta") + (version "45.5.1-gnu1") (source (origin (method url-fetch) - (uri (list (string-append "mirror://gnu/gnuzilla/" version "/" - name "-" version ".tar.bz2") - ;; XXX Temporary URI for 45.3 beta release. - ;; Remove when no longer needed. - (string-append "http://jenkins.trisquel.info/icecat/binaries/" - "icecat-45.3.0-gnu1.tar.bz2"))) + (uri (string-append "mirror://gnu/gnuzilla/" + (first (string-split version #\-)) + "/" name "-" version ".tar.bz2")) (sha256 (base32 - "1hk5lwaqm8nkfm43sq521mzyrx0x3iiwvlcy62m7cq7grz9wixp6")) + "1sbfgsibmb8wfmb2g40gmqwq3nikmrgzksf51ydrz7gnafyfaqw1")) (patches - `(,(search-patch "icecat-avoid-bundled-libraries.patch") - ,(search-patch "icecat-binutils.patch") - ,(mozilla-patch "icecat-CVE-2016-5250.patch" "6711ccb0184e" "1p0s91rw1j7ib6hy9gh5p0l33rja32rfgygh29jw4wq1hxfql8rk") - ,(mozilla-patch "icecat-CVE-2016-5257-pt1.patch" "b08f28db372e" "0fmifimavawbff700rzjibsnr16am6902gp965scvi1iy78754ia") - ,(mozilla-patch "icecat-CVE-2016-5257-pt2.patch" "a49fd7eb57ba" "1dyh0pjdmf64sjbj1x0mdjwfispacx9yny1kx9nzpf85myryr640") - ,(mozilla-patch "icecat-CVE-2016-5257-pt3.patch" "9707c3423a1e" "12nn8av0akza4ml1is9mfy8f7368mrkxsl32ly97r4irzh0iryh1") - ,(mozilla-patch "icecat-CVE-2016-5257-pt4.patch" "9d632865560a" "1msp1wqv0c317wqkm82hd9ajbg4a5mcr8pld5j8cx37ccv7f21g3") - ,(mozilla-patch "icecat-CVE-2016-5257-pt5.patch" "90697781ec9f" "1h6gcrw5ykf7r59phxqkhpfs7jsgzqn509qm43sj7mbpcvqvk5mg") - ,(mozilla-patch "icecat-CVE-2016-5257-pt6.patch" "dd9eb81853b9" "1lyqnn40sayziych8gqd5aj7il3zajf318y8ddj8dzz3c8id5dzc") - ,(mozilla-patch "icecat-CVE-2016-5257-pt7.patch" "d91fc76079e0" "022lhixa8dxa6ny9a4bh2di282i0lhyq0glqr9n4q3r8msfmf0ba") - ,(mozilla-patch "icecat-CVE-2016-5257-pt8.patch" "3e37ba5e0867" "1w8lncxaayq4xndhyp1hwlv00zggbayljq6rlypb8kdwgzfpi77w") - ,(mozilla-patch "icecat-CVE-2016-5257-pt9.patch" "3c4958a98908" "16bc6ai5qddnpm3yw24lry5s7i05xs0ycixzxiir4wmcgwcaayiy") - ,(mozilla-patch "icecat-CVE-2016-5261.patch" "bc2f5467b33d" "0i4b8ydmqg4blx541f56g9qrlm7gp6ih4cs7ixbds724cwk83b9f") - ,(mozilla-patch "icecat-CVE-2016-5270.patch" "7cd50d56bb61" "15nbp5axr59mczxgf37nli37jbw0jdknmxz7z71772pzjd2z07r9") - ,(mozilla-patch "icecat-CVE-2016-5272.patch" "6e43a01fee3c" "025xp1wdnz1gc5l2rsgbrwsh1pbysjiyfgz0g6rvr390r7ag1n74") - ,(mozilla-patch "icecat-CVE-2016-5274.patch" "10c9453407de" "1wqh6hj0dpa7r3hhlyrflcv3r3cg0xq4rb0zvhysi6l7lwb8q51r") - ,(mozilla-patch "icecat-CVE-2016-5276.patch" "fc818ab03f15" "1q64ipl172dcmyy9p8p3l3ljpdh1q1jg48lai0qn2xgknl7sdpks") - ,(mozilla-patch "icecat-CVE-2016-5277.patch" "7b668c5cec92" "1qmchn6qifgjakzac6i4hgnivy062pzgz9p1l11c1m3an1rh0isg") - ,(mozilla-patch "icecat-CVE-2016-5278.patch" "fd5052e343df" "1nzmzlnsz61w9aw4mjvgmlkz88aqv1w858rr0mbv07hwyrljfi84") - ,(mozilla-patch "icecat-CVE-2016-5280.patch" "30673bc9730b" "1qz1684v1rp86ngadcaqd68iqf472flnrnk971ryg4fbsyy8g1za") - ,(mozilla-patch "icecat-CVE-2016-5281-pt1.patch" "61405f1fd1df" "1fgmq67arwsl1nrl133fcb5cz6jbbcfjvbv8cd8cadhapin971a7") - ,(mozilla-patch "icecat-CVE-2016-5281-pt2.patch" "7776b6ec7b92" "1f7k8f4lk7nyghwajsxf6nb7yvzsaw3jwpa3316znsva12m548mn") - ,(mozilla-patch "icecat-CVE-2016-5284-pt1.patch" "55e768767416" "1gg7m12njbkn1jqf2gp2y7zd9ik3xhqkjb7znczna4l438h7ki83") - ,(mozilla-patch "icecat-CVE-2016-5284-pt2.patch" "3c42249975a5" "0gnanndkmhsp49rldv4kh0smkdcs7616v46hn567kfw8yfwqvnli") - ,(mozilla-patch "icecat-CVE-2016-5284-pt3.patch" "126e5d574811" "13gr08bzqy23adz0ciihb7cy9wdnkcn71i77a3y5b5apm6k54mwi") - ,(mozilla-patch "icecat-CVE-2016-5284-pt4.patch" "7b8bd7aae1a8" "0mq5gpq6ni8czfcs1rif4is0igh0054aw41ga0jqkq58g7lavkrf") - ,(mozilla-patch "icecat-CVE-2016-5284-pt5.patch" "0799490f4e6f" "1ypv6i48nabbhcqbach8fbgz9bmnhm7q5z9dnfid44z8g54l3f33") - ,(mozilla-patch "icecat-CVE-2016-5284-pt6.patch" "fc990e4ae8bc" "1s2cj505ajwwiy4xvn5zlmyzqpgahxmqqvis0a6xm6mjbjh02gm4") - ,(mozilla-patch "icecat-bug-1251088.patch" "5ffa912ed83e" "0v5lpv3c89c2d4y5acn0kyijv096axdnrvaj5ya5yypzfcaqxv24") - ,(mozilla-patch "icecat-CVE-2016-5290-pt1.patch" "d4b5b8f3e373" "0w8cxn6ryhgxryy8k8i06yw4mknv509ns9ff1avd0hmgxa83mcdp") - ,(mozilla-patch "icecat-CVE-2016-5290-pt2.patch" "adce603ae36d" "0mgs85cwx61bk17r7npl311l4m8yn4667wyhgjmm2ajiys6nn0yl") - ,(mozilla-patch "icecat-CVE-2016-5290-pt3.patch" "97268426bb6f" "1z7hg796cgag025gm9pp2szz7w870s7naagdri1dlsilj797v8hr") - ,(mozilla-patch "icecat-CVE-2016-5290-pt4.patch" "fc055950b6b8" "05iml5k3rzc653jk4imd111sh18625jxfxkcj12kjdihl0gdr4x4") - ,(mozilla-patch "icecat-CVE-2016-5290-pt5.patch" "6f845c23565b" "01dlbnmpsnwr448fajs276y62gl03r74k1hxnwsg6ihwhnfdvn5a") - ,(mozilla-patch "icecat-CVE-2016-5290-pt6.patch" "e5d51ca7a3c0" "0hshcz24hc6pkz5pcqxhajm17ibwrlfn1s00frfnpjjy56vacfz0") - ,(mozilla-patch "icecat-CVE-2016-5290-pt7.patch" "61d1463acd04" "1iig4a79dxmfcr6w82mdhyl88wy7d36g5n4p24632kbabgl9j9sz") - ,(mozilla-patch "icecat-CVE-2016-5290-pt8.patch" "8e0bab4216de" "1knq8h5ni8crfndi3p78b2pyj5lzchqw67vk0yx061r76mq4wp4r") - ,(mozilla-patch "icecat-CVE-2016-5290-pt9.patch" "bb10104dc89e" "1flvagckrzfk7hs2xzb5j3s5i0ck57ygyskh5494xmpa2a1nnsqj") - ,(mozilla-patch "icecat-CVE-2016-5290-pt10.patch" "7006b275b829" "0sqagm247wx94mf51fyhdkn0vf1a1qy9i829shjnhssd79srxmnn") - ,(mozilla-patch "icecat-CVE-2016-5290-pt11.patch" "32ce7be98543" "1y2r9i4p1qpqi75mlwmibr51whz5h1vj28c6mh6ik57dxkqxbclb") - ,(mozilla-patch "icecat-CVE-2016-5291.patch" "3ff0c89f3b26" "1prn74aglshaj27jfrpd2s2i4slpljw4rbzjxc1qgwjvkq4m6j6f") - ,(mozilla-patch "icecat-CVE-2016-5297.patch" "46b07bdbf8b2" "1n8y1c5l0ms81dra7jsx8mp633ak5qvx105drvlg9hn3m0fwv1lj") - ,(search-patch "icecat-CVE-2016-9064.patch") ; adapted for icecat based on: - ; "00c2b7baaa0b" "0y02yb7r62656nq9dji9dnwils2lxqasjz5byv62j1xa87r7f9hp" - ,(mozilla-patch "icecat-CVE-2016-9066.patch" "576f1725a57e" "1lic9d3r8r1vcniw1g3ca71390lw3dmwjsw55dp6z96hyjbcq3fd") - ,(mozilla-patch "icecat-bug-1212939.patch" "4a0e851f83e4" "182vx1qxrr7r2175jjf0bcixwwm1khdj4sq0c8wnsyry7p9waq5q") - ,(mozilla-patch "icecat-bug-1168743.patch" "a1e06af61ab3" "07llk1ba6axjasiv30vicz96k55ff4mybxy21vjxk6j0asgyjz23") - ,(mozilla-patch "icecat-bug-1287176.patch" "0569d5dce9db" "1d41sqbq6jc3af73dz9w19win7v7c12kw1mp7j7b1gkadq46c4y7") - ,(mozilla-patch "icecat-bug-1263665.patch" "a79cafee93f4" "0bn7hpm8mh8qmkpz5wiridr792irrs5sjxyvryazy2i0p4pjh62p") - ,(mozilla-patch "icecat-bug-1304962.patch" "f61049d5f373" "04d1na31qqq7yq4jjvhq6vzqq3f23rwac8c6fw4h5fx1pdb3l997") - ,(mozilla-patch "icecat-bug-1314574.patch" "46b2558ca469" "00q8676xg4wb7p371wgi04nl05j7idkb2kna9a0l08k6lks9wdhh"))) + (list + (search-patch "icecat-avoid-bundled-libraries.patch") + (search-patch "icecat-binutils.patch") + (mozilla-patch "icecat-bug-1301381.patch" "2e5438a92617" "0pyjbzyy04759ldpcar8q8cccv67j1jkxsg46rkq7a3rbhmwmw4p") ;CVE-2016-9897 + (mozilla-patch "icecat-bug-1317409.patch" "7391f60fb790" "1hydggpmmm2cs9lb15micnkxn4wl4cda9g74hkn3zmks805vjz3h") ;CVE-2016-9899 + (mozilla-patch "icecat-bug-1309834.patch" "744e01001e6e" "0z2fq765kap3ll9as5rvjpnbj3pw26074alw7df0zi215qz47nxr") ;CVE-2016-9893-pt1 + (mozilla-patch "icecat-bug-1317936-pt1.patch" "8ae673f34a5b" "1rlbihckl9afa0y91lqs7gpnv6a7zxzrmxjv95y3yrl03kibqp76") ;CVE-2016-9904-pt1 + (mozilla-patch "icecat-bug-1317936-pt2.patch" "409c23c144fe" "05kgs16y8s5pxmg2dxp93247zagnj6zgj3209qpm5hz3an7gr13h") ;CVE-2016-9904-pt2 + (mozilla-patch "icecat-bug-1319122.patch" "994d9bd0e28d" "007wifyx3b2ln4fwv1i8n24yz5ngjf4mkzd7sqr5bpd3q88ff293") ;CVE-2016-9900 + (mozilla-patch "icecat-bug-1312609.patch" "0fc43af8982e" "0pc8q9knzq2knj723mwkay1lnzbzysb07ygxnc16mcb6f7vl2mw8") ;CVE-2016-9893-pt2 + (mozilla-patch "icecat-bug-1319524.patch" "19f9a4643d77" "0w5yxj1l0hvs66q9agjp4m5sfby7fj05lx33gaqf899bw4hn4vcf") ;CVE-2016-9893-pt3 + (mozilla-patch "icecat-bug-1312548.patch" "c58442c414f5" "1z1w1v8xagkhrwgp51ij1k2gx0ripslia09vm78812n7gcwddaas") ;CVE-2016-9893-pt4 + (mozilla-patch "icecat-bug-1314442.patch" "5054047b7328" "0xlw8irymfp3bcaa5jpf7clf7bq6qxp3i8zapp8jya8lzr1nf868") ;CVE-2016-9898 + (mozilla-patch "icecat-bug-881832-pt1.patch" "1123263318a3" "1qkxwva3zrcs1zhga8ncmndq03988dx75i896g53gbvpskj06915") + (mozilla-patch "icecat-bug-881832-pt2.patch" "dc87c0a39adf" "01rapf14f3r2wk0cjd16dn1rll4ipgs33cnjmjck48nvk67ikz6h") + (mozilla-patch "icecat-bug-881832-pt3.patch" "f20e5f488368" "15ql9ywifb3gm2g1057k63f821dbs3wqsh3zhndprzf3dn6aha4i") + (mozilla-patch "icecat-bug-881832-pt4.patch" "7950c4d5bd7c" "0jhkg5hq5yfy7rh21k1mpbsbr81ql85aazym30zy3n2cf28xxhd7") + (mozilla-patch "icecat-bug-881832-pt5.patch" "972734ec21b6" "073i4v1f1ydy49i57pvzscz95sjr5bbk9s5sajxvmmcsmwhpjdfy") + (mozilla-patch "icecat-bug-1293985-pt1.patch" "aebd3687e05e" "1qz6hdgflcrqyg7fv66cbg23v4b7q5bc2yxzrgjxs4j1d7jy1s0s") ;CVE-2016-9905-pt1 + (mozilla-patch "icecat-bug-1293985-pt2.patch" "63d8e5cd27cb" "11fsgyngy7v59ma30xdbmycwf4izwikzvaljngm3ks4534inpl4a") ;CVE-2016-9905-pt2 + (mozilla-patch "icecat-bug-1279202.patch" "e560997291af" "1hn35slasfcj3ryka4fsarx4l9r99z0iwj67fmbv6zxz4z133kks") + (mozilla-patch "icecat-bug-1320039.patch" "21c615b65048" "0ibgsxa36x9ajn2jqbhxxvrfvj6x6iyspsmzzn4brdz11n93skhr") ;CVE-2016-9902 + (mozilla-patch "icecat-bug-1320057.patch" "c15e5afc0430" "17gj32agqs94548z8lvz0l6zz3kbwajn8as0y4iw5nb6jsll4c66") ;CVE-2016-9901 + (mozilla-patch "icecat-bug-1163212.patch" "46163fb1cb34" "1yikayczfgfla3aka0159apq3149d52sgvlca0sivx4myd0lvjm7") ;CVE-2016-9893-pt5 + (mozilla-patch "icecat-bug-1317805.patch" "cde2a37100f5" "100abggnhwyw84almxrkxqfpyfkd4pqkcrh5y9g4d3jd2h16asvl") ;CVE-2016-9893-pt6 + (mozilla-patch "icecat-bug-1298773-pt1.patch" "9b78ab1e6d07" "19ib6bp96xk000ll40b8qxvizkncyzclz2rsb9w5fa42qs9978ff") ;CVE-2016-9893-pt7 + (mozilla-patch "icecat-bug-1298773-pt2.patch" "78ebf9c9dfb0" "1shgr4rk6r2zxr1qqk1j3qnnqzqxnbi093qhlrfh8q5q1ivqf6k1") ;CVE-2016-9893-pt8 + (mozilla-patch "icecat-bug-1299098.patch" "a46a9f16823c" "0dwkyz3kcqnfcbhbfh2lss7s0yh87rgzb871qxx3x4ynyqph9mnz") ;CVE-2016-9893-pt9 + (mozilla-patch "icecat-bug-1311687.patch" "6bc7cc7a33a6" "1wggcqv84n8mp7xps7hy4rwy61fkh45imfqzc0b46s3w5hyhypn2") + (mozilla-patch "icecat-bug-1287912.patch" "778f65148b40" "0j2a153sk0654vv2lnxjib4lwml3mlqn6vs46c2pp82iba8nyfrm") ;CVE-2016-9893-pt10 + (mozilla-patch "icecat-bug-1312272.patch" "94bd2b43c766" "10h0qpr6m9cqyqxxnkbb6mzb3cagavzlynkxgd7a4izyq1bv28rk") ;CVE-2016-9895 + (mozilla-patch "icecat-bug-1315631.patch" "893de7431d51" "11gyik8mwipl6ipypkvdq519pw7ccbg0g0bnvxb7271n44cqqcq5"))) ;CVE-2016-9893-pt11 (modules '((guix build utils))) (snippet '(begin @@ -403,6 +385,7 @@ standards.") "modules/zlib" "modules/libbz2" "ipc/chromium/src/third_party/libevent" + "media/libjpeg" "media/libvpx" "security/nss" "gfx/cairo" @@ -410,7 +393,7 @@ standards.") "db/sqlite3")) ;; Delete .pyc files, typically present in icecat source tarballs (for-each delete-file (find-files "." "\\.pyc$")) - ;; Delete obj-* directories, found in icecat-45.3.0-gnu1-beta + ;; Delete obj-* directories, sometimes present in icecat tarballs (for-each delete-file-recursively (scandir "." (lambda (name) (string-prefix? "obj-" name)))) @@ -432,6 +415,7 @@ standards.") ("hunspell" ,hunspell) ("libcanberra" ,libcanberra) ("libgnome" ,libgnome) + ("libjpeg-turbo" ,libjpeg-turbo) ("libxft" ,libxft) ("libevent" ,libevent) ("libxinerama" ,libxinerama) @@ -489,14 +473,14 @@ standards.") "--disable-debug" "--disable-debug-symbols" - ;; Temporary hack to work around missing - ;; "unofficial" branding in - ;; icecat-45.3.0-gnu1-beta. + ;; Hack to work around missing + ;; "unofficial" branding in icecat. "--enable-official-branding" ;; Avoid bundled libraries. "--with-system-zlib" "--with-system-bz2" + "--with-system-jpeg" ; must be libjpeg-turbo "--with-system-libevent" "--with-system-libvpx" "--with-system-icu" @@ -517,16 +501,6 @@ standards.") ;; Network Graphics (PNG) format"; ;; we probably do not wish to support it. ;; "--with-system-png" - - ;; Fails with "libjpeg-turbo JCS_EXTENSIONS - ;; required". - ;; According to - ;; http://sourceforge.net/projects/libjpeg-turbo/ , - ;; "libjpeg-turbo is a derivative of libjpeg that - ;; uses MMX, SSE, SSE2, and NEON SIMD instructions - ;; to accelerate baseline JPEG compression/ - ;; decompression", so we had better not use it - ;; "--with-system-jpeg" ) #:modules ((ice-9 ftw) diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm index c38270afcb..9d8dcda545 100644 --- a/gnu/packages/golang.scm +++ b/gnu/packages/golang.scm @@ -6,7 +6,7 @@ ;;; Copyright © 2016 Petter <petter@mykolab.ch> ;;; Copyright © 2016 Leo Famulari <leo@famulari.name> ;;; -;;; This file is an addendum GNU Guix. +;;; 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 @@ -200,7 +200,7 @@ sequential processes (CSP) concurrent programming features added.") (package (inherit go-1.4) (name "go") - (version "1.7.3") + (version "1.7.4") (source (origin (method url-fetch) @@ -208,7 +208,7 @@ sequential processes (CSP) concurrent programming features added.") name version ".src.tar.gz")) (sha256 (base32 - "0i7gy5d8j6186a6x07cnj3r7mpfg3964q8byslx0p6x04w00lhvr")))) + "1k0lnsk5i9swi209wh535lpnpczsh6l8m1pfncmilrdsx48r262c")))) (arguments (substitute-keyword-arguments (package-arguments go-1.4) ((#:phases phases) diff --git a/gnu/packages/gps.scm b/gnu/packages/gps.scm index da5485e6ee..bc0f3ed115 100644 --- a/gnu/packages/gps.scm +++ b/gnu/packages/gps.scm @@ -27,7 +27,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages compression) #:use-module (gnu packages docbook) - #:use-module (gnu packages geeqie) ;exiv2 + #:use-module (gnu packages image) #:use-module (gnu packages xml) #:use-module (gnu packages gtk) #:use-module (gnu packages qt)) diff --git a/gnu/packages/graphviz.scm b/gnu/packages/graphviz.scm index 610bd16beb..d47d45e527 100644 --- a/gnu/packages/graphviz.scm +++ b/gnu/packages/graphviz.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2015 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,6 +21,7 @@ (define-module (gnu packages graphviz) #:use-module (guix packages) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (guix download) #:use-module (gnu packages xorg) #:use-module (gnu packages gtk) @@ -30,11 +32,14 @@ #:use-module (gnu packages image) #:use-module (gnu packages autotools) #:use-module (gnu packages pkg-config) + #:use-module (gnu packages glib) + #:use-module (gnu packages gtk) + #:use-module (gnu packages gnome) #:use-module (gnu packages fontutils) #:use-module (gnu packages compression) #:use-module (gnu packages gd) #:use-module (gnu packages swig) - #:use-module ((guix licenses) #:select (lgpl2.0+ epl1.0))) + #:use-module ((guix licenses) #:select (lgpl2.0+ epl1.0 lgpl3+))) (define-public graphviz (package @@ -148,3 +153,46 @@ interfaces for other technical domains.") "Library intended to provide a set of useful functions to deal with 3D surfaces meshed with interconnected triangles.") (license lgpl2.0+))) + +(define-public xdot + (package + (name "xdot") + (version "0.7") + (source + (origin + (method url-fetch) + (uri (pypi-uri "xdot" version)) + (sha256 + (base32 + "1q0f3pskb09saw1qkd2s6vmk80rq5zjhq8l93dfr2x6r04r0q46j")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + ;; We wrap xdot, so that we don't propagate gtk+ and graphviz + (add-after 'install 'wrap + (lambda* (#:key inputs outputs #:allow-other-keys) + (wrap-program (string-append (assoc-ref outputs "out") "/bin/xdot") + `("GI_TYPELIB_PATH" ":" prefix + (,(string-append + (assoc-ref inputs "gtk+") "/lib/girepository-1.0" + ":" (assoc-ref inputs "pango") "/lib/girepository-1.0" + ":" (assoc-ref inputs "gdk-pixbuf") "/lib/girepository-1.0" + ":" (assoc-ref inputs "atk") "/lib/girepository-1.0"))) + `("PATH" ":" prefix + (,(string-append (assoc-ref inputs "graphviz") "/bin")))) + #t))))) + (inputs + `(("atk" ,atk) + ("gdk-pixbuf" ,gdk-pixbuf+svg) + ("graphviz" ,graphviz) + ("gtk+" ,gtk+) + ("python-pycairo" ,python-pycairo) + ("python-pygobject" ,python-pygobject))) + (home-page "https://pypi.python.org/pypi/xdot") + (synopsis "Interactive viewer for graphviz dot files") + (description "Xdot is an interactive viewer for graphs written in +@code{graphviz}’s dot language. Internally, it uses the xdot output format as +an intermediate format,and @code{gtk} and @code{cairo} for rendering. Xdot can +be used either as a standalone application, or as a python library.") + (license lgpl3+))) diff --git a/gnu/packages/groff.scm b/gnu/packages/groff.scm index 93d0380595..e7a6fbda15 100644 --- a/gnu/packages/groff.scm +++ b/gnu/packages/groff.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ #:use-module (guix licenses) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (gnu packages) #:use-module (gnu packages bison) @@ -56,3 +58,42 @@ formatted output based on formatting commands contained within the text. It is usually the formatter of \"man\" documentation pages.") (license gpl3+) (home-page "http://www.gnu.org/software/groff/"))) + +;; There are no releases, so we take the latest commit. +(define-public roffit + (let ((commit "e5228388e3faf2b7f1ae5bd048ad46ed565304c6") + (revision "1")) + (package + (name "roffit") + (version (string-append "0.11-" revision "." (string-take commit 9))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/bagder/roffit.git") + (commit commit))) + (file-name (string-append "roffit-" commit "-checkout")) + (sha256 + (base32 + "1y7ndbqciy7h0khlpi1bv4v1614vhybnmm4jysj6fwxkw9cwv1nc")))) + (build-system gnu-build-system) + (arguments + `(#:test-target "test" + #:make-flags + (list (string-append "INSTALLDIR=" + (assoc-ref %outputs "out") "/bin")) + #:phases + (modify-phases %standard-phases + (delete 'configure) + (add-before 'install 'pre-install + (lambda* (#:key outputs #:allow-other-keys) + (mkdir-p (string-append (assoc-ref outputs "out") + "/bin")) + #t))))) + (inputs + `(("perl" ,perl))) + (home-page "https://daniel.haxx.se/projects/roffit/") + (synopsis "Convert nroff files to HTML") + (description + "Roffit is a program that reads an nroff file and outputs an HTML file. +It is typically used to display man pages on a web site.") + (license expat)))) diff --git a/gnu/packages/grub.scm b/gnu/packages/grub.scm index ef7395e95e..3658f221ce 100644 --- a/gnu/packages/grub.scm +++ b/gnu/packages/grub.scm @@ -36,38 +36,7 @@ #:use-module (gnu packages man) #:use-module (gnu packages texinfo) #:use-module (gnu packages ncurses) - #:use-module (gnu packages cdrom) - #:use-module (srfi srfi-1)) - -(define qemu-for-tests - ;; Newer QEMU versions, such as 1.5.1, no longer support the 'shutdown' - ;; instruction. This leads to test hangs, as reported at - ;; <https://bugs.launchpad.net/bugs/947597> and fixed at - ;; <http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4828>. - ;; Work around it by using an older QEMU. - (package (inherit qemu-minimal) - (version "1.3.1") - (source (origin - (method url-fetch) - (uri (string-append "http://wiki.qemu-project.org/download/qemu-" - version ".tar.bz2")) - (sha256 - (base32 - "1bqfrb5dlsxm8gxhkksz8qzi5fhj3xqhxyfwbqcphhcv1kpyfwip")))) - - ;; With recent GLib versions, we get a test failure: - ;; ERROR:tests/rtc-test.c:176:check_time: assertion failed (ABS(t - s) <= wiggle): (382597824 <= 2) - ;; Simply disable the tests. - (arguments `(#:tests? #f - ,@(substitute-keyword-arguments (package-arguments qemu-minimal) - ((#:phases phases) - ;; We disable the tests so we also skip the phase disabling - ;; the qga test, which fails due to changes in QEMU - `(modify-phases ,phases - (delete 'disable-test-qga)))))) - - ;; The manual fails to build with Texinfo 5.x. - (native-inputs (alist-delete "texinfo" (package-native-inputs qemu))))) + #:use-module (gnu packages cdrom)) (define unifont ;; GNU Unifont, <http://gnu.org/s/unifont>. @@ -151,7 +120,7 @@ ;; Dependencies for the test suite. The "real" QEMU is needed here, ;; because several targets are used. ("parted" ,parted) - ("qemu" ,qemu-for-tests) + ("qemu" ,qemu-minimal) ("xorriso" ,xorriso))) (home-page "https://www.gnu.org/software/grub/") (synopsis "GRand Unified Boot loader") @@ -164,3 +133,29 @@ on the same computer; upon booting the computer, the user is presented with a menu to select one of the installed operating systems.") (license gpl3+) (properties '((cpe-name . "grub2"))))) + +(define-public grub-efi + (package + (inherit grub) + (name "grub-efi") + (synopsis "GRand Unified Boot loader (UEFI version)") + (inputs + `(("efibootmgr" ,efibootmgr) + ,@(package-inputs grub))) + (arguments + `(;; TODO: Tests need a UEFI firmware for qemu. There is one at + ;; https://github.com/tianocore/edk2/tree/master/OvmfPkg . + ;; Search for 'OVMF' in "tests/util/grub-shell.in". + #:tests? #f + ,@(substitute-keyword-arguments (package-arguments grub) + ((#:configure-flags flags) `(cons* "--with-platform=efi" + ,flags)) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'patch-stuff 'use-absolute-efibootmgr-path + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "grub-core/osdep/unix/platform.c" + (("efibootmgr") + (string-append (assoc-ref inputs "efibootmgr") + "/sbin/efibootmgr"))) + #t))))))))) diff --git a/gnu/packages/gstreamer.scm b/gnu/packages/gstreamer.scm index 86ea690e8b..54f1529de4 100644 --- a/gnu/packages/gstreamer.scm +++ b/gnu/packages/gstreamer.scm @@ -98,7 +98,7 @@ arrays of data.") (define-public gstreamer (package (name "gstreamer") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) @@ -107,7 +107,7 @@ arrays of data.") version ".tar.xz")) (sha256 (base32 - "1npnpyrw8603ivi5g3ziglvh3hq2shypid2vjcmki6g6w2bgk3gn")))) + "0rcd4ya4k99x6ngm9v78as7ql0rqibkwshc13lb4rjdszs0qw3hm")))) (build-system gnu-build-system) (outputs '("out" "doc")) (arguments @@ -146,7 +146,7 @@ This package provides the core library and elements.") (define-public gst-plugins-base (package (name "gst-plugins-base") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) @@ -154,7 +154,7 @@ This package provides the core library and elements.") name "-" version ".tar.xz")) (sha256 (base32 - "1jbnr6vbklzli493xdd8y5sflm32r90lifpacxw9vbvs9hlyxkv6")))) + "086yjwmp4fykcqkj6zqhwrk2z49981kl8x545vz2wvblrc7x9h7v")))) (build-system gnu-build-system) (outputs '("out" "doc")) (propagated-inputs @@ -201,20 +201,16 @@ for the GStreamer multimedia library.") (define-public gst-plugins-good (package (name "gst-plugins-good") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) (uri (string-append "https://gstreamer.freedesktop.org/src/" name "/" name "-" version ".tar.xz")) - (patches (search-patches "gst-plugins-good-flic-bounds-check.patch" - "gst-plugins-good-fix-signedness.patch" - "gst-plugins-good-fix-invalid-read.patch" - "gst-plugins-good-fix-crashes.patch")) (sha256 (base32 - "1hkcap9l2603266gyi6jgvx7frbvfmb7xhfhjizbczy1wykjwr57")))) + "04rksbhjj2yz32g523cfabwqn2s3byd94dpbxghxr0p9ridk53qr")))) (build-system gnu-build-system) (inputs `(("aalib" ,aalib) @@ -270,14 +266,14 @@ developers consider to have good quality code and correct functionality.") (define-public gst-plugins-bad (package (name "gst-plugins-bad") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) (uri (string-append "https://gstreamer.freedesktop.org/src/" name "/" name "-" version ".tar.xz")) (sha256 (base32 - "07cjra4fclrk6lpdm5hrsgp79aqpklx3v3l9scain091zvchwghk")))) + "0fisnnfpp3s8pbm6hjrfi4wjpq2da8c6w3ns9pjcg7590f9wm587")))) (outputs '("out" "doc")) (build-system gnu-build-system) (arguments @@ -347,7 +343,7 @@ par compared to the rest.") (define-public gst-plugins-ugly (package (name "gst-plugins-ugly") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) @@ -355,7 +351,7 @@ par compared to the rest.") name "/" name "-" version ".tar.xz")) (sha256 (base32 - "1hl385fys7hfx5ffipavvhciq6hwm731rs4d6r9fn7h9qagxbv55")))) + "17gc2zd3v6spmm2d6912sqfcyyv5f2ghdhq31f5kx5mw5r6ds0zk")))) (build-system gnu-build-system) (inputs `(("gst-plugins-base" ,gst-plugins-base) @@ -386,7 +382,7 @@ distribution problems in some jurisdictions, e.g. due to patent threats.") (define-public gst-libav (package (name "gst-libav") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) (uri (string-append @@ -394,7 +390,7 @@ distribution problems in some jurisdictions, e.g. due to patent threats.") name "-" version ".tar.xz")) (sha256 (base32 - "1ivjbh5g0l5ykfpc16kq5x2jz8d4ignyha14jpiz3pz6w26qpci7")))) + "0g778j7w4vpbhwjzyrzpajvr26nxm6vqby84v8g1w1hz44v71pd3")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--with-system-libav") @@ -424,7 +420,7 @@ compression formats through the use of the libav library.") (define-public python-gst (package (name "python-gst") - (version "1.10.1") + (version "1.10.2") (source (origin (method url-fetch) (uri (string-append @@ -432,7 +428,7 @@ compression formats through the use of the libav library.") "gst-python-" version ".tar.xz")) (sha256 (base32 - "04xhh0z0c0s6aq7kvmfs4r6yl1pjnqz0krp05pbjy62ayx5b61ak")))) + "1sljnqkxf2ix6yzghrapw5irl0rbp8aa8w2hggk7i6d9js10ls71")))) (build-system gnu-build-system) (arguments ;; XXX: Factorize python-sitedir with python-build-system. diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm index 17bd9c9b00..fc4677c247 100644 --- a/gnu/packages/gtk.scm +++ b/gnu/packages/gtk.scm @@ -8,6 +8,7 @@ ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com> ;;; Copyright © 2015 Andy Wingo <wingo@igalia.com> ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com> +;;; Coypright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Fabian Harfert <fhmgufs@web.de> ;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org> @@ -34,6 +35,7 @@ #:use-module (guix utils) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system python) #:use-module (guix build-system waf) @@ -107,7 +109,8 @@ tools have full access to view and control running applications.") version ".tar.xz")) (sha256 (base32 - "0lmjlzmghmr27y615px9hkm552x7ap6pmq9mfbzr6smp8y2b6g31")))) + "0lmjlzmghmr27y615px9hkm552x7ap6pmq9mfbzr6smp8y2b6g31")) + (patches (search-patches "cairo-CVE-2016-9082.patch")))) (build-system gnu-build-system) (propagated-inputs `(("fontconfig" ,fontconfig) @@ -165,7 +168,7 @@ affine transformation (scale, rotation, shear, etc.).") (define-public harfbuzz (package (name "harfbuzz") - (version "1.2.4") + (version "1.3.3") (source (origin (method url-fetch) (uri (string-append "https://www.freedesktop.org/software/" @@ -173,7 +176,7 @@ affine transformation (scale, rotation, shear, etc.).") version ".tar.bz2")) (sha256 (base32 - "14g4kpph8hgplkm954daxiymxx0vicfq7b7svvdsx54g5bqvv7a4")))) + "1jdkdjvci5d6r26vimsz24hz3xqqrk5xq40n693jn4m42mqrh816")))) (build-system gnu-build-system) (outputs '("out" "bin")) ; 160K, only hb-view depend on cairo @@ -198,7 +201,7 @@ affine transformation (scale, rotation, shear, etc.).") "HarfBuzz is an OpenType text shaping engine.") (license (license:x11-style "file://COPYING" "See 'COPYING' in the distribution.")) - (home-page "http://www.freedesktop.org/wiki/Software/HarfBuzz/"))) + (home-page "https://www.freedesktop.org/wiki/Software/HarfBuzz/"))) (define-public pango (package @@ -298,6 +301,23 @@ graph-like environments, e.g. modular synths or finite state machine diagrams.") (license license:gpl3+))) +(define-public ganv-devel + (let ((commit "31685d283e9b811b61014f820c42807f4effa071") + (revision "1")) + (package + (inherit ganv) + (name "ganv") + (version (string-append "1.4.2-" revision "." + (string-take commit 9))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "http://git.drobilla.net/ganv.git") + (commit commit))) + (sha256 + (base32 + "0xmbykdl42jn9cgzrqrys5lng67d26nk5xq10wkkvjqldiwdck56"))))))) + (define-public gtksourceview-2 (package (name "gtksourceview") diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm index dffa1258d2..a408f8f9aa 100644 --- a/gnu/packages/guile.scm +++ b/gnu/packages/guile.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; 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 © 2014, 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Christopher Allan Webber <cwebber@dustycloud.org> ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co> @@ -146,8 +146,8 @@ without requiring the source code to be rewritten.") (native-inputs `(("pkgconfig" ,pkg-config))) (inputs `(("libffi" ,libffi) ("readline" ,readline) - ("bash" ,bash))) - + ,@(libiconv-if-needed) + ,@(if (target-mingw?) '() `(("bash" ,bash))))) (propagated-inputs `( ;; These ones aren't normally needed here, but since `libguile-2.0.la' ;; reads `-lltdl -lunistring', adding them here will add the needed @@ -176,8 +176,15 @@ without requiring the source code to be rewritten.") ;; Tell (ice-9 popen) the file name of Bash. (let ((bash (assoc-ref inputs "bash"))) (substitute* "module/ice-9/popen.scm" + ;; If bash is #f allow fallback for user to provide + ;; "bash" in PATH. This happens when cross-building to + ;; MinGW for which we do not have Bash yet. (("/bin/sh") - (string-append bash "/bin/bash"))))) + ,@(if (target-mingw?) + '((if bash + (string-append bash "/bin/bash") + "bash")) + '((string-append bash "/bin/bash"))))))) %standard-phases))) (native-search-paths @@ -210,7 +217,7 @@ without requiring the source code to be rewritten.") (define-public guile-next (package (inherit guile-2.0) (name "guile-next") - (version "2.1.4") + (version "2.1.5") (replacement #f) (source (origin (method url-fetch) @@ -218,7 +225,7 @@ without requiring the source code to be rewritten.") version ".tar.xz")) (sha256 (base32 - "1w8kyy8nz6489d092fix6lvgjrk0bww7i0c2k67ym4hq0kjl0r1j")) + "0r9y4hw17dlxahik4zsccfb2f3p2a07wqndfm251bgmam9hln6gi")) (modules '((guix build utils))) ;; Remove the pre-built object files. Instead, build everything @@ -227,7 +234,10 @@ without requiring the source code to be rewritten.") (snippet '(for-each delete-file (find-files "prebuilt" "\\.go$"))))) (synopsis "Snapshot of what will become version 2.2 of GNU Guile") - (properties '((timeout . 72000))) ; 20 hours + (properties '((timeout . 72000) ;20 hours + (upstream-name . "guile") + (ftp-server . "alpha.gnu.org") + (ftp-directory . "/gnu/guile"))) (native-search-paths (list (search-path-specification (variable "GUILE_LOAD_PATH") @@ -408,16 +418,20 @@ many readers as needed).") "--with-gnu-filesystem-hierarchy") #:phases (modify-phases %standard-phases - (add-after 'install 'post-install + (add-before 'build 'fix-libguile-ncurses-file-name (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (dir (string-append out "/share/guile/site/")) - (files (find-files dir ".scm"))) - (substitute* files - (("\"libguile-ncurses\"") - (format #f "\"~a/lib/guile/2.0/libguile-ncurses\"" - out))) - #t)))))) + (and (zero? (system* "make" "install" + "-C" "src/ncurses" + "-j" (number->string + (parallel-job-count)))) + (let* ((out (assoc-ref outputs "out")) + (dir "src/ncurses") + (files (find-files dir ".scm"))) + (substitute* files + (("\"libguile-ncurses\"") + (format #f "\"~a/lib/guile/2.0/libguile-ncurses\"" + out))) + #t))))))) (home-page "https://www.gnu.org/software/guile-ncurses/") (synopsis "Guile bindings to ncurses") (description @@ -669,7 +683,7 @@ See http://minikanren.org/ for more on miniKanren generally.") (define-public guile-irregex (package (name "guile-irregex") - (version "0.9.4") + (version "0.9.6") (source (origin (method url-fetch) (uri (string-append @@ -677,7 +691,7 @@ See http://minikanren.org/ for more on miniKanren generally.") version ".tar.gz")) (sha256 (base32 - "0cmaqvqvyarcnnsyrl2p6vwyv1r3k1q7qw8p9zrlnz1vpbj7vb90")))) + "1ia3m7dp3lcxa048q0gqbiwwsyvn99baw6xkhb4bhhzn4k7bwyqq")))) (build-system gnu-build-system) (arguments `(#:modules ((guix build utils) @@ -1399,4 +1413,74 @@ type system, elevating types to first-class status.") dictionary and suggesting spelling corrections.") (license gpl3+))) +(define-public guile-bash + ;; This project is currently retired. It was initially announced here: + ;; <https://lists.gnu.org/archive/html/guile-user/2015-02/msg00003.html>. + (let ((commit "1eabc563ca5692b3e08d84f1f0e6fd2283284469") + (revision "0")) + (package + (name "guile-bash") + (version (string-append "0.1.6-" revision "." (string-take commit 7))) + (home-page + "https://anonscm.debian.org/cgit/users/kaction-guest/retired/dev.guile-bash.git") + (source (origin + (method git-fetch) + (uri (git-reference + (commit commit) + (url home-page))) + (sha256 + (base32 + "097vny990wp2qpjij6a5a5gwc6fxzg5wk56inhy18iki5v6pif1p")) + (file-name (string-append name "-" version "-checkout")))) + (build-system gnu-build-system) + (arguments + '(#:phases (modify-phases %standard-phases + (add-after 'unpack 'bootstrap + (lambda _ + (zero? (system* "sh" "bootstrap"))))) + + #:configure-flags + ;; Add -I to match 'bash.pc' of Bash 4.4. + (list (string-append "CPPFLAGS=-I" + (assoc-ref %build-inputs "bash:include") + "/include/bash/include") + + ;; The '.a' file is useless. + "--disable-static" + + ;; Install 'lib/bash' as Bash 4.4 expects. + (string-append "--libdir=" (assoc-ref %outputs "out") + "/lib/bash")))) + (native-inputs `(("pkg-config" ,pkg-config) + ("autoconf" ,(autoconf-wrapper)) + ("automake" ,automake) + ("libtool" ,libtool) + ;; Gettext brings 'AC_LIB_LINKFLAGS_FROM_LIBS'. + ("gettext" ,gettext-minimal))) + (inputs `(("guile" ,guile-2.0) + ("bash:include" ,bash "include"))) + (synopsis "Extend Bash using Guile") + (description + "Guile-Bash provides a shared library and set of Guile modules, +allowing you to extend Bash in Scheme. Scheme interfaces allow you to access +the following aspects of Bash: + +@itemize +@item aliases; +@item setting and getting Bash variables; +@item creating dynamic variables; +@item creating Bash functions with a Scheme implementation; +@item reader macro for output capturing; +@item reader macro for evaluating raw Bash commands. +@end itemize + +To enable it, run: + +@example +enable -f ~/.guix-profile/lib/bash/libguile-bash.so scm +@end example + +and then run @command{scm example.scm}.") + (license gpl3+)))) + ;;; guile.scm ends here diff --git a/gnu/packages/gv.scm b/gnu/packages/gv.scm index e1e86a83a6..446b2946b5 100644 --- a/gnu/packages/gv.scm +++ b/gnu/packages/gv.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> -;;; Copyright © 2013, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2013, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; ;;; This file is part of GNU Guix. @@ -40,8 +40,25 @@ (sha256 (base32 "0q8s43z14vxm41pfa8s5h9kyyzk1fkwjhkiwbf2x70alm6rv6qi1")))) (build-system gnu-build-system) - (propagated-inputs `(("ghostscript" ,ghostscript/x))) - (inputs `(("libx11" ,libx11) + (arguments + '(#:phases (modify-phases %standard-phases + (add-before 'configure 'set-gs-file-name + (lambda* (#:key inputs #:allow-other-keys) + ;; Set the value of 'GV.gsInterpreter' in the generated + ;; 'gv_system.ad' file. + (let ((gs (assoc-ref inputs "ghostscript"))) + (with-fluids ((%default-port-encoding "ISO-8859-1")) + (substitute* "src/Makefile.in" + (("GV\\.gsInterpreter:([[:blank:]]+)gs" _ blank) + (string-append "GV.gsInterpreter:" blank + gs "/bin/gs")) + (("GV\\.gsCmd([[:alpha:]]+):([[:blank:]]+)gs" _ + command blank) + (string-append "GV.gsCmd" command ":" + blank gs "/bin/gs")))) + #t)))))) + (inputs `(("ghostscript" ,ghostscript/x) + ("libx11" ,libx11) ("libxaw3d" ,libxaw3d) ("libxinerama" ,libxinerama) ("libxpm" ,libxpm) diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm index 7a7d6bab87..ac0eac3fe8 100644 --- a/gnu/packages/haskell.scm +++ b/gnu/packages/haskell.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2016, 2017 David Craven <david@craven.ch> ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,33 +25,33 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages haskell) - #:use-module (ice-9 regex) - #:use-module ((guix licenses) #:prefix license:) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix utils) - #:use-module (guix build-system gnu) - #:use-module (guix build-system haskell) - #:use-module (gnu packages pkg-config) - #:use-module (gnu packages perl) + #:use-module (gnu packages bootstrap) #:use-module (gnu packages compression) #:use-module (gnu packages elf) - #:use-module (gnu packages gl) - #:use-module (gnu packages sdl) - #:use-module (gnu packages bootstrap) - #:use-module (gnu packages zip) #:use-module (gnu packages gcc) #:use-module (gnu packages ghostscript) - #:use-module (gnu packages libffi) + #:use-module (gnu packages gl) #:use-module (gnu packages libedit) + #:use-module (gnu packages libffi) #:use-module (gnu packages lua) #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) #:use-module (gnu packages ncurses) - #:use-module (gnu packages python) #:use-module (gnu packages pcre) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages sdl) #:use-module (gnu packages xml) - #:use-module (gnu packages xorg)) + #:use-module (gnu packages xorg) + #:use-module (gnu packages zip) + #:use-module (guix build-system gnu) + #:use-module (guix build-system haskell) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix utils) + #:use-module (ice-9 regex)) (define ghc-bootstrap-x86_64-7.8.4 (origin @@ -2199,7 +2200,7 @@ removed. Both IPv4 and IPv6 are supported.") (inputs `(("ghc-mtl" ,ghc-mtl))) (home-page - "http://sourceforge.net/projects/lazy-regex") + "https://sourceforge.net/projects/lazy-regex") (synopsis "Replaces/Enhances Text.Regex") (description "@code{Text.Regex.Base} provides the interface API for regex-posix, regex-pcre, regex-parsec, regex-tdfa, regex-dfa.") @@ -2222,7 +2223,7 @@ regex-posix, regex-pcre, regex-parsec, regex-tdfa, regex-dfa.") (build-system haskell-build-system) (inputs `(("ghc-regex-base" ,ghc-regex-base))) - (home-page "http://sourceforge.net/projects/lazy-regex") + (home-page "https://sourceforge.net/projects/lazy-regex") (synopsis "POSIX regular expressions for Haskell") (description "This library provides the POSIX regex backend used by the Haskell library @code{regex-base}.") @@ -2246,7 +2247,7 @@ Haskell library @code{regex-base}.") (inputs `(("ghc-regex-base" ,ghc-regex-base) ("ghc-regex-posix" ,ghc-regex-posix))) - (home-page "http://sourceforge.net/projects/lazy-regex") + (home-page "https://sourceforge.net/projects/lazy-regex") (synopsis "Replaces/Enhances Text.Regex") (description "This library provides one module layer over @code{regex-posix} to replace @code{Text.Regex}.") @@ -2315,36 +2316,34 @@ the parsers provided by @code{parsec}, @code{attoparsec} and @code{base}'s (define-public ghc-trifecta (package (name "ghc-trifecta") - (version "1.5.2") - (source - (origin - (method url-fetch) - (uri (string-append - "https://hackage.haskell.org/package/trifecta/trifecta-" - version - ".tar.gz")) - (sha256 - (base32 - "0fjhnsbafl3yw34pyhcsvrqy6a2mnhyqys6gna3rrlygs8ck7hpb")))) + (version "1.6") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/trifecta/" + "trifecta-" version ".tar.gz")) + (sha256 + (base32 + "0rbhv9m17k7l1zr70i0yw5da0qjgxmfh1da8brj0zdzwjn9ac0mk")))) (build-system haskell-build-system) - (arguments `(#:tests? #f)) ; FIXME: Test fails with "cannot satisfy - ; -package ansi-terminal-0.6.2.3" (inputs - `(("ghc-charset" ,ghc-charset) - ("ghc-comonad" ,ghc-comonad) - ("ghc-lens" ,ghc-lens) - ("ghc-profunctors" ,ghc-profunctors) - ("ghc-reducers" ,ghc-reducers) + `(("ghc-reducers" ,ghc-reducers) ("ghc-semigroups" ,ghc-semigroups) ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint) ("ghc-ansi-terminal" ,ghc-ansi-terminal) ("ghc-blaze-builder" ,ghc-blaze-builder) ("ghc-blaze-html" ,ghc-blaze-html) ("ghc-blaze-markup" ,ghc-blaze-markup) + ("ghc-charset" ,ghc-charset) + ("ghc-comonad" ,ghc-comonad) + ("ghc-doctest" ,ghc-doctest) ("ghc-fingertree" ,ghc-fingertree) ("ghc-hashable" ,ghc-hashable) + ("ghc-lens" ,ghc-lens) ("ghc-mtl" ,ghc-mtl) ("ghc-parsers" ,ghc-parsers) + ("ghc-profunctors" ,ghc-profunctors) + ("ghc-quickcheck" ,ghc-quickcheck) ("ghc-unordered-containers" ,ghc-unordered-containers) ("ghc-utf8-string" ,ghc-utf8-string))) (home-page "https://github.com/ekmett/trifecta/") @@ -6670,67 +6669,6 @@ constant-time: @end enumerate\n") (license license:bsd-3))) -(define-public idris - (package - (name "idris") - (version "0.9.19.1") - (source - (origin - (method url-fetch) - (uri (string-append "https://hackage.haskell.org/package/idris-" - version "/idris-" version ".tar.gz")) - (sha256 - (base32 - "10641svdsjlxbxmbvylpia04cz5nn9486lpiay8ibqcrc1792qgc")) - (modules '((guix build utils))) - (snippet - '(substitute* "idris.cabal" - ;; Package description file has a too-tight version restriction, - ;; rendering it incompatible with GHC 7.10.2. This is fixed - ;; upstream. See - ;; <https://github.com/idris-lang/Idris-dev/issues/2734>. - (("vector < 0.11") "vector < 0.12"))))) - (build-system haskell-build-system) - (arguments - `(#:phases (modify-phases %standard-phases - (add-before 'configure 'patch-cc-command - (lambda _ - (setenv "CC" "gcc")))))) - (inputs - `(("gmp" ,gmp) - ("ncurses" ,ncurses) - ("ghc-annotated-wl-pprint" ,ghc-annotated-wl-pprint) - ("ghc-ansi-terminal" ,ghc-ansi-terminal) - ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint) - ("ghc-base64-bytestring" ,ghc-base64-bytestring) - ("ghc-blaze-html" ,ghc-blaze-html) - ("ghc-blaze-markup" ,ghc-blaze-markup) - ("ghc-cheapskate" ,ghc-cheapskate) - ("ghc-fingertree" ,ghc-fingertree) - ("ghc-mtl" ,ghc-mtl) - ("ghc-network" ,ghc-network) - ("ghc-optparse-applicative" ,ghc-optparse-applicative) - ("ghc-parsers" ,ghc-parsers) - ("ghc-safe" ,ghc-safe) - ("ghc-split" ,ghc-split) - ("ghc-text" ,ghc-text) - ("ghc-trifecta" ,ghc-trifecta) - ("ghc-uniplate" ,ghc-uniplate) - ("ghc-unordered-containers" ,ghc-unordered-containers) - ("ghc-utf8-string" ,ghc-utf8-string) - ("ghc-vector-binary-instances" ,ghc-vector-binary-instances) - ("ghc-vector" ,ghc-vector) - ("ghc-zip-archive" ,ghc-zip-archive) - ("ghc-zlib" ,ghc-zlib))) - (home-page "http://www.idris-lang.org") - (synopsis "General purpose language with full dependent types") - (description "Idris is a general purpose language with full dependent -types. It is compiled, with eager evaluation. Dependent types allow types to -be predicated on values, meaning that some aspects of a program's behaviour -can be specified precisely in the type. The language is closely related to -Epigram and Agda.") - (license license:bsd-3))) - (define-public ghc-base16-bytestring (package (name "ghc-base16-bytestring") @@ -7994,4 +7932,172 @@ helper functions for Lists, Maybes, Tuples, Functions.") 3D plots using gnuplot.") (license license:bsd-3))) +(define-public ghc-hinotify + (package + (name "ghc-hinotify") + (version "0.3.8.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/hinotify/" + "hinotify-" version ".tar.gz")) + (sha256 + (base32 + "03c1f4d7x805zdiq2w26kl09xrfjw19saycdkhnixzv2qcr6xm1p")))) + (build-system haskell-build-system) + (home-page "https://github.com/kolmodin/hinotify.git") + (synopsis "Haskell binding to inotify") + (description "This library provides a wrapper to the Linux kernel's inotify +feature, allowing applications to subscribe to notifications when a file is +accessed or modified.") + (license license:bsd-3))) + +(define-public ghc-fsnotify + (package + (name "ghc-fsnotify") + (version "0.2.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/fsnotify/" + "fsnotify-" version ".tar.gz")) + (sha256 + (base32 + "0asl313a52qx2w6dw25g845683xsl840bwjh118nkwi5v1xipkzb")))) + (build-system haskell-build-system) + (inputs + `(("ghc-text" ,ghc-text) + ("ghc-async" ,ghc-async) + ("ghc-unix-compat" ,ghc-unix-compat) + ("ghc-hinotify" ,ghc-hinotify) + ("ghc-tasty" ,ghc-tasty) + ("ghc-tasty-hunit" ,ghc-tasty-hunit) + ("ghc-temporary-rc" ,ghc-temporary-rc))) + (home-page "https://github.com/haskell-fswatch/hfsnotify") + (synopsis "Cross platform library for file change notification.") + (description "Cross platform library for file creation, modification, and +deletion notification. This library builds upon existing libraries for platform +specific Windows, Mac, and Linux filesystem event notification.") + (license license:bsd-3))) + +(define-public ghc-tasty-rerun + (package + (name "ghc-tasty-rerun") + (version "1.1.6") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/tasty-rerun/" + "tasty-rerun-" version ".tar.gz")) + (sha256 + (base32 + "0ycxg7whabgcxyzy6gr536x8ykzx45whh1wrbsc7c58zi862fczd")))) + (build-system haskell-build-system) + (inputs + `(("ghc-mtl" ,ghc-mtl) + ("ghc-optparse-applicative" ,ghc-optparse-applicative) + ("ghc-reducers" ,ghc-reducers) + ("ghc-split" ,ghc-split) + ("ghc-stm" ,ghc-stm) + ("ghc-tagged" ,ghc-tagged) + ("ghc-tasty" ,ghc-tasty))) + (home-page "http://github.com/ocharles/tasty-rerun") + (synopsis "Run tests by filtering the test tree") + (description "This package adds the ability to run tests by filtering the +test tree based on the result of a previous test run. You can use this to run +only those tests that failed in the last run, or to only run the tests that have +been added since previous test run.") + (license license:bsd-3))) + +(define-public ghc-ieee754 + (package + (name "ghc-ieee754") + (version "0.7.8") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/ieee754/" + "ieee754-" version ".tar.gz")) + (sha256 + (base32 + "1zvfnnd5nm5kgr60214cdyks0kqdqyzpwk5sdh0s60yr8b7fyjny")))) + (build-system haskell-build-system) + (home-page "http://github.com/patperry/hs-ieee754") + (synopsis "Utilities for dealing with IEEE floating point numbers") + (description "Utilities for dealing with IEEE floating point numbers, +ported from the Tango math library; approximate and exact equality comparisons +for general types.") + (license license:bsd-3))) + +(define-public ghc-terminal-size + (package + (name "ghc-terminal-size") + (version "0.3.2.1") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/terminal-size/" + "terminal-size-" version ".tar.gz")) + (sha256 + (base32 + "0n4nvj3dbj9gxfnprgish45asn9z4dipv9j98s8i7g2n8yb3xhmm")))) + (build-system haskell-build-system) + (home-page "http://hackage.haskell.org/package/terminal-size") + (synopsis "Get terminal window height and width") + (description "Get terminal window height and width without ncurses +dependency.") + (license license:bsd-3))) + +(define-public ghc-language-c + (package + (name "ghc-language-c") + (version "0.5.0") + (source + (origin + (method url-fetch) + (uri (string-append "https://hackage.haskell.org/package/" + "language-c/language-c-" version ".tar.gz")) + (sha256 + (base32 + "08i2bl7jmmymn2sldzlbz6ig7lx3wfwhlpadzibs3fx72z08pmc6")))) + (build-system haskell-build-system) + (inputs `(("ghc-syb" ,ghc-syb))) + (native-inputs + `(("ghc-happy" ,ghc-happy) + ("ghc-alex" ,ghc-alex))) + (home-page "http://visq.github.io/language-c/") + (synopsis "Analysis and generation of C code") + (description + "Language C is a Haskell library for the analysis and generation of C code. +It features a complete, well-tested parser and pretty printer for all of C99 +and a large set of GNU extensions.") + (license license:bsd-3))) + +(define-public ghc-markdown-unlit + (package + (name "ghc-markdown-unlit") + (version "0.4.0") + (source (origin + (method url-fetch) + (uri (string-append + "mirror://hackage/package/markdown-unlit/" + "markdown-unlit-" version ".tar.gz")) + (sha256 + (base32 + "1kj2bffl7ndd8ygwwa3r1mbpwbxbfhyfgnbla8k8g9i6ffp0qrbw")))) + (build-system haskell-build-system) + (inputs + `(("ghc-base-compat" ,ghc-base-compat) + ("ghc-hspec" ,ghc-hspec) + ("ghc-quickcheck" ,ghc-quickcheck) + ("ghc-silently" ,ghc-silently) + ("ghc-stringbuilder" ,ghc-stringbuilder) + ("ghc-temporary" ,ghc-temporary) + ("hspec-discover" ,hspec-discover))) + (home-page "https://github.com/sol/markdown-unlit#readme") + (synopsis "Literate Haskell support for Markdown") + (description "This package allows you to have a README.md that at the +same time is a literate Haskell program.") + (license license:expat))) + ;;; haskell.scm ends here diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm index a4c0296b04..557091d055 100644 --- a/gnu/packages/hurd.scm +++ b/gnu/packages/hurd.scm @@ -28,12 +28,17 @@ #:use-module (gnu packages bison) #:use-module (gnu packages perl) #:use-module (gnu packages base) - #:use-module (guix git-download)) + #:use-module (guix git-download) + #:export (hurd-triplet?)) + +(define (hurd-triplet? triplet) + (and (string-suffix? "-gnu" triplet) + (not (string-contains triplet "linux")))) (define-public gnumach-headers (package (name "gnumach-headers") - (version "1.7") + (version "1.8") (source (origin (method url-fetch) @@ -41,7 +46,7 @@ version ".tar.gz")) (sha256 (base32 - "1vd0bykshf6ilr55792b5lf6yd5ywlkp1wqz00dcsx7fq3rfadz2")))) + "02hygsfpd2dljl5lg1vjjg9pizi9jyxd4aiiqzjshz6jax62jm9f")))) (build-system gnu-build-system) (arguments `(#:phases (alist-replace @@ -71,7 +76,7 @@ (define-public mig (package (name "mig") - (version "1.7") + (version "1.8") (source (origin (method url-fetch) @@ -79,7 +84,7 @@ version ".tar.gz")) (sha256 (base32 - "1hxqd8p14pgamgavmbmziswvd1zvwqx7lgc9qga805q9jrs93q2b")))) + "1gyda8sq6b379nx01hkpbd85lz39irdvz2b9wbr63gicicx8i706")))) (build-system gnu-build-system) ;; Flex is needed both at build and run time. (inputs `(("gnumach-headers" ,gnumach-headers) @@ -102,14 +107,14 @@ communication.") (define-public hurd-headers (package (name "hurd-headers") - (version "0.8") + (version "0.9") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hurd/hurd-" version ".tar.gz")) (sha256 (base32 - "1pbc4aqgzxvkgivw80ghp3w755cl0fwxmg357vq7chimj64jk78d")))) + "1nw9gly0n7pyv3cpfm4mmxy4yccrx4g0lyrvd3vk2vil26jpbggw")))) (build-system gnu-build-system) (native-inputs `(("mig" ,mig))) diff --git a/gnu/packages/idris.scm b/gnu/packages/idris.scm new file mode 100644 index 0000000000..02198a5a7d --- /dev/null +++ b/gnu/packages/idris.scm @@ -0,0 +1,256 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org> +;;; Copyright © 2016, 2017 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages idris) + #:use-module (gnu packages haskell) + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages ncurses) + #:use-module (guix build-system gnu) + #:use-module (guix build-system haskell) + #:use-module (guix download) + #:use-module (guix git-download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages)) + +(define-public idris + (package + (name "idris") + (version "0.99") + (source (origin + (method url-fetch) + (uri (string-append + "https://hackage.haskell.org/package/" + "idris-" version "/idris-" version ".tar.gz")) + (sha256 + (base32 + "1sd4vy5rx0mp32xj99qijhknkgw4d2rxvz6wiy3pym6kaqmc497i")))) + (build-system haskell-build-system) + (inputs + `(("gmp" ,gmp) + ("ncurses" ,ncurses) + ("ghc-aeson" ,ghc-aeson) + ("ghc-async" ,ghc-async) + ("ghc-annotated-wl-pprint" ,ghc-annotated-wl-pprint) + ("ghc-ansi-terminal" ,ghc-ansi-terminal) + ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint) + ("ghc-base64-bytestring" ,ghc-base64-bytestring) + ("ghc-blaze-html" ,ghc-blaze-html) + ("ghc-blaze-markup" ,ghc-blaze-markup) + ("ghc-cheapskate" ,ghc-cheapskate) + ("ghc-fingertree" ,ghc-fingertree) + ("ghc-fsnotify" ,ghc-fsnotify) + ("ghc-ieee754" ,ghc-ieee754) + ("ghc-mtl" ,ghc-mtl) + ("ghc-network" ,ghc-network) + ("ghc-optparse-applicative" ,ghc-optparse-applicative) + ("ghc-parsers" ,ghc-parsers) + ("ghc-regex-tdfa" ,ghc-regex-tdfa) + ("ghc-safe" ,ghc-safe) + ("ghc-split" ,ghc-split) + ("ghc-tasty" ,ghc-tasty) + ("ghc-tasty-golden" ,ghc-tasty-golden) + ("ghc-tasty-rerun" ,ghc-tasty-rerun) + ("ghc-terminal-size" ,ghc-terminal-size) + ("ghc-text" ,ghc-text) + ("ghc-trifecta" ,ghc-trifecta) + ("ghc-uniplate" ,ghc-uniplate) + ("ghc-unordered-containers" ,ghc-unordered-containers) + ("ghc-utf8-string" ,ghc-utf8-string) + ("ghc-vector-binary-instances" ,ghc-vector-binary-instances) + ("ghc-vector" ,ghc-vector) + ("ghc-zip-archive" ,ghc-zip-archive) + ("ghc-zlib" ,ghc-zlib))) + (arguments + `(#:tests? #f ; FIXME: Test suite doesn't run in a sandbox. + #:configure-flags + (list (string-append "--datasubdir=" + (assoc-ref %outputs "out") "/lib/idris")) + #:phases + (modify-phases %standard-phases + (add-before 'configure 'set-cc-command + (lambda _ + (setenv "CC" "gcc") + #t)) + (add-after 'install 'fix-libs-install-location + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (lib (string-append out "/lib/idris")) + (modules (string-append lib "/libs"))) + (for-each + (lambda (module) + (symlink (string-append modules "/" module) + (string-append lib "/" module))) + '("prelude" "base" "contrib" "effects" "pruviloj")))))))) + (native-search-paths + (list (search-path-specification + (variable "IDRIS_LIBRARY_PATH") + (files '("lib/idris"))))) + (home-page "http://www.idris-lang.org") + (synopsis "General purpose language with full dependent types") + (description "Idris is a general purpose language with full dependent +types. It is compiled, with eager evaluation. Dependent types allow types to +be predicated on values, meaning that some aspects of a program's behaviour +can be specified precisely in the type. The language is closely related to +Epigram and Agda.") + (license license:bsd-3))) + +;; Idris modules use the gnu-build-system so that the IDRIS_LIBRARY_PATH is set. +(define (idris-default-arguments name) + `(#:modules ((guix build gnu-build-system) + (guix build utils) + (ice-9 ftw) + (ice-9 match)) + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (delete 'check) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (idris (assoc-ref inputs "idris")) + (idris-bin (string-append idris "/bin/idris")) + (idris-libs (string-append idris "/lib/idris/libs")) + (module-name (and (string-prefix? "idris-" ,name) + (substring ,name 6))) + (ibcsubdir (string-append out "/lib/idris/" module-name)) + (ipkg (string-append module-name ".ipkg")) + (idris-library-path (getenv "IDRIS_LIBRARY_PATH")) + (idris-path (string-split idris-library-path #\:)) + (idris-path-files (apply append + (map (lambda (path) + (map (lambda (dir) + (string-append path "/" dir)) + (scandir path))) idris-path))) + (idris-path-subdirs (filter (lambda (path) + (and path (match (stat:type (stat path)) + ('directory #t) + (_ #f)))) + idris-path-files)) + (install-cmd (cons* idris-bin + "--ibcsubdir" ibcsubdir + "--install" ipkg + (apply append (map (lambda (path) + (list "--idrispath" + path)) + idris-path-subdirs))))) + (setenv "IDRIS_LIBRARY_PATH" idris-libs) + ;; FIXME: Seems to be a bug in idris that causes a dubious failure. + (apply system* install-cmd) + #t)))))) + +(define-public idris-lightyear + (let ((commit "6d65ad111b4bed2bc131396f8385528fc6b3678a")) + (package + (name "idris-lightyear") + (version (git-version "0.1" "1" commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/ziman/lightyear") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1pkxnn3ryr0v0cin4nasw7kgkc9dnnpja1nfbj466mf3qv5s98af")))) + (build-system gnu-build-system) + (native-inputs + `(("idris" ,idris))) + (arguments (idris-default-arguments name)) + (home-page "https://github.com/ziman/lightyear") + (synopsis "Lightweight parser combinator library for Idris") + (description "Lightweight parser combinator library for Idris, inspired +by Parsec. This package is used (almost) the same way as Parsec, except for one +difference: backtracking.") + (license license:bsd-2)))) + +(define-public idris-wl-pprint + (let ((commit "1d365fcf4ba075859844dbc5eb96a90f57b9f338")) + (package + (name "idris-wl-pprint") + (version (git-version "0.1" "1" commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/shayan-najd/wl-pprint") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0g7c3y9smifdz4sivi3qmvymhdr7v9kfq45fmfmmvkqcrix0spzn")))) + (build-system gnu-build-system) + (native-inputs + `(("idris" ,idris))) + (arguments (idris-default-arguments name)) + (home-page "https://github.com/shayan-najd/wl-pprint") + (synopsis "Pretty printing library") + (description "A pretty printing library for Idris based on Phil Wadler's +paper A Prettier Printer and on Daan Leijen's extensions in the Haskell +wl-pprint library.") + (license license:bsd-2)))) + +(define-public idris-bifunctors + (let ((commit "53d06a6ccfe70c49c9ae8c8a4135981dd2173202")) + (package + (name "idris-bifunctors") + (version (git-version "0.1" "1" commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/HuwCampbell/Idris-Bifunctors") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "02vbsd3rmgnj0l1qq787709qcxjbr9890cbad4ykn27f77jk81h4")))) + (build-system gnu-build-system) + (native-inputs + `(("idris" ,idris))) + (arguments (idris-default-arguments name)) + (home-page "https://github.com/HuwCampbell/Idris-Bifunctors") + (synopsis "Bifunctor library") + (description "This is a bifunctor library for Idris based off the +excellent Haskell Bifunctors package from Edward Kmett.") + (license license:bsd-3)))) + +(define-public idris-lens + (let ((commit "26f012005f6849806cea630afe317e42cae97f29")) + (package + (name "idris-lens") + (version (git-version "0.1" "1" commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/HuwCampbell/idris-lens") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "06jzfj6rad08rk92w8jk5byi79svmyg0mrcqhibgx8rkjjy6vmai")))) + (build-system gnu-build-system) + (native-inputs + `(("idris" ,idris))) + (propagated-inputs + `(("idris-bifunctors" ,idris-bifunctors))) + (arguments (idris-default-arguments name)) + (home-page "https://github.com/HuwCampbell/idris-lens") + (synopsis "Van Laarhoven lenses for Idris") + (description "Lenses are composable functional references. They allow +accessing and modifying data within a structure.") + (license license:bsd-3)))) diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm new file mode 100644 index 0000000000..bc56041f84 --- /dev/null +++ b/gnu/packages/image-viewers.scm @@ -0,0 +1,207 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net> +;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com> +;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2017 Alex Griffin <a@ajgrf.com> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages image-viewers) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix download) + #:use-module (guix packages) + #:use-module (guix build-system gnu) + #:use-module (gnu packages autotools) + #:use-module (gnu packages base) + #:use-module (gnu packages curl) + #:use-module (gnu packages ghostscript) + #:use-module (gnu packages glib) + #:use-module (gnu packages gnome) + #:use-module (gnu packages gtk) + #:use-module (gnu packages image) + #:use-module (gnu packages photo) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages xorg)) + +(define-public feh + (package + (name "feh") + (version "2.18") + (home-page "https://feh.finalrewind.org/") + (source (origin + (method url-fetch) + (uri (string-append home-page + name "-" version ".tar.bz2")) + (sha256 + (base32 + "036lgv81d0vmrnmh1z1x360nr5avb2sk5jb1h3g5n6jijm8vzblx")))) + (build-system gnu-build-system) + (arguments + '(#:phases (alist-delete 'configure %standard-phases) + #:tests? #f + #:make-flags + (list "CC=gcc" (string-append "PREFIX=" (assoc-ref %outputs "out"))))) + (inputs `(("imlib2" ,imlib2) + ("curl" ,curl) + ("libpng" ,libpng) + ("libxt" ,libxt) + ("libx11" ,libx11) + ("libxinerama" ,libxinerama))) + (synopsis "Fast and light imlib2-based image viewer") + (description + "feh is an X11 image viewer aimed mostly at console users. +Unlike most other viewers, it does not have a fancy GUI, but simply +displays images. It can also be used to set the desktop wallpaper. +It is controlled via commandline arguments and configurable key/mouse +actions.") + + ;; The license is really the Expat license, with additional wording in the + ;; 2nd paragraph: "acknowledgment shall be given in the documentation and + ;; software packages that this Software was used." + (license (license:x11-style + "file://COPYING" + "See 'COPYING' in the distribution.")))) + +(define-public geeqie + (package + (name "geeqie") + (version "1.3") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/BestImageViewer/geeqie/" + "releases/download/v" version "/geeqie-" + version ".tar.xz")) + (sha256 + (base32 + "0gzc82sy66pbsmq7lnmq4y37zqad1zfwfls3ik3dmfm8s5nmcvsb")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'autogen + (lambda _ + (setenv "NOCONFIGURE" "true") + (zero? (system* "sh" "autogen.sh"))))))) + (inputs + `(;; ("libchamplain" ,libchamplain) + ("lcms" ,lcms) + ("exiv2" ,exiv2) + ("libpng" ,libpng) + ("gtk+" ,gtk+-2))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("glib" ,glib "bin") ; glib-gettextize + ("intltool" ,intltool) + ("pkg-config" ,pkg-config))) + (home-page "http://www.geeqie.org/") + (synopsis "Lightweight GTK+ based image viewer") + (description + "Geeqie is a lightweight GTK+ based image viewer for Unix like operating +systems. It features: EXIF, IPTC and XMP metadata browsing and editing +interoperability; easy integration with other software; geeqie works on files +and directories, there is no need to import images; fast preview for many raw +image formats; tools for image comparison, sorting and managing photo +collection. Geeqie was initially based on GQview.") + (license license:gpl2+))) + +(define-public sxiv + (package + (name "sxiv") + (version "1.3.2") + (source (origin + (method url-fetch) + (uri (string-append + "https://github.com/muennich/sxiv/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0lxnd33gaw4drhdwbkk94wzrjyhh64d57jq2ps7ffmqgizg6hlwz")))) + (build-system gnu-build-system) + (arguments + '(#:tests? #f ; no check target + #:make-flags (list (string-append "PREFIX=" %output) + "CC=gcc") + #:phases (alist-delete + 'configure ; no configure phase + %standard-phases))) + (inputs + `(("libx11" ,libx11) + ("imlib2" ,imlib2) + ("giflib" ,giflib) + ("libexif" ,libexif))) + (home-page "https://github.com/muennich/sxiv") + (synopsis "Simple X Image Viewer") + (description + "sxiv is an alternative to feh and qiv. Its primary goal is to +provide the most basic features required for fast image viewing. It has +vi key bindings and works nicely with tiling window managers. Its code +base should be kept small and clean to make it easy for you to dig into +it and customize it for your needs.") + (license license:gpl2+))) + +(define-public viewnior + (package + (name "viewnior") + (version "1.6") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/xsisqox/Viewnior/archive/" + name "-" version ".tar.gz")) + (sha256 + (base32 + "18309qjgwak3kn228z3p3nx7yxasqgzx69v3rgc23hf161nky0c9")))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'autogen + (lambda _ + (zero? (system* "sh" "autogen.sh"))))))) + (native-inputs + `(("automake" ,automake) + ("autoconf" ,autoconf) + ("intltool" ,intltool) + ("glib" ,glib "bin") ; glib-genmarshal + ("gnome-common" ,gnome-common) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config) + ("shared-mime-info" ,shared-mime-info) + ("which" ,which))) + (inputs + `(("exiv2" ,exiv2) + ("gdk-pixbuf" ,gdk-pixbuf) + ("gtk+-2" ,gtk+-2))) + (home-page "http://siyanpanayotov.com/project/viewnior/") + (synopsis "Simple, fast and elegant image viewer") + (description "Viewnior is an image viewer program. Created to be simple, +fast and elegant. Its minimalistic interface provides more screenspace for +your images. Among its features are: +@enumerate +@item Fullscreen & Slideshow +@item Rotate, flip, crop, save, delete images +@item Animation support +@item Browse only selected images +@item Navigation window +@item Set image as wallpaper (Gnome 2, Gnome 3, XFCE, LXDE, FluxBox, Nitrogen) +@item Simple interface +@item EXIF and IPTC metadata +@item Configurable mouse actions +@end enumerate\n") + (license license:gpl3+))) diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm index 0003ca0c67..4e40533a21 100644 --- a/gnu/packages/image.scm +++ b/gnu/packages/image.scm @@ -1,4 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2015, 2016 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com> @@ -7,7 +8,7 @@ ;;; Copyright © 2015 Amirouche Boubekki <amirouche@hypermove.net> ;;; Copyright © 2014 John Darrington <jmd@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 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net> @@ -31,14 +32,18 @@ (define-module (gnu packages image) #:use-module (gnu packages) #:use-module (gnu packages algebra) + #:use-module (gnu packages assembly) #:use-module (gnu packages autotools) #:use-module (gnu packages boost) #:use-module (gnu packages compression) #:use-module (gnu packages documentation) #:use-module (gnu packages fontutils) + ;; To provide gcc@5 and gcc@6, to work around <http://bugs.gnu.org/24703>. + #:use-module (gnu packages gcc) #:use-module (gnu packages gettext) #:use-module (gnu packages ghostscript) #:use-module (gnu packages gl) + #:use-module (gnu packages glib) #:use-module (gnu packages graphics) #:use-module (gnu packages maths) #:use-module (gnu packages mcrypt) @@ -59,6 +64,7 @@ (define-public libpng (package (name "libpng") + (replacement libpng/fixed) (version "1.6.25") (source (origin (method url-fetch) @@ -83,10 +89,19 @@ library. It supports almost all PNG features and is extensible.") (license license:zlib) (home-page "http://www.libpng.org/pub/png/libpng.html"))) +(define libpng/fixed + (package + (inherit libpng) + (source + (origin + (inherit (package-source libpng)) + (patches (search-patches "libpng-CVE-2016-10087.patch")))))) + (define-public libpng-1.2 (package (inherit libpng) - (version "1.2.56") + (replacement #f) + (version "1.2.57") (source (origin (method url-fetch) @@ -97,7 +112,7 @@ library. It supports almost all PNG features and is extensible.") "ftp://ftp.simplesystems.org/pub/libpng/png/src" "/libpng12/libpng-" version ".tar.xz"))) (sha256 - (base32 "1ghd03p353x0vi4dk83n1nlldg11w7vqdk3f99rkgfb82ic59ki4")))))) + (base32 "1n2lrzjkm5jhfg2bs10q398lkwbbx742fi27zgdgx0x23zhj0ihg")))))) (define-public libjpeg (package @@ -260,6 +275,9 @@ extracting icontainer icon files.") (assoc-ref %outputs "doc") "/share/doc/" ,name "-" ,version)))) + ;; Build with a patched GCC to work around <http://bugs.gnu.org/24703>. + (native-inputs + `(("gcc@5" ,gcc-5))) (inputs `(("zlib" ,zlib) ("libjpeg" ,libjpeg))) (synopsis "Library for handling TIFF files") @@ -321,28 +339,23 @@ the W3C's XML-based Scaleable Vector Graphic (SVG) format.") (define-public leptonica (package (name "leptonica") - (version "1.72") + (version "1.74.0") (source (origin (method url-fetch) - (uri (string-append "http://www.leptonica.com/source/leptonica-" - version ".tar.gz")) + (uri (string-append + "https://github.com/DanBloomberg/leptonica/archive/" version + ".tar.gz")) + (file-name (string-append "leptonica-" version ".tar.gz")) (sha256 - (base32 "0mhzvqs0im04y1cpcc1yma70hgdac1frf33h73m9z3356bfymmbr")) - (modules '((guix build utils))) - ;; zlib and openjpg should be under Libs, not Libs.private. See: - ;; https://code.google.com/p/tesseract-ocr/issues/detail?id=1436 - (snippet - '(substitute* "lept.pc.in" - (("^(Libs\\.private: .*)@ZLIB_LIBS@(.*)" all pre post) - (string-append pre post)) - (("^(Libs\\.private: .*)@JPEG_LIBS@(.*)" all pre post) - (string-append pre post)) - (("^Libs: .*" all) - (string-append all " @ZLIB_LIBS@ @JPEG_LIBS@")))))) + (base32 "0i2a4vx9gizki0wgmv03xjz8j9d8agkvbag1a8m4kcw4asd4p87g")))) (build-system gnu-build-system) (native-inputs - `(("gnuplot" ,gnuplot))) ;needed for test suite + `(("gnuplot" ,gnuplot) ;needed for test suite + ("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config))) (inputs `(("giflib" ,giflib) ("libjpeg" ,libjpeg) @@ -350,31 +363,22 @@ the W3C's XML-based Scaleable Vector Graphic (SVG) format.") ("libtiff" ,libtiff) ("libwebp" ,libwebp))) (propagated-inputs + ;; Linking a program with leptonica also requires these. `(("openjpeg" ,openjpeg) ("zlib" ,zlib))) (arguments - '(#:parallel-tests? #f ; XXX: cause fpix1_reg to fail - #:phases + '(#:phases (modify-phases %standard-phases - ;; Prevent make from trying to regenerate config.h.in. - (add-after - 'unpack 'set-config-h-in-file-time - (lambda _ - (set-file-time "config/config.h.in" (stat "configure")))) - (add-after - 'unpack 'patch-reg-wrapper - (lambda _ - (substitute* "prog/reg_wrapper.sh" - ((" /bin/sh ") - (string-append " " (which "sh") " ")) - (("which gnuplot") (which "gnuplot"))))) - (add-before - 'check 'disable-failing-tests - ;; XXX: 2 of 9 tests from webpio_reg fails. - (lambda _ - (substitute* "prog/webpio_reg.c" - ((".*DoWebpTest2.* 90.*") "") - ((".*DoWebpTest2.* 100.*") ""))))))) + (add-after 'unpack 'autogen + (lambda _ + (zero? (system* "sh" "autobuild")))) + (add-after 'unpack 'patch-reg-wrapper + (lambda _ + (substitute* "prog/reg_wrapper.sh" + ((" /bin/sh ") + (string-append " " (which "sh") " ")) + (("which gnuplot") + "true"))))))) (home-page "http://www.leptonica.com/") (synopsis "Library and tools for image processing and analysis") (description @@ -417,6 +421,7 @@ work.") (define-public openjpeg (package (name "openjpeg") + (replacement openjpeg-2.1.2) (version "2.1.1") (source (origin @@ -453,9 +458,27 @@ error-resilience, a Java-viewer for j2k-images, ...") (home-page "https://github.com/uclouvain/openjpeg") (license license:bsd-2))) +(define openjpeg-2.1.2 + (package + (inherit openjpeg) + (name "openjpeg") + (version "2.1.2") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/uclouvain/openjpeg/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "19yz4g0c45sm8y1z01j9djsrl1mkz3pmw7fykc6hkvrqymp7prsc")) + (patches + (search-patches "openjpeg-CVE-2016-9850-CVE-2016-9851.patch")))))) + (define-public openjpeg-1 (package (inherit openjpeg) (name "openjpeg") + (replacement #f) (version "1.5.2") (source (origin @@ -557,7 +580,7 @@ compose, and analyze GIF images.") ("libtiff" ,libtiff) ("giflib" ,giflib) ("bzip2" ,bzip2))) - (home-page "http://sourceforge.net/projects/enlightenment/") + (home-page "https://sourceforge.net/projects/enlightenment/") (synopsis "Loading, saving, rendering and manipulating image files") (description @@ -763,6 +786,39 @@ channels.") "Libmng is the MNG (Multiple-image Network Graphics) reference library.") (license license:bsd-3))) +(define-public exiv2 + (package + (name "exiv2") + (version "0.25") + (source (origin + (method url-fetch) + (uri (list (string-append "http://www.exiv2.org/exiv2-" + version ".tar.gz") + (string-append "https://fossies.org/linux/misc/exiv2-" + version ".tar.gz"))) + (sha256 + (base32 + "197g6vgcpyf9p2cwn5p5hb1r714xsk1v4p96f5pv1z8mi9vzq2y8")))) + (build-system gnu-build-system) + (arguments '(#:tests? #f)) ; no `check' target + (propagated-inputs + `(("expat" ,expat) + ("zlib" ,zlib))) + (native-inputs + `(("intltool" ,intltool))) + (home-page "http://www.exiv2.org/") + (synopsis "Library and command-line utility to manage image metadata") + (description + "Exiv2 is a C++ library and a command line utility to manage image +metadata. It provides fast and easy read and write access to the Exif, IPTC +and XMP metadata of images in various formats.") + + ;; Files under `xmpsdk' are a copy of Adobe's XMP SDK, licensed under the + ;; 3-clause BSD license: <http://www.adobe.com/devnet/xmp/sdk/eula.html>. + ;; The core is GPLv2+: + ;; <https://launchpad.net/ubuntu/precise/+source/exiv2/+copyright>. + (license license:gpl2+))) + (define-public devil (package (name "devil") @@ -819,15 +875,15 @@ convert, manipulate, filter and display a wide variety of image formats.") (define-public jasper (package (name "jasper") - (version "1.900.29") + (version "2.0.10") (source (origin (method url-fetch) (uri (string-append "https://www.ece.uvic.ca/~frodo/jasper" "/software/jasper-" version ".tar.gz")) (sha256 (base32 - "1h1575wdzq1p7y2xvy1gbiypai1iils5awhy4gadr78qpb9ykrra")))) - (build-system gnu-build-system) + "1s022mfxyw8jw60fgyj60lbm9h6bc4nk2751b0in8qsjwcl59n2l")))) + (build-system cmake-build-system) (inputs `(("libjpeg" ,libjpeg))) (synopsis "JPEG-2000 library") (description "The JasPer Project is an initiative to provide a reference @@ -992,3 +1048,43 @@ also converts external formats (BMP, GIF, PNM and TIFF) to optimized PNG, and performs PNG integrity checks and corrections.") (home-page "http://optipng.sourceforge.net/") (license license:zlib))) + +(define-public libjpeg-turbo + (package + (name "libjpeg-turbo") + (version "1.5.1") + (source (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/" name "/" version "/" + name "-" version ".tar.gz")) + (sha256 + (base32 + "0v365hm6z6lddcqagjj15wflk66rqyw75m73cqzl65rh4lyrshj1")))) + (build-system gnu-build-system) + (native-inputs + `(("nasm" ,nasm))) + (arguments + '(#:test-target "test" + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'set-env-on-MIPS + ;; This is borrowed from Debian's patchset for libjpeg + ;; https://sources.debian.net/data/main/libj/libjpeg-turbo/1:1.5.1-2/debian/patches/0001-Declare-env-on-MIPS-on-first-use-Courtesy-of-Aurelie.patch + (lambda _ + (substitute* "simd/jsimd_mips.c" + (("env = getenv\\(\"JSIMD_FORCEDSPR2") + "char *env = getenv(\"JSIMD_FORCEDSPR2")) + #t))))) + (home-page "http://www.libjpeg-turbo.org/") + (synopsis "SIMD-accelerated JPEG image handling library") + (description "libjpeg-turbo is a JPEG image codec that accelerates baseline +JPEG compression and decompression using SIMD instructions: MMX on x86, SSE2 on +x86-64, NEON on ARM, and AltiVec on PowerPC processors. Even on other systems, +its highly-optimized Huffman coding routines allow it to outperform libjpeg by +a significant amount. +libjpeg-turbo implements both the traditional libjpeg API and the less powerful +but more straightforward TurboJPEG API, and provides a full-featured Java +interface. It supports color space extensions that allow it to compress from +and decompress to 32-bit and big-endian pixel buffers (RGBX, XBGR, etc.).") + (license (list license:bsd-3 ; jsimd*.[ch] and most of simd/ + license:ijg)))) ; the rest diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm index 4e70212133..48d468734b 100644 --- a/gnu/packages/imagemagick.scm +++ b/gnu/packages/imagemagick.scm @@ -43,14 +43,14 @@ (define-public imagemagick (package (name "imagemagick") - (version "6.9.6-6") + (version "6.9.7-0") (source (origin (method url-fetch) (uri (string-append "mirror://imagemagick/ImageMagick-" version ".tar.xz")) (sha256 (base32 - "02hd0xvpm99wrix2didg8xnra4fla04y9vaks2vnijry3l0gxlcw")))) + "0c6ff1am2mhc0dc26h50l78yx6acwqymwpwgkxgx69cb6jfpwrdx")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--with-frozenpaths" "--without-gcc-arch") diff --git a/gnu/packages/inkscape.scm b/gnu/packages/inkscape.scm index d98a4cd7a9..e20ca666bd 100644 --- a/gnu/packages/inkscape.scm +++ b/gnu/packages/inkscape.scm @@ -23,7 +23,7 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix utils) - #:use-module (guix build-system gnu) + #:use-module (guix build-system cmake) #:use-module (gnu packages) #:use-module (gnu packages aspell) #:use-module (gnu packages bdw-gc) @@ -44,20 +44,16 @@ (define-public inkscape (package (name "inkscape") - (version "0.91") + (version "0.92.0") (source (origin (method url-fetch) - (uri (string-append "https://launchpad.net/inkscape/" - (version-major+minor version) ".x/" - version "/+download/inkscape-" - version ".tar.gz")) + (uri (string-append "https://media.inkscape.org/dl/" + "resources/file/" + "inkscape-" version ".tar.bz2")) (sha256 (base32 - "086v01jy896dj86bq7plrf6si4p6gh6ga2v5417llgmminycz8rc")) - (patch-flags '("-p0")) - (patches - (search-patches "inkscape-drop-wait-for-targets.patch")))) - (build-system gnu-build-system) + "0mmssxnxsvb3bpm7ck5pqvwyacrz1nkyacs571jx8j04l1cw3d5q")))) + (build-system cmake-build-system) (inputs `(("aspell" ,aspell) ("gtkmm" ,gtkmm-2) @@ -75,19 +71,11 @@ ("boost" ,boost))) (native-inputs `(("intltool" ,intltool) + ("glib" ,glib "bin") ("perl" ,perl) ("pkg-config" ,pkg-config))) - (arguments - `(;; Add '-std=c++11', required by recent versions of GLibmm & co. - ;; Use '-g0' to reduce disk usage during the build. - #:configure-flags '("CXXFLAGS=-g0 -O2 -fopenmp -std=c++11") - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'fix-test-includes - (lambda _ - (substitute* "src/cxxtests.cpp" - (("\\.\\./\\.\\./src") "../src")) - #t))))) + ;; FIXME: tests require gmock + (arguments `(#:tests? #f)) (home-page "http://inkscape.org/") (synopsis "Vector graphics editor") (description "Inkscape is a vector graphics editor. What sets Inkscape diff --git a/gnu/packages/irc.scm b/gnu/packages/irc.scm index 3b63c899eb..44e21af7d6 100644 --- a/gnu/packages/irc.scm +++ b/gnu/packages/irc.scm @@ -3,7 +3,7 @@ ;;; Copyright © 2014 Kevin Lemonnier <lemonnierk@ulrar.net> ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il> -;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,9 +32,11 @@ #:use-module (gnu packages autogen) #:use-module (gnu packages autotools) #:use-module (gnu packages base) + #:use-module (gnu packages backup) #:use-module (gnu packages compression) #:use-module (gnu packages curl) #:use-module (gnu packages cyrus-sasl) + #:use-module (gnu packages databases) #:use-module (gnu packages file) #:use-module (gnu packages gettext) #:use-module (gnu packages glib) @@ -47,6 +49,7 @@ #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) + #:use-module (gnu packages ruby) #:use-module (gnu packages qt) #:use-module (gnu packages tcl) #:use-module (gnu packages tls) @@ -97,7 +100,7 @@ irssi, but graphical.") (define-public irssi (package (name "irssi") - (version "0.8.20") + (version "1.0.0") (source (origin (method url-fetch) (uri (string-append "https://github.com/irssi/irssi/" @@ -105,31 +108,29 @@ irssi, but graphical.") version ".tar.xz")) (sha256 (base32 - "0njh43xmpad9h5g6fp1805hrix1mwbbnk7p6qmlw9apm47lc90kq")))) + "1f2gmr5nynagwi4wx3yprhzfpg4ww6r7ff395b0a48d0qqgkr2ka")))) (build-system gnu-build-system) (arguments `(#:phases (modify-phases %standard-phases (replace 'configure (lambda* (#:key inputs outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out")) - (ncurses (assoc-ref inputs "ncurses"))) + (let ((out (assoc-ref outputs "out"))) (setenv "CONFIG_SHELL" (which "bash")) (zero? (system* "./configure" (string-append "--prefix=" out) - (string-append "--with-ncurses=" ncurses) (string-append "--with-proxy") (string-append "--with-socks") (string-append "--with-bot"))))))))) (inputs `(("glib" ,glib) ("ncurses" ,ncurses) - ("openssl" ,openssl))) - (native-inputs - `(("pkg-config" ,pkg-config) + ("openssl" ,openssl) ("perl" ,perl))) - (home-page "http://www.irssi.org/") + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "https://irssi.org/") (synopsis "Terminal-based IRC client") (description "Irssi is a terminal based IRC client for UNIX systems. It also supports @@ -143,10 +144,10 @@ SILC and ICB protocols via plugins.") (source (origin (method url-fetch) (uri (string-append "http://weechat.org/files/src/weechat-" - version ".tar.gz")) + version ".tar.xz")) (sha256 (base32 - "0lyqrymdjdvkzg8510l46c4zw8mjagnmri2i6m9y9qz0c1sfaq9h")) + "1qqnb9bdi15l30378rnmhf26ndacwi5hmq5vpz4lfyihk17xnryn")) (patches (search-patches "weechat-python.patch")))) (build-system gnu-build-system) (native-inputs `(("autoconf" ,autoconf) @@ -329,3 +330,91 @@ and extensible with plugins and scripts.") embedded web server, translations (fr, fi, it, hu, de), and many other enhancements and bug fixes.") (license license:bsd-3))) + +(define-public epic5 + (package + (name "epic5") + (version "2.0.1") + (source (origin + (method url-fetch) + (uri (string-append "http://ftp.epicsol.org/pub/" + "epic/EPIC5-PRODUCTION/" + name "-" version ".tar.xz")) + (sha256 + (base32 + "1ap73d5f4vccxjaaq249zh981z85106vvqmxfm4plvy76b40y9jm")))) + (build-system gnu-build-system) + (arguments + `(#:test-target "test" + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-perl + (lambda _ + (substitute* "regress/crash-irc" + (("perl5") (which "perl"))) + #t)) + (add-after 'unpack 'patch-bsdinstall + ;; If we just remove /bin/ some part of the bsdinstall breaks. + ;; Furthermore bsdinstalls has a reference to /etc/chmod here, which + ;; means if we leave /etc/ in, install fails. + (lambda _ + (substitute* "bsdinstall" + (("/bin/strip") "strip") + (("/bin/cp") "cp") + (("/bin/chmod") "chmod") + (("/bin/chgrp") "chgrp") + (("/bin/mkdir") "mkdir") + (("/bin/rm") "rm") + (("/bin/mv") "mv") + (("/etc/") "")) + #t)) + (replace 'configure + (lambda* (#:key outputs #:allow-other-keys) + ;; The tarball uses a very old version of autconf. It does not + ;; understand extra flags like `--enable-fast-install', so + ;; we need to invoke it with just what it understands. + (let ((out (assoc-ref outputs "out"))) + ;; 'configure' doesn't understand '--host'. + ,@(if (%current-target-system) + `((setenv "CHOST" ,(%current-target-system))) + '()) + (setenv "CONFIG_SHELL" (which "bash")) + (setenv "SHELL" (which "bash")) + (zero? + (system* "./configure" + (string-append "--prefix=" out) + "--with-ipv6" "--with-libarchive" + ;; We use libressl because openssl does not come + ;; with the lib/libssl.a which is needed for epic5. + ;; XXX: No matter which implementation is chosen, + ;; epic5 fails to connect to tls ports of roundrobin + ;; irc networks. This however is believed to be an + ;; protocol issue at epic5 related to ircd. + (string-append "--with-ssl=" + (assoc-ref %build-inputs "libressl")) + (string-append "--with-tcl=" + (assoc-ref %build-inputs "tcl") + "/lib/tclConfig.sh"))))))))) + (inputs + `(("libressl" ,libressl) + ("ncurses" ,ncurses) + ("libarchive" ,libarchive) ; CHANGELOG: "Support for loading zip files" + ("perl" ,perl) + ("tcl" ,tcl) + ("ruby" ,ruby))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "http://epicsol.org") + (synopsis "Epic5 IRC Client") + (description + "EPIC is a IRC client that has been under active development for +over 20 years. It is stable and mature, and offers an excellent ircII +interface for those who are accustomed to the ircII way of doing things.") + (license (list license:bsd-3 + license:isc + license:bsd-4 + ;; The epic license is equal to the standard three-clause + ;; BSD license except that you are not permitted to remove the + ;; "Redistribution is permitted" clause of the license if you + ;; distribute binaries. + (license:non-copyleft "http://epicsol.org/copyright"))))) diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm index df8a970e0c..3a08fd83a8 100644 --- a/gnu/packages/java.scm +++ b/gnu/packages/java.scm @@ -783,7 +783,7 @@ build process and its dependencies, whereas Make uses Makefile format.") (license license:gpl2+))) (define-public icedtea-7 - (let* ((version "2.6.7") + (let* ((version "2.6.8") (drop (lambda (name hash) (origin (method url-fetch) @@ -800,7 +800,7 @@ build process and its dependencies, whereas Make uses Makefile format.") version ".tar.xz")) (sha256 (base32 - "1r4y1afjdm72j4lkd1jsim595zy5s3hvc3dnl13f5a7wrxp2v4nh")) + "0p95402viz6dnfkhhn18hrvm7wqfvij0xnxvp9nqj3aq3gzk0h45")) (modules '((guix build utils))) (snippet '(substitute* "Makefile.in" @@ -927,25 +927,25 @@ build process and its dependencies, whereas Make uses Makefile format.") (native-inputs `(("openjdk-src" ,(drop "openjdk" - "0y38vgvzw2xggfg0nlalv42amy5sv6vzvjxik8bvkm1sajzazb2w")) + "1qscircx5z9rnyx4k6lzxbrl5q6f9shag962zl0f52cyrcma5gp6")) ("corba-drop" ,(drop "corba" - "0r778nhmzcnf6jkl50f6f279vbzh96rcwr74vb0930wgl2g46j80")) + "0f25l1db5v9ib4v5wb32wjblb2zzx8f8qgr2g84yg26aq2m8swig")) ("jaxp-drop" ,(drop "jaxp" - "02y7zaw4irjvbihpr4pbrl64pxjx5anfxms3i24rp1q6aj2n1gcz")) + "1z4i404i3rrf5zmch8z2rslqm7vs1wzjhvjf6kgkdvnrka7a86xs")) ("jaxws-drop" ,(drop "jaxws" - "1xrhdgykpi7amyyirzchp4mjrx2j3xm6nqg4bbfy2kxv7daw3z69")) + "06h49jgf76408j1qhhkksly8fbyw1wisyvgi1csvj2f63bkr6c3m")) ("jdk-drop" ,(drop "jdk" - "108d560iabk334lcifr5xf1w075a6c918smpbcaccsrln8qd6g79")) + "0qg76gjlnyrjskzz019fi47vqdxpa51sdhcyx4lsa25j5vsih4gc")) ("langtools-drop" ,(drop "langtools" - "1r5llvhxzdihyz6rmr6ri9wz8zvbw4gmlllhb340p86liqqh1rqk")) + "04w82l34z83n8cd901bvmlrdk825nw5ijgny5cn1idnhplzcckh0")) ("hotspot-drop" ,(drop "hotspot" - "0p3arg01jfdnbx856qfhhzp7s9yzmqwa1fspk5spmmxb9m7mj4h4")) + "153i1panv3mzwh39dc8rxr9hj5920y86a4m8djxsk6qnyd4gamfa")) ,@(fold alist-delete (package-native-inputs icedtea-6) '("openjdk6-src")))) (inputs @@ -953,7 +953,7 @@ build process and its dependencies, whereas Make uses Makefile format.") ,@(package-inputs icedtea-6)))))) (define-public icedtea-8 - (let* ((version "3.1.0") + (let* ((version "3.2.0") (drop (lambda (name hash) (origin (method url-fetch) @@ -962,7 +962,7 @@ build process and its dependencies, whereas Make uses Makefile format.") "/icedtea8/" version "/" name ".tar.xz")) (sha256 (base32 hash)))))) (package (inherit icedtea-7) - (version "3.1.0") + (version "3.2.0") (source (origin (method url-fetch) (uri (string-append @@ -970,7 +970,7 @@ build process and its dependencies, whereas Make uses Makefile format.") version ".tar.xz")) (sha256 (base32 - "1d1kj8a6jbvcbzhmfrx2pca7pinsvpxd7zij9h93g13dmm0ncqbm")) + "104g2x5nhnqqvx6x29phx5vlrhlqy7qax83b9bqj1y619irrg8gj")) (modules '((guix build utils))) (snippet '(substitute* "Makefile.am" @@ -985,6 +985,8 @@ build process and its dependencies, whereas Make uses Makefile format.") "--enable-bootstrap" "--enable-nss" "--disable-downloading" + "--disable-system-pcsc" + "--disable-system-sctp" "--disable-tests" ;they are run in the check phase instead "--with-openjdk-src-dir=./openjdk.src" ,(string-append "--with-jdk-home=" jdk)))) @@ -1038,31 +1040,31 @@ build process and its dependencies, whereas Make uses Makefile format.") `(("jdk" ,icedtea-7 "jdk") ("openjdk-src" ,(drop "openjdk" - "1p6xgf00w754y3xdrccs67gjhb0181q49dk67h5v43aixkx7z7y1")) + "093r3vlmbdx78w9s6d8lv4q65i0s9wq6an6i2g2d1zaf0js4043c")) ("corba-drop" ,(drop "corba" - "088wnyfdhqkvc41pl3swnynbxx7x5lha6qg7q0biai6ya114scsy")) + "11r3h9snnj7m5bqnzc5ryd85igdv7xlwzs0zy24p9ii6gsc0f9lh")) ("jaxp-drop" ,(drop "jaxp" - "18xc4sib85z2zhz4k5lvi5b4vn88zqjpa3wi8gav81vz5gyysn3d")) + "1mp6ps15jk8v4nnvkmbvkk7g35icdjv7892q2a4f7b268yjcgmk1")) ("jaxws-drop" ,(drop "jaxws" - "1my72q2zjly4imn834zgf4rysn48gbr8i81rxzrfdqgzzinxf6l1")) + "1fb5hikzzx8292nhdbp0snqn66fwnnv4rkjsk1zsjvrv4z5vk18j")) ("jdk-drop" ,(drop "jdk" - "1ab2h7pppph82h3xhh1m5dha77j3wnhksq7c7f8yfcsyhr5hm243")) + "1if9c5grp0km7pyn4mhfwi2ynh3ix20l1fqbfcy68sl2py7psmcj")) ("langtools-drop" ,(drop "langtools" - "07bzcw2ml4apjfd0ydc3v44fnnwinwri114fig2mdcn1n388szra")) + "0kbah4h4pllk0gf50mp5f6720f5ci0ixqylccppb484hp95pblcl")) ("hotspot-drop" ,(drop "hotspot" - "0x5ic8cz3w9s8m8ynh31qlf47c6nwc512bp8ddwgmvsdxyiiwn1k")) + "1gqz9qqsi61838dj08s01sa51zlnkvrk3hy721211dhnmkvlzmwx")) ("nashorn-drop" ,(drop "nashorn" - "0zyd8pyv1il8c9npw7wz1mwxhlq510ill20nhc7i8fq7gignzcsn")) + "04697l95g6y6n5dvy55k2040c6qp5hfz16qaibwzs594m3gzwwjz")) ("shenandoah-drop" ,(drop "shenandoah" - "1shisljn60zw9j4nahh07vw85gj25gfiy7z196fdw0pi95va6qwk")) + "0k6h7jk5i98jnld2ivy4bhydmkzrp25c3l6gwhvczvrhn7mlbnfx")) ,@(fold alist-delete (package-native-inputs icedtea-7) '("gcj" "openjdk-src" "corba-drop" "jaxp-drop" "jaxws-drop" "jdk-drop" "langtools-drop" "hotspot-drop"))))))) diff --git a/gnu/packages/kde-frameworks.scm b/gnu/packages/kde-frameworks.scm index d285faecb1..a7f2cabbc4 100644 --- a/gnu/packages/kde-frameworks.scm +++ b/gnu/packages/kde-frameworks.scm @@ -25,6 +25,7 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) + #:use-module (gnu packages) #:use-module (gnu packages acl) #:use-module (gnu packages admin) #:use-module (gnu packages attr) @@ -50,12 +51,13 @@ #:use-module (gnu packages version-control) #:use-module (gnu packages web) #:use-module (gnu packages xml) - #:use-module (gnu packages xorg)) + #:use-module (gnu packages xorg) + #:use-module (srfi srfi-1)) (define-public extra-cmake-modules (package (name "extra-cmake-modules") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -64,13 +66,18 @@ name "-" version ".tar.xz")) (sha256 (base32 - "0n7vw2a4kxdgpsc1wn9f1d0y01p6qfk8ac360rq329bvdpigxmnj")))) + "0yi60qd08x5093wb8dv9cx370iaabn44hzcang92g9ssfmz0zd2h")))) (build-system cmake-build-system) (native-inputs `(("qtbase" ,qtbase))) ; For tests (needs qmake) (arguments `(#:phases (modify-phases %standard-phases + (add-after 'unpack 'fix-lib-path + (lambda _ + ;; Always install into /lib and not into /lib64. + (substitute* "kde-modules/KDEInstallDirs.cmake" + (("\"lib64\"") "\"lib\"")))) ;; install and check phase are swapped to prevent install from failing ;; after testsuire has run (add-after 'install 'check-post-install @@ -185,7 +192,7 @@ common build settings used in software produced by the KDE community.") (define-public attica (package (name "attica") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -194,7 +201,7 @@ common build settings used in software produced by the KDE community.") name "-" version ".tar.xz")) (sha256 (base32 - "0w6dwq83vj70m8rf52x60a64f6s6h0y7c948j3hddfql7s3ghha7")))) + "14v6vi8awk1m58l9svpjd54ckd6milzavgfbkdspsz0km1cpqlks")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -217,7 +224,7 @@ http://freedesktop.org/wiki/Specifications/open-collaboration-services/") (define-public bluez-qt (package (name "bluez-qt") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -226,7 +233,7 @@ http://freedesktop.org/wiki/Specifications/open-collaboration-services/") name "-" version ".tar.xz")) (sha256 (base32 - "111gqxw1bvazdhxk5rcfhi438i6bd92r3wvlkxsdqrp7ypcqdpig")))) + "1rfzwrvvkc5f4l943f4r235gdniqc7njyw4fx36v00daj2r4aqi9")))) (build-system cmake-build-system) (native-inputs `(("dbus" ,dbus) @@ -251,7 +258,7 @@ Bluetooth stack. It is used by the KDE Bluetooth stack, BlueDevil.") (define-public breeze-icons (package (name "breeze-icons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -260,7 +267,7 @@ Bluetooth stack. It is used by the KDE Bluetooth stack, BlueDevil.") name "-" version ".tar.xz")) (sha256 (base32 - "12awfvka9sgdgh7dyg7cw7myw7fxrx1w93s1gyhdq2drjsdbghgz")))) + "06zwg2g0157ac6xsgxs5f8s1sk8rh2j3y057iqmfg2ng2sh9byh2")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -285,7 +292,7 @@ It is the default icon theme for the KDE Plasma 5 desktop.") (define-public kapidox (package (name "kapidox") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -294,7 +301,7 @@ It is the default icon theme for the KDE Plasma 5 desktop.") name "-" version ".tar.xz")) (sha256 (base32 - "193m0qpcqdkspdcwc8cwabjjcqyd9d0m5kl53mycyiv1m220x11l")))) + "1whkl9rzhjnnmpj532d23mlrwhp5wcfxfvq4z4bxyr64g9plbzyq")))) (build-system cmake-build-system) (arguments `(#:tests? #f)) ; has no test target @@ -327,7 +334,7 @@ documentation.") (define-public karchive (package (name "karchive") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -336,7 +343,7 @@ documentation.") name "-" version ".tar.xz")) (sha256 (base32 - "1c7bifmzyr398p1qx9qfxp893wbr44sjn3sda9q0hdpmw2i7yf3z")))) + "1s068z0ih6qk3m4lm10wm28y0nq5qwn4gpnx9vckar51xbrl4bb7")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -361,7 +368,7 @@ GZip format, via a subclass of QIODevice.") (define-public kcodecs (package (name "kcodecs") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -370,7 +377,7 @@ GZip format, via a subclass of QIODevice.") name "-" version ".tar.xz")) (sha256 (base32 - "0f4k276sm0svh5y8yyq8hfc5vy60cpsrwany7kswyh22m57v5j8a")))) + "0r01raiva4iddiz5qqshmbmidgkf4q6illanz6zwmc4n66c6s3q3")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -396,7 +403,7 @@ Internet).") (define-public kconfig (package (name "kconfig") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -405,7 +412,7 @@ Internet).") name "-" version ".tar.xz")) (sha256 (base32 - "18dpm0r4nnvmxrask6rv5dkniwna9hh72ffdnvjgrh8p5djs9szi")))) + "0kdsaqv880wihxv6il8wailmymh0rh0jrbhg8iz2ljf3ir7g56zy")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -463,7 +470,7 @@ propagate their changes to their respective configuration files.") (define-public kcoreaddons (package (name "kcoreaddons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -472,7 +479,7 @@ propagate their changes to their respective configuration files.") name "-" version ".tar.xz")) (sha256 (base32 - "0rzpxajv041kdbk92rwxq1qnvzyrxfjy154d8257yj2fj76w1gnw")))) + "10x2sgd1acsg1kmb741zk8sbss1j9nncfr1ac2pq0fc236ivkiyb")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -502,7 +509,7 @@ many more.") (define-public kdbusaddons (package (name "kdbusaddons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -511,7 +518,8 @@ many more.") name "-" version ".tar.xz")) (sha256 (base32 - "1vgdl9z5xyfr2b5z7n2vdh0s6zab6ccxp30p1cy8hhhrsf04663m")))) + "07mzb1xr8wyiid25p8kg6mjp6vq8ngvv1ikhq75zvd2cbax530c8")) + (patches (search-patches "kdbusaddons-kinit-file-name.patch")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -519,10 +527,18 @@ many more.") ("qttools" ,qttools))) (inputs `(("qtbase" ,qtbase) - ("qtx11extras" ,qtx11extras))) + ("qtx11extras" ,qtx11extras) + ("kinit" ,kinit-bootstrap))) ;; kinit-bootstrap: kinit package which does not depend on kdbusaddons. (arguments `(#:phases (modify-phases %standard-phases + (add-before + 'configure 'patch-source + (lambda* (#:key inputs #:allow-other-keys) + ;; look for the kdeinit5 executable in kinit's store directory, + ;; instead of the current application's directory: + (substitute* "src/kdeinitinterface.cpp" + (("@SUBSTITUTEME@") (assoc-ref inputs "kinit"))))) (replace 'check (lambda _ (setenv "DBUS_FATAL_WARNINGS" "0") @@ -538,7 +554,7 @@ as well as an API to create KDED modules.") (define-public kdnssd (package (name "kdnssd") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -547,7 +563,7 @@ as well as an API to create KDED modules.") name "-" version ".tar.xz")) (sha256 (base32 - "0dq2i4f4ny5cwgd41mjw5i7cf23ns55s2m13cjvxvy90nwhlymqp")))) + "1gkqfcz8glfa6krbayaay4kyq3zazcyr21zjg78la76vfnranh0r")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -565,7 +581,7 @@ infrastructure.") (define-public kguiaddons (package (name "kguiaddons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -574,7 +590,7 @@ infrastructure.") name "-" version ".tar.xz")) (sha256 (base32 - "1skvlcj0fgb4am02vlm4fyd52f9yn4y0aj5arcfz3qps5cjzr6xg")))) + "1f3k6g8cqgq49ka9wsfflp0vnqgk81nlp012lb5v875yil6f9m3f")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -597,7 +613,7 @@ interfaces in the areas of colors, fonts, text, images, keyboard input.") (define-public ki18n (package (name "ki18n") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -606,7 +622,7 @@ interfaces in the areas of colors, fonts, text, images, keyboard input.") name "-" version ".tar.xz")) (sha256 (base32 - "0a66z325bvdv7g6ysml2bf8559nkjhv2fxwj1ja6vsxkn95d54ff")))) + "0ymg8mnpvas101war3pgm3wv8ssf1wxa6mxg9ym1xx24mx7xzhzw")))) (build-system cmake-build-system) (propagated-inputs `(("gettext" ,gettext-minimal) @@ -640,7 +656,7 @@ translation scripting.") (define-public kidletime (package (name "kidletime") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -649,7 +665,7 @@ translation scripting.") name "-" version ".tar.xz")) (sha256 (base32 - "1cv6d2vylz7vymn4v0brv2jp1kzscvm9wh1ylp3wyi1jqyblgjfw")))) + "0cwq8jvsimxriiazivls8yix9jyglk2giqwv34a1ic1cnackhwq7")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -667,7 +683,7 @@ or user activity.") (define-public kitemmodels (package (name "kitemmodels") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -676,7 +692,7 @@ or user activity.") name "-" version ".tar.xz")) (sha256 (base32 - "00qgp5i35r7k9gy43wypn9fa7zxiqqip89dzbw8r6rabinihqzy2")))) + "0zi7wsqcmjd7fms8r2vqvwwvzw75p275qyn6whpgblb09l0pn78z")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -728,7 +744,7 @@ model to observers (define-public kitemviews (package (name "kitemviews") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -737,7 +753,7 @@ model to observers name "-" version ".tar.xz")) (sha256 (base32 - "1469i10y2c3i1pdhzl9nk177y4n1mlc7p5w7kivdcrvf9ilxvbkx")))) + "0wrlwawgnz1yjav4hfirc3lcki0hqy0cgr8bwhr9nhm27ndgv28p")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -769,7 +785,7 @@ to flat and hierarchical lists.") (define-public kplotting (package (name "kplotting") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -778,7 +794,7 @@ to flat and hierarchical lists.") name "-" version ".tar.xz")) (sha256 (base32 - "1qp9q8g9yxy359bylyqyqxjq9wjismajrg4xhxx5xn4s6znyrxny")))) + "1vmwxj03qhrfnz3jg30ka28afpqg0hlgm46dbzyg86kg8hc2hgb2")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -804,10 +820,61 @@ data being plotted. KPlotWidget automatically converts everything to screen pixel units.") (license license:lgpl2.1+))) +(define-public ksyntaxhighlighting + (package + (name "ksyntaxhighlighting") + (version "5.28.0") + (source (origin + (method url-fetch) + (uri (string-append + "mirror://kde/stable/frameworks/" + (version-major+minor version) "/" + "syntax-highlighting-" version ".tar.xz")) + (sha256 + (base32 + "0gf1ldlk4gav6bg5b1231hphaal4simyngirvr1yizcb1rrlygdy")))) + (build-system cmake-build-system) + (native-inputs + `(("extra-cmake-modules" ,extra-cmake-modules) + ("perl" ,perl) + ;; Optional, for compile-time validation of syntax definition files: + ("qtxmlpatterns" ,qtxmlpatterns))) + (inputs + `(("qtbase" ,qtbase))) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'patch-source-shebangs 'unpatch-source-shebang + (lambda _ + ;; revert the patch-shebang phase on scripts which are + ;; in fact test data + (substitute* '("autotests/input/test.bash" + "autotests/folding/test.bash.fold") + (((which "bash")) "/bin/bash")) + (substitute* '("autotests/input/highlight.sh" + "autotests/folding/highlight.sh.fold") + (((which "sh")) " /bin/sh")) ;; space in front! + (substitute* '("autotests/input/highlight.pl" + "autotests/folding/highlight.pl.fold") + (((which "perl")) "/usr/bin/perl")) + #t)) + (add-before 'check 'check-setup + (lambda _ + (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; enable debug info + #t))))) + (home-page "https://community.kde.org/Frameworks") + (synopsis "Syntax highlighting engine for Kate syntax definitions") + (description "This is a stand-alone implementation of the Kate syntax +highlighting engine. It's meant as a building block for text editors as well +as for simple highlighted text rendering (e.g. as HTML), supporting both +integration with a custom editor as well as a ready-to-use +@code{QSyntaxHighlighter} sub-class.") + (license license:lgpl2.1+))) + (define-public kwayland (package (name "kwayland") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -816,7 +883,7 @@ pixel units.") name "-" version ".tar.xz")) (sha256 (base32 - "0va1kmki2xr4mx2918h333mfkqs5v1mhbzyf71hq190izdz0jdss")))) + "0xm4agsv8hyx8aaiv4zpa121s08ayhbps3pbfbds2ckk57k6ba8k")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -846,7 +913,7 @@ represented by a QPoint or a QSize.") (define-public kwidgetsaddons (package (name "kwidgetsaddons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -855,7 +922,7 @@ represented by a QPoint or a QSize.") name "-" version ".tar.xz")) (sha256 (base32 - "0p9gxna7y7nigpi0ri7k45g4pf1svq0kxrhk4wf7rj58rilhcfrl")))) + "1p22s1cbwpwbm03qxs0wqb1i7w1s19b119diwkmb8xl90cqfdwnn")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -894,7 +961,7 @@ configuration pages, message boxes, and password requests.") (define-public kwindowsystem (package (name "kwindowsystem") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -903,7 +970,7 @@ configuration pages, message boxes, and password requests.") name "-" version ".tar.xz")) (sha256 (base32 - "0w49lpwicl71gyyf2aisvmfjpvjl3w1rqpx4a42ph0aywjihjmhx")))) + "0lzafiwj58gg5vccnvwrhiwjq67y8cn3gllirgw13vz3f69sbr3i")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -934,7 +1001,7 @@ lower level classes for interaction with the X Windowing System.") (define-public modemmanager-qt (package (name "modemmanager-qt") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -943,7 +1010,7 @@ lower level classes for interaction with the X Windowing System.") name "-" version ".tar.xz")) (sha256 (base32 - "1zw5frscvbsp0jpb071ssqgvm097ylw3zy69y7f0dybhps6lv2jv")))) + "1yfqqp596srvsi0yqrkpm5gzlwjf4szk6hy0wszr12gjjzqprilq")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -972,7 +1039,7 @@ messages.") (define-public networkmanager-qt (package (name "networkmanager-qt") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -981,7 +1048,7 @@ messages.") name "-" version ".tar.xz")) (sha256 (base32 - "0fnj0b2j4v51f12b3v59psdza2krdkidj22b9a9jwn224lg4852y")))) + "1iq8xrw55k2k9af57l4lfrw72gjxgk7pp7k3m7amjfp0hdqw8602")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1011,7 +1078,7 @@ which are used in DBus communication.") (define-public oxygen-icons (package (name "oxygen-icons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1020,7 +1087,7 @@ which are used in DBus communication.") name "5" "-" version ".tar.xz")) (sha256 (base32 - "1lb09ykj5ayj5lv7w2k2pqis7z61clr3gkinf6n7jghnlc96222g")))) + "05bypc4k86lsjp7d4lpbpsnms7k1gnjyahdbks420585ca0v4qkp")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1030,12 +1097,13 @@ which are used in DBus communication.") (home-page "https://community.kde.org/Frameworks") (synopsis "Oxygen provides the standard icon theme for the KDE desktop") (description "Oxygen icon theme for the KDE desktop") - (license license:lgpl3+))) + (license license:lgpl3+) + (properties '((upstream-name . "oxygen-icons5"))))) (define-public solid (package (name "solid") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1044,7 +1112,7 @@ which are used in DBus communication.") name "-" version ".tar.xz")) (sha256 (base32 - "01qlfj30n8sr8xd8l8fimg7hs7h70ynhalk2m9l8dz2qay2pdl27")))) + "0g6frc7hckbkvzgq40qrymllgp56a3v39l5d2ajqipwb4kabhdpy")))) (build-system cmake-build-system) (native-inputs `(("bison" ,bison) @@ -1064,7 +1132,7 @@ system.") (define-public sonnet (package (name "sonnet") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1073,7 +1141,7 @@ system.") name "-" version ".tar.xz")) (sha256 (base32 - "07i3gng309vsf5kp5dlwca0lpi3iqc0lp0ixdvx75q832gk8ivrv")))) + "1vzn3kvi126jnkq2s5110yii8946kaxp452735fx0l0jqjn92dy8")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1090,7 +1158,7 @@ ASpell and HUNSPELL.") (define-public threadweaver (package (name "threadweaver") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1099,7 +1167,7 @@ ASpell and HUNSPELL.") name "-" version ".tar.xz")) (sha256 (base32 - "0mg5i125b008x6162a5h2q14fg81m17md00017n09xljw3099kqy")))) + "10hy4pvw84l2z8778gsfv5i8pqrfjidvlgd5rc8xffx65s3f28b5")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1120,7 +1188,7 @@ uses a job-based interface to queue tasks and execute them in an efficient way." (define-public kauth (package (name "kauth") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1129,7 +1197,7 @@ uses a job-based interface to queue tasks and execute them in an efficient way." name "-" version ".tar.xz")) (sha256 (base32 - "17z6dh1qdpd490z84g6ynl8bcrr9naalvh34ybnpipvx3qs50kwl")))) + "09m7dipkykw75dbka6mhsvrikbniwshl1l0qxcny3ywc0fkzgf40")))) (build-system cmake-build-system) (native-inputs `(("dbus" ,dbus) @@ -1142,6 +1210,17 @@ uses a job-based interface to queue tasks and execute them in an efficient way." (arguments `(#:phases (modify-phases %standard-phases + (add-after 'unpack 'fix-cmake-install-directories + (lambda _ + ;; Make packages using kauth put their policy files and helpers + ;; into their own prefix. + (substitute* "KF5AuthConfig.cmake.in" + (("@KAUTH_POLICY_FILES_INSTALL_DIR@") + "${KDE_INSTALL_DATADIR}/polkit-1/actions") + (("@KAUTH_HELPER_INSTALL_DIR@") + "${KDE_INSTALL_LIBEXECDIR}") + (("@KAUTH_HELPER_INSTALL_ABSOLUTE_DIR@") + "${KDE_INSTALL_LIBEXECDIR}")))) (replace 'check (lambda _ (setenv "DBUS_FATAL_WARNINGS" "0") @@ -1156,7 +1235,7 @@ utilities.") (define-public kcompletion (package (name "kcompletion") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1165,7 +1244,7 @@ utilities.") name "-" version ".tar.xz")) (sha256 (base32 - "1mb64ii4ilhqhy9p6cl3phs17bg3lr4b60jkkm71yn2wnd4wl47s")))) + "1yrlhf6n7xlkid3xbpirf8n6kybc3sqp5fnb01kr1rcl89qs273f")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1192,7 +1271,7 @@ integrated it into your application's other widgets.") (define-public kcrash (package (name "kcrash") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1201,7 +1280,7 @@ integrated it into your application's other widgets.") name "-" version ".tar.xz")) (sha256 (base32 - "09wf4dzckc9l8dyl8qs1wc54h4rm38i2blzyyicm4iazi420lysk")))) + "0gsly5wvyh0d6yfk5yyv1pgaazwlwvahz245y9sliwzrbxhgj1yv")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1230,7 +1309,7 @@ application crashes.") (define-public kdoctools (package (name "kdoctools") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1239,7 +1318,7 @@ application crashes.") name "-" version ".tar.xz")) (sha256 (base32 - "1hgg19da0918mx8z2614qljvj9j8bny78mwlyljf42814f3ycpam")))) + "1mndmxy7vgdkii8axzkzclqqimg0ksn2dmwiqsljcjcik0zfx47c")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1278,7 +1357,7 @@ from DocBook files.") (define-public kfilemetadata (package (name "kfilemetadata") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1287,7 +1366,7 @@ from DocBook files.") name "-" version ".tar.xz")) (sha256 (base32 - "1la6h05izgnps10py2gcn4xnwz3fm7dyswib57flc8phzipxbg5q")))) + "0sxifxzyqq0haxfira8ldq9gwali7p5vbbh8jslj8wlxm0dczyw6")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1308,7 +1387,7 @@ by applications to write metadata.") (define-public kimageformats (package (name "kimageformats") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1317,7 +1396,7 @@ by applications to write metadata.") name "-" version ".tar.xz")) (sha256 (base32 - "0ijy7di9p37l6fjrmsday402vq4zibq1m37jghkvdymawxcrd22h")))) + "1h17jm55r9ijmng5mb1w9nqk2hw6h965j9c2nrd8wl9dzy616kra")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1345,7 +1424,7 @@ formats.") (define-public kjobwidgets (package (name "kjobwidgets") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1354,7 +1433,7 @@ formats.") name "-" version ".tar.xz")) (sha256 (base32 - "05c6jzl2a37bfz5i7hzsjmrhh8ajx1gbz7j05wgal811m5m4ww8l")))) + "0xh62bjd6qqbmx1jbv9qac1ng0h056mwrs8rkdqd8k10ghmsfx6a")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1373,7 +1452,7 @@ asynchronous jobs.") (define-public knotifications (package (name "knotifications") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1382,7 +1461,7 @@ asynchronous jobs.") name "-" version ".tar.xz")) (sha256 (base32 - "09v122nxfgqjzr2azfn2nh4q9l22i5wnsz9prs0i7s3m7y0d7pxn")))) + "1a55c0abs9yg7qaajgidj8bmfbwkysf24300532lnia71n1ms25s")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1416,7 +1495,7 @@ covers feedback and persistent events.") (define-public kpackage (package (name "kpackage") - (version "5.27.0") + (version "5.28.1") (source (origin (method url-fetch) (uri (string-append @@ -1425,7 +1504,7 @@ covers feedback and persistent events.") name "-" version ".tar.xz")) (sha256 (base32 - "0y07zh8ryibm69ljp9f169qfal6r4lngz1ljxgrr6qw15cjkjygk")))) + "0ym5fhhigp7argk7c1zyn2fvfjykgxh3miipidf142c8y3d98vbp")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1454,7 +1533,7 @@ were traditional plugins.") (define-public kpty (package (name "kpty") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1463,7 +1542,7 @@ were traditional plugins.") name "-" version ".tar.xz")) (sha256 (base32 - "06pka8cbw6a9rk2j5pkz34rfy10bv6il3wqyf7ala32ynv5rcgc3")))) + "1q22wzx5xpmbj56xg4miiscb1xqqk2lfkljfdi87zl05vwmnc7hn")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1491,7 +1570,7 @@ and communicating with them using a pty.") (define-public kunitconversion (package (name "kunitconversion") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1500,7 +1579,7 @@ and communicating with them using a pty.") name "-" version ".tar.xz")) (sha256 (base32 - "11rn6813jz7clb6fjp9nbdg1c350zh0yiprbr053wkdjrb3aca7c")))) + "0n6ndy1yarilnk2l09h92qk32v02hknafif1i9mmwcibldvc963q")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1524,7 +1603,7 @@ gallons).") (define-public baloo (package (name "baloo") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1533,7 +1612,7 @@ gallons).") name "-" version ".tar.xz")) (sha256 (base32 - "0dqa5sxz2z440h6zry7s1x0r1d919qky69i5fv2nir7y844xx2cc")))) + "071in785y1qplm59fmsmifzbmczvlvkf5gxdb6d0iw93pb36r7h5")))) (build-system cmake-build-system) (propagated-inputs `(("kcoreaddons" ,kcoreaddons) @@ -1581,7 +1660,7 @@ maintaining an index of the contents of your files.") (define-public kactivities (package (name "kactivities") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1590,7 +1669,7 @@ maintaining an index of the contents of your files.") name "-" version ".tar.xz")) (sha256 (base32 - "08x07rlf2gff1j9jahznz2838919vab1ay8jppz3bp5kywx104yk")))) + "162ilqcfp8b3lb3gpzbw94ppsdqzn6i6ymiwh12xy5nrxixdpagb")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1628,7 +1707,7 @@ with other frameworks.") (define-public kactivities-stats (package (name "kactivities-stats") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1637,7 +1716,7 @@ with other frameworks.") name "-" version ".tar.xz")) (sha256 (base32 - "134a3zgasza9wghp1lkiaar3sakag7vn82pm2kcrmr420a0jigsw")))) + "0pjgjl5bwmq0n23nwcqjp3b412fsibnvwsr3s3l67k9scmdpbm4v")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1658,7 +1737,7 @@ by which applications, and what documents have been linked to which activity.") (define-public kbookmarks (package (name "kbookmarks") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1667,7 +1746,7 @@ by which applications, and what documents have been linked to which activity.") name "-" version ".tar.xz")) (sha256 (base32 - "1lb20yn8s27h0965yf6w4v4wwlm80bl24mpsksp01z9f0711j8vm")))) + "1lfvps0xzpzn42n7rpsdcmsiryclykz6h1hk8sp6nsbhqwzd0r65")))) (build-system cmake-build-system) (propagated-inputs `(("kwidgetsaddons" ,kwidgetsaddons))) @@ -1700,7 +1779,7 @@ using the XBEL format.") (define-public kcmutils (package (name "kcmutils") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1709,7 +1788,7 @@ using the XBEL format.") name "-" version ".tar.xz")) (sha256 (base32 - "04nbd0836azs2i0pq8hq8ljnmfc45mqs022zdn84xd2q3npl3hfx")))) + "0wj3f5ykzb7q9536y9wk8mnfcb6zay2mmc25dg67mdznzwdy36aa")))) (build-system cmake-build-system) (propagated-inputs `(("kconfigwidgets" ,kconfigwidgets) @@ -1739,7 +1818,7 @@ KCModules can be created with the KConfigWidgets framework.") (define-public kconfigwidgets (package (name "kconfigwidgets") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1748,7 +1827,7 @@ KCModules can be created with the KConfigWidgets framework.") name "-" version ".tar.xz")) (sha256 (base32 - "0sbhirfsjmsxiwaqqh5jh85bhwmij93gj5knnb0bs0al4hy29918")))) + "0cy53jaq15n8hw2m67l0y6x722ywg0ijfz5ak5vq3fjjhc9fmq8d")))) (build-system cmake-build-system) (propagated-inputs `(("kauth" ,kauth) @@ -1780,7 +1859,7 @@ their settings.") (define-public kdeclarative (package (name "kdeclarative") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1789,7 +1868,7 @@ their settings.") name "-" version ".tar.xz")) (sha256 (base32 - "1a8pqwrwgmzarinhr9xxviqh9417p8icj8lwqg9ly0q0j3yv20dh")))) + "1g7bf3smdiwgfhdzwskp3l7l4bn838q1cdy4hp9mzqdssz956wmn")))) (build-system cmake-build-system) (propagated-inputs `(("kconfig" ,kconfig) @@ -1840,7 +1919,7 @@ that offer bindings to some of the Frameworks.") (define-public kded (package (name "kded") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1849,7 +1928,7 @@ that offer bindings to some of the Frameworks.") name "-" version ".tar.xz")) (sha256 (base32 - "14f4qxia9p3vynv2ch9rs67zaxn9kpbas0fn0vwag1ikxb8qz0c2")))) + "115ywk3vdyhwzna59bpiqfffcc128vafl823yh5fzkwbp8w7qdn5")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -1873,7 +1952,7 @@ started on demand.") (define-public kdesignerplugin (package (name "kdesignerplugin") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1882,7 +1961,7 @@ started on demand.") name "-" version ".tar.xz")) (sha256 (base32 - "157lny5v8js63nvw2iyc9j4cinqmyj75a389s46n8wqyygrz5v0v")))) + "12v9pbfniljp23bllxxq6hfv6qnp2q8yjsix6fy6hwf8yrsq42m3")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -1910,7 +1989,7 @@ ini-style description files.") (define-public kdesu (package (name "kdesu") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1919,7 +1998,7 @@ ini-style description files.") name "-" version ".tar.xz")) (sha256 (base32 - "1l501z102ygibz4000jnngm0cggh2kaf6hzra1ngv5nxqxzkh31a")))) + "1f6awbnqs14si13n1ryibb0z3mj90bg0vk320hgabd2zxma00vwp")))) (build-system cmake-build-system) (propagated-inputs `(("kpty" ,kpty))) @@ -1941,7 +2020,7 @@ with su and ssh respectively.") (define-public kemoticons (package (name "kemoticons") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1950,7 +2029,7 @@ with su and ssh respectively.") name "-" version ".tar.xz")) (sha256 (base32 - "0rjw2g3lfdxiy56x61d0sdcmcs8rml6h29a05fp6xww2bqcvr9wq")))) + "10qxm9q7bsbbg419f8d0703mikd8w99a8fh501fpm3sgh6k7pbyv")))) (build-system cmake-build-system) (propagated-inputs `(("kservice" ,kservice))) @@ -1982,7 +2061,7 @@ emoticons coming from different providers.") (define-public kglobalaccel (package (name "kglobalaccel") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -1991,7 +2070,7 @@ emoticons coming from different providers.") name "-" version ".tar.xz")) (sha256 (base32 - "1z2knfxcla1f191cifij1fzw88b076yx6qjxraqfsmkc6g6i2bmj")))) + "0a60f2bs7dhx0rsrgva2p97dcala6jrjfg4z2nv0m4bv82i4kchc")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -2024,7 +2103,7 @@ window does not need focus for them to be activated.") (define-public kiconthemes (package (name "kiconthemes") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2033,7 +2112,7 @@ window does not need focus for them to be activated.") name "-" version ".tar.xz")) (sha256 (base32 - "0m70vcrxp0vvqw5grlsn19d2hgdhky8iv2pr0xwzw8v5yrnl1hh2")))) + "1i5cpsqfn1vcch8izbrgig2km580gdxf02qmib4ynbwzcfvrnbqc")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules) @@ -2072,7 +2151,7 @@ in applications using the KDE Frameworks.") (define-public kinit (package (name "kinit") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2081,7 +2160,7 @@ in applications using the KDE Frameworks.") name "-" version ".tar.xz")) (sha256 (base32 - "0sbpl1sp1ajarjmnvx2l3dr09afsay28kp2sf4yacrm4lrmhwzip")))) + "0hwa4anljh5v53gswziacwr6ryvhp136k6y85d10074lrckdr912")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -2116,7 +2195,7 @@ makes starting KDE applications faster and reduces memory consumption.") (define-public kio (package (name "kio") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2125,7 +2204,7 @@ makes starting KDE applications faster and reduces memory consumption.") name "-" version ".tar.xz")) (sha256 (base32 - "129sglaw1480v3i1xdyv6k1w3spbj8s00rkdr5mzlcdaqiig69rn")))) + "1hqc88c2idi9fkb7jy82csb0i740lghv0p2fg1gaglcarjdz7nia")))) (build-system cmake-build-system) (propagated-inputs `(("kbookmarks" ,kbookmarks) @@ -2189,7 +2268,7 @@ KIO enabled infrastructure.") (define-public knewstuff (package (name "knewstuff") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2198,7 +2277,7 @@ KIO enabled infrastructure.") name "-" version ".tar.xz")) (sha256 (base32 - "05ikb7cvyx3cmrrjh2ss6439a49vmzbi3chjj23ffdz2nd2k7r2f")))) + "0p5a6zprqfnhiim0l0qigjy7kky0m4w2nykhllwvr6lda1rg8qs3")))) (build-system cmake-build-system) (propagated-inputs `(("attica" ,attica) @@ -2245,7 +2324,7 @@ specification.") (define-public knotifyconfig (package (name "knotifyconfig") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2254,7 +2333,7 @@ specification.") name "-" version ".tar.xz")) (sha256 (base32 - "088p19ynjs79zf7mq3gkds93dg72jj8pfya53xyhzdg8s6vyns9n")))) + "0riia9lvp33lqh8ld5r1r0adnfnxikbvmdi4k7kfc4pzra93h10f")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -2287,7 +2366,7 @@ notifications which can be embedded in your application.") (define-public kparts (package (name "kparts") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2296,7 +2375,7 @@ notifications which can be embedded in your application.") name "-" version ".tar.xz")) (sha256 (base32 - "0rfsyr96s59ljp3jgmcwlvwzbgmlx7fvr62xswwmsnb8ah14k5rh")))) + "1jghgddgz0ghq6n51l1i6jc1s10g0ckda5nlwh4myziv229g9pik")))) (build-system cmake-build-system) (propagated-inputs `(("kio" ,kio) @@ -2337,7 +2416,7 @@ widgets with a user-interface defined in terms of actions.") (define-public kpeople (package (name "kpeople") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2346,7 +2425,7 @@ widgets with a user-interface defined in terms of actions.") name "-" version ".tar.xz")) (sha256 (base32 - "1w6sbd6djcpv36m9my4drqkrs1l3cryshpz1dx9z8p7afr296n8j")))) + "0dqz6varz3nrnp8jfysdsp2r2mm46hn3vfcqcyyqk3nmv6sd9mpp")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -2380,7 +2459,7 @@ to easily extend the contacts collection.") (define-public krunner (package (name "krunner") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2389,7 +2468,7 @@ to easily extend the contacts collection.") name "-" version ".tar.xz")) (sha256 (base32 - "1yyxyippmn0d9ycj1hdjvhl1zd31yxwg89a9zwmj8v8gdfr9flj9")))) + "1mmbrpgw090z41l2vg350hmm3ya2qkfkjmq7v5d90jpb7z7y6pr9")))) (build-system cmake-build-system) (propagated-inputs `(("plasma-framework" ,plasma-framework))) @@ -2435,7 +2514,7 @@ typed.") (define-public kservice (package (name "kservice") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2444,7 +2523,7 @@ typed.") name "-" version ".tar.xz")) (sha256 (base32 - "129bjdr272qkz2inmagy8jnxasifrl4d82x8rp9akfar29qsj6x6")))) + "0mlc3vw0vq1rwcg803dsybzlwxj1n6hg13z9sg0h28wsbyss3l4l")))) (build-system cmake-build-system) (propagated-inputs `(("kconfig" ,kconfig) @@ -2480,7 +2559,7 @@ types or handled by application specific code.") (define-public ktexteditor (package (name "ktexteditor") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2489,7 +2568,7 @@ types or handled by application specific code.") name "-" version ".tar.xz")) (sha256 (base32 - "127wp4dg72skd6abn2vqffxg91bn59z8yxwy6lxyzvck2pc5v1ss")))) + "1sl152xasbhgpph4f6apkc54b26smgxbd3cxbvch2hfi5cxgb8fq")))) (build-system cmake-build-system) (propagated-inputs `(("kparts" ,kparts))) @@ -2547,7 +2626,7 @@ library.") (define-public ktextwidgets (package (name "ktextwidgets") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2556,7 +2635,7 @@ library.") name "-" version ".tar.xz")) (sha256 (base32 - "0aq2qx64wylxj5q5sr0dxv9h8bmn725llxyi7iwz31dg2ngfr7m4")))) + "0gwjb0isjfrqd15lvln6bwql1lpk2r1vp5f72zxygz2ay8ar1wxp")))) (build-system cmake-build-system) (propagated-inputs `(("ki18n" ,ki18n) @@ -2592,7 +2671,7 @@ It supports rich text as well as plain text.") (define-public kwallet (package (name "kwallet") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2601,7 +2680,7 @@ It supports rich text as well as plain text.") name "-" version ".tar.xz")) (sha256 (base32 - "1mlrkzvbqk6r43yqrvv6jsc66brzjd321fp7mg7g3ny47va7hbc2")))) + "0n25mvjwy3sv5bg2x75psz6d6f8yl53j3wfmx9ayh57jk4rq24rm")))) (build-system cmake-build-system) (native-inputs `(("extra-cmake-modules" ,extra-cmake-modules))) @@ -2633,7 +2712,7 @@ the passwords on KDE work spaces.") (define-public kxmlgui (package (name "kxmlgui") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2642,7 +2721,7 @@ the passwords on KDE work spaces.") name "-" version ".tar.xz")) (sha256 (base32 - "0hf55ip2irbsbg59r36njgb0h5ygpaspa4x6jfyi4bxj852c3hw1")))) + "0plw6fckpssgwf18f5i4vhfp55jmdvfh2rc5lg8fwmlqgqkvrbac")))) (build-system cmake-build-system) (propagated-inputs `(("kconfig" ,kconfig) @@ -2685,7 +2764,7 @@ descriptions for integrating actions from plugins.") (define-public kxmlrpcclient (package (name "kxmlrpcclient") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2694,7 +2773,7 @@ descriptions for integrating actions from plugins.") name "-" version ".tar.xz")) (sha256 (base32 - "17bavm8qj4r1kc67x5g20v1pl8arjqpn69hg7icp2b1b0vnfvav1")))) + "1xrdh5ipldahcv0pxp7dnzjz1ihnkg4r2hpylg6bwvq81clw8xd1")))) (build-system cmake-build-system) (propagated-inputs `(("kio" ,kio))) @@ -2728,7 +2807,7 @@ setUrl, setUserAgent and call.") (define-public plasma-framework (package (name "plasma-framework") - (version "5.27.0") + (version "5.28.0") (source (origin (method url-fetch) (uri (string-append @@ -2737,7 +2816,7 @@ setUrl, setUserAgent and call.") name "-" version ".tar.xz")) (sha256 (base32 - "11apg7h636dshswikjpz0qkapv8izqjjz47k7vs49x0byp802s5i")))) + "0j4mfd8wzrspvyy281lww981fly2rkbhnixb9b0pj5k9i8gvkh7q")))) (build-system cmake-build-system) (propagated-inputs `(("kpackage" ,kpackage) @@ -2790,3 +2869,22 @@ setUrl, setUserAgent and call.") script engines.") ;; dual licensed (license (list license:gpl2+ license:lgpl2.1+)))) + +;; This version of kdbusaddons does not use kinit as an input, and is used to +;; build kinit-bootstrap, as well as bootstrap versions of all kinit +;; dependencies which also rely on kdbusaddons. +(define kdbusaddons-bootstrap + (package + (inherit kdbusaddons) + (source (origin + (inherit (package-source kdbusaddons)) + (patches '()))) + (inputs (alist-delete "kinit" (package-inputs kdbusaddons))) + (arguments + (substitute-keyword-arguments (package-arguments kdbusaddons) + ((#:phases phases) + `(modify-phases ,phases + (delete 'patch-source))))))) + +(define kinit-bootstrap + ((package-input-rewriting `((,kdbusaddons . ,kdbusaddons-bootstrap))) kinit)) diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm index 82e7ed2cc7..db8609a645 100644 --- a/gnu/packages/kde.scm +++ b/gnu/packages/kde.scm @@ -23,10 +23,101 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) + #:use-module (gnu packages apr) + #:use-module (gnu packages boost) + #:use-module (gnu packages compression) + #:use-module (gnu packages documentation) + #:use-module (gnu packages gl) + #:use-module (gnu packages gnome) #:use-module (gnu packages kde-frameworks) + #:use-module (gnu packages llvm) #:use-module (gnu packages pkg-config) #:use-module (gnu packages tls) - #:use-module (gnu packages qt)) + #:use-module (gnu packages qt) + #:use-module (gnu packages version-control)) + +(define-public kdevelop + (package + (name "kdevelop") + (version "5.0.2") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://kde/stable/kdevelop" + "/" version "/src/kdevelop-" + version ".tar.xz")) + (sha256 + (base32 + "0rl6csmzf14gf0r0mk7z2lj7cq8fggf5qmlbxq6j68vp2q0pj0cv")))) + (build-system cmake-build-system) + (native-inputs + `(("extra-cmake-modules" ,extra-cmake-modules) + ("pkg-config" ,pkg-config) + ("qttools" ,qttools))) + (inputs + `(("kdevplatform" ,kdevplatform) + ("kdevelop-pg-qt" ,kdevelop-pg-qt) + ("qtbase" ,qtbase) + ("qtdeclarative" ,qtdeclarative) + ("qtquickcontrols" ,qtquickcontrols) + ("qtwebkit" ,qtwebkit) + ("karchive" ,karchive) + ("kcmutils" ,kcmutils) + ("kconfig" ,kconfig) + ("kdeclarative" ,kdeclarative) + ("kdoctools" ,kdoctools) + ("kguiaddons" ,kguiaddons) + ("ki18n" ,ki18n) + ("kio" ,kio) + ("kiconthemes" ,kiconthemes) + ("kitemmodels" ,kitemmodels) + ("kitemviews" ,kitemviews) + ("kjobwidgets" ,kjobwidgets) + ("knotifyconfig" ,knotifyconfig) + ("knotifications" ,knotifications) + ("kparts" ,kparts) + ("kcrash" ,kcrash) + ("knewstuff" ,knewstuff) + ("krunner" ,krunner) + ("kxmlgui" ,kxmlgui) + ("libksysguard" ,libksysguard) + ("threadweaver" ,threadweaver) + ("ktexteditor" ,ktexteditor) + ("kwindowsystem" ,kwindowsystem) + ("plasma" ,plasma-framework) + ("grantlee" ,grantlee) + ("libepoxy" ,libepoxy) + ("clang" ,clang) + ("shared-mime-info" ,shared-mime-info))) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'check) ;; there are some issues with the test suite + (add-after 'install 'wrap-executable + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (kdevplatform (assoc-ref inputs "kdevplatform")) + (kio (assoc-ref inputs "kio")) + (qtquickcontrols (assoc-ref inputs "qtquickcontrols")) + (qtdeclarative (assoc-ref inputs "qtdeclarative")) + (plugins "/lib/plugins") + (qml "/qml")) + (wrap-program (string-append out "/bin/kdevelop") + `("QT_PLUGIN_PATH" ":" prefix + (,(string-append out plugins) + ,(string-append kdevplatform plugins) + ,(string-append kio plugins))) + `("QML2_IMPORT_PATH" ":" prefix + (,(string-append qtquickcontrols qml) + ,(string-append qtdeclarative qml)))))))))) + (home-page "https://kdevelop.org") + (synopsis "IDE for C, C++, Python, Javascript and PHP") + (description "The KDevelop IDE provides semantic syntax highlighting, as +well as code navigation and completion for C, C++ (using Clang/LLVM), QML, +JavaScript, Python and PHP. It also integrates with a debugger, different +build systems (CMake, QMake, custom Makefiles) and version control +software (Git, Subversion, Mercurial, CVS and Bazaar).") + (license license:lgpl2.1+))) (define-public kdevelop-pg-qt (package @@ -51,6 +142,79 @@ for some KDevelop language plugins (Ruby, PHP, CSS...).") (license license:lgpl2.0+))) +(define-public kdevplatform + (package + (name "kdevplatform") + (version "5.0.2") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/KDE/kdevplatform/archive/v" + version ".tar.gz")) + (sha256 + (base32 + "1m8c0ixv91diyy9bvq53d4jik4zrnf7bix7clad4ywxnlpcs4ahr")) + (file-name (string-append name "-" version ".tar.gz")))) + (build-system cmake-build-system) + (native-inputs + `(("extra-cmake-modules" ,extra-cmake-modules) + ("pkg-config" ,pkg-config))) + (inputs + `(("apr" ,apr) + ("apr-util" ,apr-util) + ("boost" ,boost) + ("karchive" ,karchive) + ("kconfigwidgets" ,kconfigwidgets) + ("kcmutils" ,kcmutils) + ("kiconthemes" ,kiconthemes) + ("kdeclarative" ,kdeclarative) + ("kdoctools" ,kdoctools) + ("kguiaddons" ,kguiaddons) + ("kinit" ,kinit) + ("kitemmodels" ,kitemmodels) + ("knewstuff" ,knewstuff) + ("knotifications" ,knotifications) + ("knotifyconfig" ,knotifyconfig) + ("kwindowsystem" ,kwindowsystem) + ("kio" ,kio) + ("ki18n" ,ki18n) + ("kparts" ,kparts) + ("kservice" ,kservice) + ("grantlee" ,grantlee) + ("libkomparediff2" ,libkomparediff2) + ("sonnet" ,sonnet) + ("threadweaver" ,threadweaver) + ("ktexteditor" ,ktexteditor) + ("qtbase" ,qtbase) + ("qtdeclarative" ,qtdeclarative) + ("qtscript" ,qtscript) + ("qtwebkit" ,qtwebkit) + ("qtx11extras" ,qtx11extras) + ("plasma" ,plasma-framework) + ("subversion" ,subversion) + ("zlib" ,zlib))) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'check) + (add-after 'install 'check ;; add-after 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (setenv "CTEST_OUTPUT_ON_FAILURE" "1") + (setenv "QT_PLUGIN_PATH" + (string-append out "/lib/plugins:" + (getenv "QT_PLUGIN_PATH"))) + (setenv "XDG_DATA_DIRS" + (string-append out "/share:" + (getenv "XDG_DATA_DIRS"))) + (zero? + (system* "ctest" "-R" ;; almost all tests require a display + "filteringstrategy|kdevvarlengtharray|kdevhash")))))))) + (home-page "https://github.com/KDE/kdevplatform") + (synopsis "Framework to build integrated development environments (IDEs)") + (description "KDevPlatform is the basis of KDevelop and contains some +plugins, as well as code to create plugins, or complete applications.") + (license license:gpl3+))) + (define-public libkomparediff2 (package (name "libkomparediff2") @@ -85,6 +249,59 @@ used in KDE development tools Kompare and KDevelop.") ;; source archive (license (list license:gpl2+ license:lgpl2.0+ license:bsd-3)))) +(define-public libksysguard + (package + (name "libksysguard") + (version "5.8.2") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://kde//stable/plasma/" version + "/libksysguard-" version ".tar.xz")) + (sha256 + (base32 + "158n30wbpsgbw3axhhsc58hnwhwdd02j3zc9hhcybmnbkfl5c96l")))) + (native-inputs + `(("extra-cmake-modules" ,extra-cmake-modules) + ("pkg-config" ,pkg-config))) + (inputs + `(("kconfigwidgets" ,kconfigwidgets) + ("kiconthemes" ,kiconthemes) + ("kwindowsystem" ,kwindowsystem) + ("ki18n" ,ki18n) + ("kauth" ,kauth) + ("kcompletion" ,kcompletion) + ("kconfig" ,kconfig) + ("kcoreaddons" ,kcoreaddons) + ("kwidgetsaddons" ,kwidgetsaddons) + ("kservice" ,kservice) + ("qtbase" ,qtbase) + ("qtscript" ,qtscript) + ("qtwebkit" ,qtwebkit) + ("qtx11extras" ,qtx11extras) + ("plasma" ,plasma-framework) + ("zlib" ,zlib))) + (build-system cmake-build-system) + (arguments + `(#:configure-flags + `(,(string-append "-DKDE_INSTALL_DATADIR=" + (assoc-ref %outputs "out") "/share")) + #:phases + (modify-phases %standard-phases + (add-before 'configure 'patch-cmakelists + (lambda _ + (substitute* "processcore/CMakeLists.txt" + (("KAUTH_HELPER_INSTALL_DIR") "KDE_INSTALL_LIBEXECDIR")))) + (replace 'check + (lambda _ ;other tests require a display and therefore fail + (zero? (system* "ctest" "-R" "chronotest"))))))) + (home-page "https://www.kde.org/info/plasma-5.8.2.php") + (synopsis "Network enabled task and system monitoring") + (description "KSysGuard can obtain information on system load and +manage running processes. It obtains this information by interacting +with a ksysguardd daemon, which may also run on a remote system.") + (license license:gpl3+))) + (define-public qca (package (name "qca") diff --git a/gnu/packages/key-mon.scm b/gnu/packages/key-mon.scm index c76360ce08..6237a1765a 100644 --- a/gnu/packages/key-mon.scm +++ b/gnu/packages/key-mon.scm @@ -42,8 +42,6 @@ (arguments `(#:python ,python-2 ;uses the Python 2 'print' syntax #:tests? #f)) ;no tests - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (inputs `(("python2-xlib" ,python2-xlib) ("python2-pygtk" ,python2-pygtk) diff --git a/gnu/packages/libevent.scm b/gnu/packages/libevent.scm index c9e57d6331..cb76915ef7 100644 --- a/gnu/packages/libevent.scm +++ b/gnu/packages/libevent.scm @@ -65,7 +65,7 @@ loop.") (define-public libev (package (name "libev") - (version "4.20") + (version "4.23") (source (origin (method url-fetch) (uri (string-append "http://dist.schmorp.de/libev/Attic/libev-" @@ -73,7 +73,7 @@ loop.") ".tar.gz")) (sha256 (base32 - "17j47pbkr65a18mfvy2861p5k7w4pxmdgiw723ryfqd9gx636w7q")))) + "0ynxxm7giy4hg3qp9q8wshqw1jla9sxbsbi2pwsdsl1v1hz79zn7")))) (build-system gnu-build-system) (home-page "http://software.schmorp.de/pkg/libev.html") (synopsis "Event loop loosely modelled after libevent") diff --git a/gnu/packages/libreoffice.scm b/gnu/packages/libreoffice.scm index e02e4f4cdc..a962d9a301 100644 --- a/gnu/packages/libreoffice.scm +++ b/gnu/packages/libreoffice.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2014 John Darrington <jmd@gnu.org> ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2017 Alex Griffin <a@ajgrf.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -144,7 +145,7 @@ CSV, CSS and XML.") `(#:configure-flags '("--disable-werror" ;; Avoid undefined library references "LDFLAGS=-lboost_system"))) - (home-page "http://sourceforge.net/p/libwpd/wiki/librevenge/") + (home-page "https://sourceforge.net/p/libwpd/wiki/librevenge/") (synopsis "Document importer for office suites") (description "Librevenge is a base library for writing document import filters. It has interfaces for text documents, vector graphics, @@ -275,7 +276,7 @@ working with graphics in the WPG (WordPerfect Graphics) format.") ;; fails without the following flag. (string-append "--with-boost=" (assoc-ref %build-inputs "boost"))))) - (home-page "http://sourceforge.net/projects/libcmis/") + (home-page "https://sourceforge.net/projects/libcmis/") (synopsis "CMIS client library") (description "LibCMIS is a C++ client library for the CMIS interface. It allows C++ applications to connect to any ECM behaving as a CMIS server such @@ -561,7 +562,7 @@ Microsoft Visio documents of all versions.") (arguments ;; avoid triggering configure errors by simple inclusion of boost headers `(#:configure-flags '("--disable-werror"))) - (home-page "http://sourceforge.net/p/libwpd/wiki/libodfgen/") + (home-page "https://sourceforge.net/p/libwpd/wiki/libodfgen/") (synopsis "ODF (Open Document Format) library") (description "Libodfgen is a library for generating documents in the Open Document Format (ODF). It provides generator implementations for all @@ -592,7 +593,7 @@ text documents, vector drawings, presentations and spreadsheets.") (arguments ;; avoid triggering configure errors by simple inclusion of boost headers `(#:configure-flags '("--disable-werror"))) - (home-page "http://sourceforge.net/p/libmwaw/wiki/Home/") + (home-page "https://sourceforge.net/p/libmwaw/wiki/Home/") (synopsis "Import library for some old Macintosh text documents") (description "Libmwaw contains some import filters for old Macintosh text documents (MacWrite, ClarisWorks, ... ) and for some graphics and @@ -631,21 +632,24 @@ Works word processor file format.") (define-public hunspell (package (name "hunspell") - (version "1.3.3") + (version "1.5.4") (source (origin (method url-fetch) - (uri (string-append "mirror://sourceforge/" name "/Hunspell/" version "/" - name "-" version ".tar.gz")) + (uri (string-append "https://github.com/hunspell/hunspell/archive/v" + version ".tar.gz")) (sha256 (base32 - "0v14ff9s37vkh45diaddndcrj0hmn67arh8xh8k79q9c1vgc1cm7")))) + "0ngwk18dwd8p5a5f20h2jlgrz9wbc1k189mmmprb2zmqwfi02b45")) + (file-name (string-append name "-" version ".tar.gz")))) (build-system gnu-build-system) + (inputs + `(("perl" ,perl))) (home-page "http://hunspell.sourceforge.net/") (synopsis "Spell checker") (description "Hunspell is a spell checker and morphological analyzer library and program designed for languages with rich morphology and complex word compounding or character encoding.") - ;; triple license, including "mpl1.1 or later" + ;; Triple license, including "mpl1.1 or later". (license (list mpl1.1 gpl2+ lgpl2.1+)))) (define-public hyphen @@ -710,7 +714,7 @@ and to return information on pronunciations, meanings and synonyms.") (define-public libreoffice (package (name "libreoffice") - (version "5.1.5.2") + (version "5.1.6.2") (source (origin (method url-fetch) @@ -719,7 +723,7 @@ and to return information on pronunciations, meanings and synonyms.") "http://download.documentfoundation.org/libreoffice/src/" (version-prefix version 3) "/libreoffice-" version ".tar.xz")) (sha256 (base32 - "1qg0dj0zwh5ifhmvv4k771nmyqddz4ifn75s9mr1p0nyix8zks8x")))) + "150xb76pc3889gfy4jrnq8sidymm1aihkm5pzy8b1fdy51zip804")))) (build-system gnu-build-system) (native-inputs `(;; autoreconf is run by the LibreOffice build system, since after @@ -820,14 +824,16 @@ and to return information on pronunciations, meanings and synonyms.") (("./configure") "$(CONFIG_SHELL) ./configure" )) #t))) (add-after 'install 'bin-install - ;; Create a symlink bin/soffice to the executable script. + ;; Create 'soffice' and 'libreoffice' symlinks to the executable + ;; script. (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) - (bin (string-append out "/bin"))) + (bin (string-append out "/bin")) + (soffice (string-append + out "/lib/libreoffice/program/soffice"))) (mkdir bin) - (symlink - (string-append out "/lib/libreoffice/program/soffice") - (string-append bin "/soffice"))) + (symlink soffice (string-append bin "/soffice")) + (symlink soffice (string-append bin "/libreoffice"))) #t))) #:configure-flags (list diff --git a/gnu/packages/libunistring.scm b/gnu/packages/libunistring.scm index 5df7be67cf..212bec4b49 100644 --- a/gnu/packages/libunistring.scm +++ b/gnu/packages/libunistring.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,7 +23,8 @@ #:use-module (guix licenses) #:use-module (guix packages) #:use-module (guix download) - #:use-module (guix build-system gnu)) + #:use-module (guix build-system gnu) + #:use-module (gnu packages base)) (define-public libunistring (package @@ -36,7 +38,7 @@ (sha256 (base32 "15z76qrmrvkc3c6hfq2lzzqysgd21s682f2smycfab5g598n8drf")))) - (propagated-inputs '()) ; FIXME: add libiconv when !glibc + (propagated-inputs (libiconv-if-needed)) (build-system gnu-build-system) (arguments ;; Work around parallel build issue whereby C files may be compiled before diff --git a/gnu/packages/libupnp.scm b/gnu/packages/libupnp.scm index b9209bf04b..ea4d1bd25e 100644 --- a/gnu/packages/libupnp.scm +++ b/gnu/packages/libupnp.scm @@ -32,7 +32,8 @@ (method url-fetch) (uri (string-append "mirror://sourceforge/pupnp/pupnp/libUPnP%20" version "/" name "-" version ".tar.bz2")) - (patches (search-patches "libupnp-CVE-2016-6255.patch")) + (patches (search-patches "libupnp-CVE-2016-6255.patch" + "libupnp-CVE-2016-8863.patch")) (sha256 (base32 "0qrsdsb1qm85hc4jy04qph895613d148f0x1mmk6z99y3q43fdgf")))) diff --git a/gnu/packages/links.scm b/gnu/packages/links.scm index 2f0c12a786..145ed761ee 100644 --- a/gnu/packages/links.scm +++ b/gnu/packages/links.scm @@ -33,13 +33,13 @@ (define-public links (package (name "links") - (version "2.13") + (version "2.14") (source (origin (method url-fetch) (uri (string-append "http://links.twibright.com/download/" name "-" version ".tar.bz2")) (sha256 - (base32 "01a4mbpvf7450ymqarjkpmzrm0z2zyd9lvqwg7x9kcd36i9hjln2")))) + (base32 "1f24y83wa1vzzjq5kp857gjqdpnmf8pb29yw7fam0m8wxxw0c3gp")))) (build-system gnu-build-system) (arguments `(#:phases diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index a0d86bb40e..5e450a72a7 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -18,6 +18,7 @@ ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> ;;; Copyright © 2016 Rene Saavedra <rennes@openmailbox.org> ;;; Copyright © 2016 Carlos Sánchez de La Lama <csanchezdll@gmail.com> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> ;;; ;;; This file is part of GNU Guix. ;;; @@ -73,6 +74,8 @@ #:use-module (gnu packages slang) #:use-module (gnu packages texinfo) #:use-module (gnu packages tls) + #:use-module (gnu packages video) + #:use-module (gnu packages xiph) #:use-module (gnu packages xml) #:use-module (gnu packages xdisorg) #:use-module (gnu packages xorg) @@ -252,13 +255,15 @@ for ARCH and optionally VARIANT, or #f if there is no such configuration." ("bc" ,bc) ("openssl" ,openssl) ("kmod" ,kmod) - ,@(if configuration-file - `(("kconfig" ,(configuration-file - (system->linux-architecture - (or (%current-target-system) - (%current-system))) - #:variant (version-major+minor version)))) - '()))) + ,@(match (and configuration-file + (configuration-file + (system->linux-architecture + (or (%current-target-system) (%current-system))) + #:variant (version-major+minor version))) + (#f ;no config for this platform + '()) + ((? string? config) + `(("kconfig" ,config)))))) (arguments `(#:modules ((guix build gnu-build-system) (guix build utils) @@ -337,26 +342,26 @@ It has been modified to remove all non-free binary blobs.") (define %intel-compatible-systems '("x86_64-linux" "i686-linux")) (define-public linux-libre - (make-linux-libre "4.8.10" - "04kwarmpz5adz64wwy0xpwzxsri7jrjkhbmjlwxsac69x9a26bkl" + (make-linux-libre "4.8.15" + "0msgi44mh1ighfawysrzrljikwrapkvk418d6h0v45vj2i5rwln9" %intel-compatible-systems #:configuration-file kernel-config)) (define-public linux-libre-4.4 - (make-linux-libre "4.4.34" - "04ng40l2av34bcfwjs5vliv15f0m8bl0sfw08imspiplxvajd6ca" + (make-linux-libre "4.4.39" + "0aqi44xshib7lx9zjc0kj2v172ywa0iy2kb6z0whbiw3f841hv43" %intel-compatible-systems #:configuration-file kernel-config)) (define-public linux-libre-4.1 - (make-linux-libre "4.1.35" - "05zvrld1digqwf9kqf5pxx0mxqmwpr5kamhnks6y4yfy7x7jynyk" + (make-linux-libre "4.1.37" + "0q79cxmrz0j5wh7z1dc103q6q6qf7rqgjl7ka8lvn4vl32pr0kq1" %intel-compatible-systems #:configuration-file kernel-config)) ;; Avoid rebuilding kernel variants when there is a minor version bump. -(define %linux-libre-version "4.8.10") -(define %linux-libre-hash "04kwarmpz5adz64wwy0xpwzxsri7jrjkhbmjlwxsac69x9a26bkl") +(define %linux-libre-version "4.8.15") +(define %linux-libre-hash "0msgi44mh1ighfawysrzrljikwrapkvk418d6h0v45vj2i5rwln9") (define-public linux-libre-arm-generic (make-linux-libre %linux-libre-version @@ -589,7 +594,7 @@ slabtop, and skill.") (define-public usbutils (package (name "usbutils") - (version "006") + (version "008") (source (origin (method url-fetch) @@ -597,10 +602,11 @@ slabtop, and skill.") "usbutils-" version ".tar.xz")) (sha256 (base32 - "03pd57vv8c6x0hgjqcbrxnzi14h8hcghmapg89p8k5zpwpkvbdfr")))) + "132clk14j4nm8crln2jymdbbc2vhzar2j2hnxyh05m79pbq1lx24")))) (build-system gnu-build-system) (inputs - `(("libusb" ,libusb))) + `(("libusb" ,libusb) + ("eudev" ,eudev))) (native-inputs `(("pkg-config" ,pkg-config))) (home-page "http://www.linux-usb.org/") @@ -860,14 +866,14 @@ MIDI functionality to the Linux-based operating system.") (define-public alsa-utils (package (name "alsa-utils") - (version "1.1.2") + (version "1.1.3") (source (origin (method url-fetch) (uri (string-append "ftp://ftp.alsa-project.org/pub/utils/" name "-" version ".tar.bz2")) (sha256 (base32 - "0wcha78c2sm8qqk5r3w83cvm8fp6fb1zpd35kmcm24kxhz007xks")))) + "0z0nnqp1707bm02dys2d16m88lsg5nd26bqaf14rl3za9sjifwhj")))) (build-system gnu-build-system) (arguments ;; XXX: Disable man page creation until we have DocBook. @@ -886,7 +892,8 @@ MIDI functionality to the Linux-based operating system.") ;; Don't try to mkdir /var/lib/alsa. (substitute* "Makefile" (("\\$\\(MKDIR_P\\) .*ASOUND_STATE_DIR.*") - "true\n"))))))) + "true\n")) + #t))))) (inputs `(("libsamplerate" ,libsamplerate) ("ncurses" ,ncurses) @@ -903,6 +910,68 @@ MIDI functionality to the Linux-based operating system.") ;; GPLv2-only. (license license:gpl2))) +(define-public alsa-plugins + (package + (name "alsa-plugins") + (version "1.1.1") + (source (origin + (method url-fetch) + (uri (string-append "ftp://ftp.alsa-project.org/pub/plugins/" + name "-" version ".tar.bz2")) + (sha256 + (base32 + "1w81z5jlwqhd1l2m7qrq69lc4k9dnrg1wn52jsl2hrf3hbhd394f")))) + (build-system gnu-build-system) + ;; TODO: Split libavcodec and speex if possible. It looks like they can not + ;; be split, there are references to both in files. + ;; TODO: Remove OSS related plugins, they add support to run native + ;; ALSA applications on OSS however we do not offer OSS and OSS is + ;; obsolete. + (outputs '("out" "pulseaudio")) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'split + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Distribute the binaries to the various outputs. + (let* ((out (assoc-ref outputs "out")) + (pua (assoc-ref outputs "pulseaudio")) + (pualib (string-append pua "/lib/alsa-lib")) + (puaconf (string-append pua "/share/alsa/alsa.conf.d"))) + (mkdir-p puaconf) + (mkdir-p pualib) + (chdir (string-append out "/share")) + (for-each (lambda (file) + (rename-file file (string-append puaconf "/" (basename file)))) + (find-files out "\\.(conf|example)")) + (for-each (lambda (file) + (rename-file file (string-append pualib "/" (basename file)))) + (find-files out ".*pulse\\.(la|so)")) + (chdir "..") + ;; We have moved the files to output pulsaudio, the + ;; directory is now empty. + (delete-file-recursively (string-append out "/share")) + #t)))))) + (inputs + `(("alsa-lib" ,alsa-lib) + ("speex" ,speex) ; libspeexdsp resampling plugin + ("libsamplerate" ,libsamplerate) ; libsamplerate resampling plugin + ("ffmpeg" ,ffmpeg) ; libavcodec resampling plugin, a52 plugin + ("pulseaudio" ,pulseaudio))) ; PulseAudio plugin + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "http://www.alsa-project.org/") + (synopsis "Plugins for the Advanced Linux Sound Architecture (ALSA)") + (description + "The Advanced Linux Sound Architecture (ALSA) provides audio and +MIDI functionality to the Linux-based operating system. This package enhances ALSA +by providing additional plugins which include: upmixing, downmixing, jackd and +pulseaudio support for native alsa applications, format conversion (s16 to a52), and +external rate conversion.") + (license (list license:gpl2+ + ;; `rate/rate_samplerate.c': LGPL v2.1 or later. + license:lgpl2.1+)))) + (define-public iptables (package (name "iptables") @@ -934,7 +1003,7 @@ packet filter.") (define-public iproute (package (name "iproute2") - (version "4.8.0") + (version "4.9.0") (source (origin (method url-fetch) (uri (string-append @@ -942,7 +1011,7 @@ packet filter.") version ".tar.xz")) (sha256 (base32 - "12dk5hn1zlraqk2p0z8dv2xgsz0x9v8l3vcvf51fzj0v8b45j2d3")))) + "1i0n071hiqxw1gisngw2jln3kcp9sh47n6fj5hdwqrvp7w20zwy0")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no test suite @@ -970,7 +1039,7 @@ packet filter.") ("flex" ,flex) ("bison" ,bison))) (home-page - "http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2") + "https://wiki.linuxfoundation.org/networking/iproute2") (synopsis "Utilities for controlling TCP/IP networking and traffic in Linux") (description @@ -1208,7 +1277,7 @@ configuration and monitoring interfaces.") (define-public iw (package (name "iw") - (version "4.3") + (version "4.9") (source (origin (method url-fetch) (uri (string-append @@ -1216,7 +1285,7 @@ configuration and monitoring interfaces.") version ".tar.xz")) (sha256 (base32 - "085jyvrxzarvn5jl0fk618jjxy50nqx7ifngszc4jxk6a4ddibd6")))) + "1klpvv98bnx1zm6aqalnri2vd7w80scmdaxr2qnblb6mz82whk1j")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("libnl" ,libnl))) @@ -1876,7 +1945,7 @@ compliance.") (define-public wireless-regdb (package (name "wireless-regdb") - (version "2016.05.02") + (version "2016.06.10") (source (origin (method url-fetch) (uri (string-append @@ -1884,7 +1953,7 @@ compliance.") "wireless-regdb-" version ".tar.xz")) (sha256 (base32 - "07n6gcwfbddz3awbdflv3dhxjszsqq2lrdwih0a0ahcliac4qry9")) + "1dxqy7a7zpzya30ff00s8k1qgrlndrwys99gc0r8yg0vab1z3vfg")) ;; We're building 'regulatory.bin' by ourselves. (snippet '(delete-file "regulatory.bin")))) @@ -2157,7 +2226,7 @@ thanks to the use of namespaces.") "CC=gcc")) #:phases (alist-delete 'configure %standard-phases) #:tests? #f)) ; no test suite - (home-page "http://sourceforge.net/projects/hdparm/") + (home-page "https://sourceforge.net/projects/hdparm/") (synopsis "Tune hard disk parameters for high performance") (description "Get/set device parameters for Linux SATA/IDE drives. It's primary use @@ -2223,7 +2292,7 @@ about ACPI devices.") (base32 "1vl7c6vc724v4jwki17czgj6lnrknnj1a6llm8gkl32i2gnam5j3")))) (build-system gnu-build-system) - (home-page "http://sourceforge.net/projects/acpid2/") + (home-page "https://sourceforge.net/projects/acpid2/") (synopsis "Daemon for delivering ACPI events to user-space programs") (description "acpid is designed to notify user-space programs of Advanced @@ -2312,7 +2381,7 @@ capabilities of the Linux kernel.") (define-public libraw1394 (package (name "libraw1394") - (version "2.1.0") + (version "2.1.2") (source (origin (method url-fetch) (uri (string-append @@ -2320,7 +2389,7 @@ capabilities of the Linux kernel.") name "-" version ".tar.xz")) (sha256 (base32 - "0kwnf4ha45c04mhc4yla672aqmvqqihxix1gvblns5cd2pc2cc8b")))) + "0pm5b415j1qdzyw38wdv8h7ff4yx20831z1727mpsb6jc6bwdk03")))) (build-system gnu-build-system) (home-page "https://ieee1394.wiki.kernel.org/index.php/Main_Page") (synopsis "Interface library for the Linux IEEE1394 drivers") @@ -2348,7 +2417,7 @@ protocol in question.") `(("pkg-config" ,pkg-config))) (propagated-inputs `(("libraw1394" ,libraw1394))) ; required by libavc1394.pc - (home-page "http://sourceforge.net/projects/libavc1394/") + (home-page "https://sourceforge.net/projects/libavc1394/") (synopsis "AV/C protocol library for IEEE 1394") (description "Libavc1394 is a programming interface to the AV/C specification from @@ -2513,7 +2582,7 @@ Bluetooth audio output devices like headphones or loudspeakers.") (define-public bluez (package (name "bluez") - (version "5.40") + (version "5.43") (source (origin (method url-fetch) (uri (string-append @@ -2521,7 +2590,7 @@ Bluetooth audio output devices like headphones or loudspeakers.") version ".tar.xz")) (sha256 (base32 - "09ywk3lvgis0nbi0d5z8d4qp5r33lzwnd6bdakacmbsm420qpnns")))) + "05cdnpz0w2lwq2x5ba87q1h2wgb4lfnpbnbh6p7499hx59fw1j8n")))) (build-system gnu-build-system) (arguments '(#:configure-flags @@ -2573,55 +2642,21 @@ is flexible, efficient and uses a modular implementation.") (define-public fuse-exfat (package (name "fuse-exfat") - (version "1.1.0") + (version "1.2.5") (source (origin (method url-fetch) - (uri "https://docs.google.com/uc?export=download&\ -id=0B7CLI-REKbE3VTdaa0EzTkhYdU0") + (uri (string-append + "https://github.com/relan/exfat/releases/download/v" + version "/" name "-" version ".tar.gz")) (sha256 (base32 - "0glmgwrf0nv09am54i6s35ksbvrywrwc51w6q32mv5by8475530r")) - (file-name (string-append name "-" version ".tar.gz")))) + "1i0sh0s6wnm4dqxli3drva871wgbbm57qjf592vnswna9hc6bvim")))) (build-system gnu-build-system) (native-inputs - `(("scons" ,scons) - ("pkg-config" ,pkg-config))) + `(("pkg-config" ,pkg-config))) (inputs `(("fuse" ,fuse))) - (arguments - '(#:tests? #f ;no test suite - - ;; XXX: Factorize with 'exfat-utils'. - #:phases (modify-phases %standard-phases - (delete 'configure) - (add-after 'unpack 'scons-propagate-environment - (lambda _ - ;; Modify the SConstruct file to arrange for - ;; environment variables to be propagated. - (substitute* "SConstruct" - (("^env = Environment\\(") - "env = Environment(ENV=os.environ, ")))) - (replace 'build - (lambda _ - (zero? (system* "scons")))) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (bin (string-append out "/bin")) - (man8 (string-append out - "/share/man/man8"))) - (mkdir-p bin) - (mkdir-p man8) - (for-each (lambda (file) - (copy-file - file - (string-append man8 "/" - (basename file)))) - (find-files "." "\\.8$")) - (zero? (system* "scons" "install" - (string-append "DESTDIR=" - bin))))))))) - (home-page "http://code.google.com/p/exfat/") + (home-page "https://github.com/relan/exfat") (synopsis "Mount exFAT file systems") (description "This package provides a FUSE-based file system that provides read and @@ -2674,7 +2709,7 @@ and copy/paste text in the console and in xterm.") (define-public btrfs-progs (package (name "btrfs-progs") - (version "4.8.4") + (version "4.9") (source (origin (method url-fetch) (uri (string-append "mirror://kernel.org/linux/kernel/" @@ -2682,7 +2717,7 @@ and copy/paste text in the console and in xterm.") "btrfs-progs-v" version ".tar.xz")) (sha256 (base32 - "1ib1ybpjhcymcycjiraz1vk01qlyvpwcg7mwfhmacdy3cvbfl9mz")))) + "18y88avadn4wb3xmczd6pfcjr7ik62dw4phk6fmkms2j8vmvl9z2")))) (build-system gnu-build-system) (outputs '("out" "static")) ; static versions of binaries in "out" (~16MiB!) @@ -2709,11 +2744,11 @@ and copy/paste text in the console and in xterm.") (native-inputs `(("pkg-config" ,pkg-config) ("asciidoc" ,asciidoc) ("xmlto" ,xmlto) - ;; For building documentation + ;; For building documentation. ("libxml2" ,libxml2) ("docbook-xml" ,docbook-xml) ("docbook-xsl" ,docbook-xsl) - ;; For tests + ;; For tests. ("which" ,which))) (home-page "https://btrfs.wiki.kernel.org/") (synopsis "Create and manage btrfs copy-on-write file systems") @@ -2863,7 +2898,7 @@ The package provides additional NTFS tools.") (description "Monitor a hardware random number generator, and supply entropy from that to the system kernel's @file{/dev/random} machinery.") - (home-page "http://sourceforge.net/projects/gkernel") + (home-page "https://sourceforge.net/projects/gkernel") ;; The source package is offered under the GPL2+, but the files ;; 'rngd_rdrand.c' and 'rdrand_asm.S' are only available under the GPL2. (license (list license:gpl2 license:gpl2+)))) @@ -3037,14 +3072,14 @@ the default @code{nsswitch} and the experimental @code{umich_ldap}.") (define-public mcelog (package (name "mcelog") - (version "144") + (version "146") (source (origin (method url-fetch) (uri (string-append "https://git.kernel.org/cgit/utils/cpu/mce/" "mcelog.git/snapshot/v" version ".tar.gz")) (sha256 (base32 - "03jyhsl0s59sfqykj5p6gkb03k4w1h9ay31yxym1dnzis5sq99pa")) + "0jjx4q1mfa380319cqz86nw5wv6jnbpvq2r8n0dyh87mhvrgb4wi")) (file-name (string-append name "-" version ".tar.gz")) (modules '((guix build utils))) (snippet diff --git a/gnu/packages/lirc.scm b/gnu/packages/lirc.scm index b8fbeb61ba..d4c2d18ccc 100644 --- a/gnu/packages/lirc.scm +++ b/gnu/packages/lirc.scm @@ -134,5 +134,4 @@ on just one button press.") (lambda _ (zero? (system* "make" "py2"))))))) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-cython" ,python2-cython)))))) + `(("python2-cython" ,python2-cython)))))) diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm index ec0bdaaa53..e226443626 100644 --- a/gnu/packages/lisp.scm +++ b/gnu/packages/lisp.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2016 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2016 ng0 <ngillmann@runbox.com> ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca> +;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -207,24 +208,29 @@ supporting ASDF, Sockets, Gray streams, MOP, and other useful components.") ;; --build=<triplet>. #:build #f #:phases - (alist-cons-after - 'unpack 'patch-sh-and-pwd - (lambda _ - ;; The package is very messy with its references to "/bin/sh" and - ;; some other absolute paths to traditional tools. These appear in - ;; many places where our automatic patching misses them. Therefore - ;; we do the following, in this early (post-unpack) phase, to solve - ;; the problem from its root. - (substitute* (find-files "." "configure|Makefile") - (("/bin/sh") "sh")) - (substitute* '("src/clisp-link.in") - (("/bin/pwd") "pwd"))) - (alist-cons-before - 'build 'chdir-to-source - (lambda _ - ;; We are supposed to call make under the src sub-directory. - (chdir "src")) - %standard-phases)) + (modify-phases %standard-phases + (add-after 'unpack 'patch-sh-and-pwd + (lambda _ + ;; The package is very messy with its references to "/bin/sh" and + ;; some other absolute paths to traditional tools. These appear in + ;; many places where our automatic patching misses them. Therefore + ;; we do the following, in this early (post-unpack) phase, to solve + ;; the problem from its root. + (substitute* (find-files "." "configure|Makefile") + (("/bin/sh") "sh")) + (substitute* '("src/clisp-link.in") + (("/bin/pwd") "pwd")) + #t)) + (add-after 'unpack 'remove-timestamps + (lambda _ + (substitute* "src/constobj.d" + (("__DATE__ __TIME__") "\"1\"")) + #t)) + (add-before 'build 'chdir-to-source + (lambda _ + ;; We are supposed to call make under the src sub-directory. + (chdir "src") + #t))) ;; Makefiles seem to have race conditions. #:parallel-build? #f)) (home-page "http://www.clisp.org/") diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index 96679bf97b..04a2b39af9 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2016 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> -;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2015, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016 Dennis Mungai <dmngaie@gmail.com> ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; @@ -60,7 +60,8 @@ `(#:configure-flags '("-DCMAKE_SKIP_BUILD_RPATH=FALSE" "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE" "-DBUILD_SHARED_LIBS:BOOL=TRUE" - "-DLLVM_ENABLE_FFI:BOOL=TRUE") + "-DLLVM_ENABLE_FFI:BOOL=TRUE" + "-DLLVM_INSTALL_UTILS=ON") ; Needed for rustc. ;; Don't use '-g' during the build, to save space. #:build-type "Release" @@ -282,6 +283,7 @@ code analysis tools.") (define-public llvm-for-extempore (package (inherit llvm-3.7) + (name "llvm-for-extempore") (source (origin (inherit (package-source llvm-3.7)) diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm index f95da3587d..65c335d373 100644 --- a/gnu/packages/lua.scm +++ b/gnu/packages/lua.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2016 doncatnip <gnopap@gmail.com> ;;; Copyright © 2016 Clément Lassieur <clement@lassieur.org> +;;; Copyright © 2016 José Miguel Sánchez García <jmi2k@openmailbox.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -27,6 +28,7 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix utils) #:use-module (guix build-system gnu) #:use-module (gnu packages) #:use-module (gnu packages readline) @@ -365,3 +367,37 @@ secure session between the peers.") based libraries. It allows using GObject-based libraries directly from Lua. Notable examples are GTK+, GStreamer and Webkit.") (license license:expat))) + +(define-public lua-lpeg + (package + (name "lua-lpeg") + (version "1.0.0") + (source (origin + (method url-fetch) + (uri (string-append "http://www.inf.puc-rio.br/~roberto/lpeg/lpeg-" + version ".tar.gz")) + (sha256 + (base32 "13mz18s359wlkwm9d9iqlyyrrwjc6iqfpa99ai0icam2b3khl68h")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + ;; `make install` isn't available, so we have to do it manually + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (lua-version ,(version-major+minor (package-version lua)))) + (install-file "lpeg.so" + (string-append out "/lib/lua/" lua-version)) + (install-file "re.lua" + (string-append out "/share/lua/" lua-version)) + #t)))) + #:test-target "test")) + (inputs `(("lua", lua))) + (synopsis "Pattern-matching library for Lua") + (description + "LPeg is a pattern-matching library for Lua, based on Parsing Expression +Grammars (PEGs).") + (home-page "http://www.inf.puc-rio.br/~roberto/lpeg") + (license license:expat))) diff --git a/gnu/packages/lynx.scm b/gnu/packages/lynx.scm index 6e4ed6cd13..b212dca388 100644 --- a/gnu/packages/lynx.scm +++ b/gnu/packages/lynx.scm @@ -34,7 +34,7 @@ (define-public lynx (package (name "lynx") - (version "2.8.9dev.9") + (version "2.8.9dev.11") (source (origin (method url-fetch) (uri (string-append @@ -42,7 +42,7 @@ "/lynx" version ".tar.bz2")) (sha256 (base32 - "1m72ga89hywm097kazcm8w6sqrfjnl83gh31pkbhk4zhzhfpzxgh")))) + "1cqm1i7d209brkrpzaqqf2x951ra3l67dw8x9yg10vz7rpr9441a")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) ("perl" ,perl))) diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm index c239c4f00f..8f1f8ee53b 100644 --- a/gnu/packages/machine-learning.scm +++ b/gnu/packages/machine-learning.scm @@ -479,6 +479,28 @@ geometric models.") single hidden layer, and for multinomial log-linear models.") (license (list license:gpl2+ license:gpl3+)))) +(define-public r-kernlab + (package + (name "r-kernlab") + (version "0.9-25") + (source + (origin + (method url-fetch) + (uri (cran-uri "kernlab" version)) + (sha256 + (base32 + "0qnaq9x3j2xc6jrmmd98wc6hkzch487s4p3a9lnc00xvahkhgpmr")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/kernlab") + (synopsis "Kernel-based machine learning tools") + (description + "This package provides kernel-based machine learning methods for +classification, regression, clustering, novelty detection, quantile regression +and dimensionality reduction. Among other methods @code{kernlab} includes +Support Vector Machines, Spectral Clustering, Kernel PCA, Gaussian Processes +and a QP solver.") + (license license:gpl2))) + (define-public dlib (package (name "dlib") diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm index 9dcaea364c..70d9b4eee2 100644 --- a/gnu/packages/mail.scm +++ b/gnu/packages/mail.scm @@ -103,53 +103,54 @@ (define-public mailutils (package (name "mailutils") - (version "3.0") + (version "3.1.1") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/mailutils/mailutils-" version ".tar.bz2")) (sha256 (base32 - "0h7cx4cd3niycx7pl0p2358cx2smwm5sb3l9bpb8czkdl6v115c8")))) + "1dpylyg79avi7brpkcmzaq7bqqkz45flp0ws6f2c8b1gyz4hdnzm")))) (build-system gnu-build-system) (arguments - '(;; TODO: Add `--with-sql'. - #:phases (alist-cons-before - 'build 'pre-build - (lambda _ - ;; Use the right file name for `cat'. - (substitute* "testsuite/lib/mailutils.exp" - (("/bin/cat") - (which "cat"))) - - ;; Tests try to invoke 'maidag' such that it looks up the - ;; 'root' user, which does not exist in the build - ;; environment. - (substitute* "maidag/tests/testsuite" - (("root <") "nobody <") - (("spool/root") "spool/nobody") - (("root@localhost") "nobody@localhost")) - - ;; The 'pipeact.at' tests generate a shell script; make - ;; sure it uses the right shell. - (substitute* '("sieve/tests/testsuite" - "mh/tests/testsuite") - (("#! /bin/sh") - (string-append "#!" (which "sh")))) - - (substitute* "mh/tests/testsuite" - (("moreproc: /bin/cat") - (string-append "moreproc: " (which "cat")))) - - ;; XXX: The comsatd tests rely on being able to open - ;; /dev/tty, but that gives ENODEV in the build - ;; environment. Thus, ignore test failures here. - (substitute* "comsat/tests/Makefile.in" - (("\\$\\(SHELL\\) \\$\\(TESTSUITE\\)" all) - (string-append "-" all))) - - #t) - %standard-phases) + '(#:phases + (modify-phases %standard-phases + (add-before 'build 'pre-build + (lambda _ + ;; Use the right file name for `cat'. + (substitute* "testsuite/lib/mailutils.exp" + (("/bin/cat") + (which "cat"))) + + ;; Tests try to invoke 'maidag' such that it looks up the + ;; 'root' user, which does not exist in the build + ;; environment. + (substitute* "maidag/tests/testsuite" + (("root <") "nobody <") + (("spool/root") "spool/nobody") + (("root@localhost") "nobody@localhost")) + + ;; The 'pipeact.at' tests generate a shell script; make + ;; sure it uses the right shell. + (substitute* '("sieve/tests/testsuite" + "mh/tests/testsuite") + (("#! /bin/sh") + (string-append "#!" (which "sh")))) + + (substitute* "mh/tests/testsuite" + (("moreproc: /bin/cat") + (string-append "moreproc: " (which "cat")))) + + ;; XXX: The comsatd tests rely on being able to open + ;; /dev/tty, but that gives ENODEV in the build + ;; environment. Thus, ignore test failures here. + (substitute* "comsat/tests/Makefile.in" + (("\\$\\(SHELL\\) \\$\\(TESTSUITE\\)" all) + (string-append "-" all))) + + #t))) + ;; TODO: Add `--with-sql'. + #:configure-flags '("--sysconfdir=/etc") #:parallel-tests? #f)) (inputs `(("dejagnu" ,dejagnu) @@ -158,15 +159,11 @@ ("guile" ,guile-2.0) ("gnutls" ,gnutls) ("ncurses" ,ncurses) - - ;; With Readline 6.3, examples/pop3client.c fails to build because it - ;; uses the now undefined 'CPPFunction' type. - ("readline" ,readline-6.2) - + ("readline" ,readline) ("linux-pam" ,linux-pam) ("libltdl" ,libltdl) ("gdbm" ,gdbm))) - (home-page "http://www.gnu.org/software/mailutils/") + (home-page "https://www.gnu.org/software/mailutils/") (synopsis "Utilities and library for reading and serving mail") (description "GNU Mailutils is a collection of programs for managing, viewing and @@ -214,14 +211,14 @@ aliasing facilities to work just as they would on normal mail.") (define-public mutt (package (name "mutt") - (version "1.7.1") + (version "1.7.2") (source (origin (method url-fetch) (uri (string-append "ftp://ftp.mutt.org/pub/mutt/mutt-" version ".tar.gz")) (sha256 (base32 - "1pyns0xw52s4yma1a93pdcl4dirs55q2m1hd7w1r11nlhf7giip9")) + "1yazrl82s9fxmamnlvwmsxhwrxnwv6kwakgfmawda8ndhwb50lqm")) (patches (search-patches "mutt-store-references.patch")))) (build-system gnu-build-system) (inputs @@ -308,13 +305,14 @@ Extension (MIME).") "1d56n2m9inm8gnzm88aa27xl2a7sp7aff3484vmflpqkinjqf0p1")))) (build-system gnu-build-system) (arguments - '(#:phases (alist-cons-before - 'check 'pre-check - (lambda _ - (substitute* "src/tests/t.frame" - (("GREP=/bin/grep") - (string-append "GREP=" (which "grep") "\n")))) - %standard-phases))) + '(#:phases + (modify-phases %standard-phases + (add-before 'check 'pre-check + (lambda _ + (substitute* "src/tests/t.frame" + (("GREP=/bin/grep") + (string-append "GREP=" (which "grep") "\n"))) + #t))))) (native-inputs `(("flex" ,flex))) (inputs `(("bdb" ,bdb))) (home-page "http://bogofilter.sourceforge.net/") @@ -329,7 +327,7 @@ and corrections. It is based on a Bayesian filter.") (define-public offlineimap (package (name "offlineimap") - (version "7.0.9") + (version "7.0.12") (source (origin (method url-fetch) (uri (string-append "https://github.com/OfflineIMAP/offlineimap/" @@ -337,7 +335,7 @@ and corrections. It is based on a Bayesian filter.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "04kapx0ddz7ccwhcjshkml2y916wcan3rl28mpmq25p4gywlkhxf")))) + "1m1lp7wxnra8k7lsqc8xlm5giy3i89wvmp35jjb1gf4yslpddnkz")))) (build-system python-build-system) (native-inputs `(("asciidoc" ,asciidoc) @@ -382,24 +380,20 @@ repository and Maildir/IMAP as LOCAL repository.") (define-public mu (package (name "mu") - (version "0.9.16") + (version "0.9.18") (source (origin (method url-fetch) - (uri (string-append "https://github.com/djcb/mu/archive/v" + (uri (string-append "https://github.com/djcb/mu/releases/" + "download/" version "/mu-" version ".tar.gz")) - (file-name (string-append "mu-" version ".tar.gz")) (sha256 (base32 - "0p7hqri1r1x6750x138cc29mh81kdav2dcim26y58s8an206h25g")))) + "02g82zvxfgn17wzy846bfxj0izjj7yklhwdnhwxy1y2kin4fqnb5")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) ("glib" ,glib "bin") ; for gtester - ("autoconf" ,autoconf) - ("automake" ,automake) - ("emacs" ,emacs-minimal) - ("libtool" ,libtool) - ("texinfo" ,texinfo))) + ("emacs" ,emacs-minimal))) ;; TODO: Add webkit and gtk to build the mug GUI. (inputs `(("xapian" ,xapian) @@ -415,18 +409,15 @@ repository and Maildir/IMAP as LOCAL repository.") (guix build emacs-utils)) #:phases (modify-phases %standard-phases - (add-after 'unpack 'patch-configure.ac + (add-after 'unpack 'patch-configure ;; By default, elisp code goes to "share/emacs/site-lisp/mu4e", ;; so our Emacs package can't find it. Setting "--with-lispdir" ;; configure flag doesn't help because "mu4e" will be added to ;; the lispdir anyway, so we have to modify "configure.ac". (lambda _ - (substitute* "configure.ac" - (("^ +lispdir=.*") "")) + (substitute* "configure" + (("^ +lispdir=\"\\$\\{lispdir\\}/mu4e/\".*") "")) #t)) - (add-after 'patch-configure.ac 'autoreconf - (lambda _ - (zero? (system* "autoreconf" "-vi")))) (add-before 'check 'check-tz-setup (lambda* (#:key inputs #:allow-other-keys) ;; For mu/test/test-mu-query.c @@ -453,7 +444,7 @@ attachments, create new maildirs, and so on.") (define-public alot (package (name "alot") - (version "0.3.7") + (version "0.4") (source (origin (method url-fetch) ;; package author intends on distributing via github rather @@ -464,12 +455,12 @@ attachments, create new maildirs, and so on.") (file-name (string-append "alot-" version ".tar.gz")) (sha256 (base32 - "09md9llg38r6xby8l0y0zf8nhlh91cr4xs0r15b294hhp8hl2bgx")))) + "0sl1kl2fhkv208llnbny4blcvrfdk4vx6bcw5pnyh9ylwb0pipi2")))) (build-system python-build-system) (arguments `(#:tests? #f ; no tests - ;; python 3 is unsupported, more info: - ;; https://github.com/pazz/alot/blob/0.3.7/docs/source/faq.rst + ;; python 3 is currently unsupported, more info: + ;; https://github.com/pazz/alot/blob/master/docs/source/faq.rst #:python ,python-2)) (inputs `(("python2-magic" ,python2-magic) @@ -537,14 +528,14 @@ invoking @command{notifymuch} from the post-new hook.") (define-public notmuch (package (name "notmuch") - (version "0.23.2") + (version "0.23.4") (source (origin (method url-fetch) (uri (string-append "https://notmuchmail.org/releases/notmuch-" version ".tar.gz")) (sha256 (base32 - "1g4p5hsrqqbqk6s2w756als60wppvjgpyq104smy3w9vshl7bzgd")))) + "0fs5crf8v3jghc8jnm61cv7wxhclcg88hi5894d8fma9kkixcv8h")))) (build-system gnu-build-system) (arguments '(#:make-flags (list "V=1") ; Verbose test output. @@ -568,11 +559,6 @@ invoking @command{notifymuch} from the post-new hook.") ;; Patch various inline shell invocations. (substitute* (find-files "test" "\\.sh$") (("/bin/sh") (which "sh"))) - ;; XXX: Some signature verification tests fail with - ;; gnupg-2.1.16, so we skip them. See this thread: - ;; https://notmuchmail.org/pipermail/notmuch/2016/023688.html - (setenv "NOTMUCH_SKIP_TESTS" - "T350-crypto.2 T350-crypto.3 T350-crypto.4 T350-crypto.15") #t))))) (native-inputs `(("bash-completion" ,bash-completion) @@ -680,7 +666,7 @@ and search library.") (define-public getmail (package (name "getmail") - (version "4.49.0") + (version "4.52.0") (source (origin (method url-fetch) @@ -688,7 +674,7 @@ and search library.") name "-" version ".tar.gz")) (sha256 (base32 - "1m0yzxd05fklwbmjj1n2q4sx397c1j5qi9a0r5fv3h8pplz4lv0w")))) + "0pzplrlxwbxydvfw4kkwn60l40hk1h5sxawaa6pi0k75c220k4ni")))) (build-system python-build-system) (arguments `(#:tests? #f ; no tests @@ -804,7 +790,7 @@ which can add many functionalities to the base client.") (define-public msmtp (package (name "msmtp") - (version "1.6.5") + (version "1.6.6") (source (origin (method url-fetch) @@ -812,7 +798,7 @@ which can add many functionalities to the base client.") "/msmtp-" version ".tar.xz")) (sha256 (base32 - "01jh9ba49bih8zsh40myw6qq1ll210q1vw0jg865vrn7jc3dd83n")))) + "0ppvww0sb09bnsrpqnvlrn8vx231r24xn2iiwpy020mxc8gxn5fs")))) (build-system gnu-build-system) (inputs `(("libidn" ,libidn) @@ -850,7 +836,7 @@ delivery.") (define-public exim (package (name "exim") - (version "4.87") + (version "4.87.1") (source (origin (method url-fetch) @@ -860,7 +846,7 @@ delivery.") version ".tar.bz2"))) (sha256 (base32 - "1jbxn13shq90kpn0s73qpjnx5xm8jrpwhcwwgqw5s6sdzw6iwsbl")))) + "050m2gjzpc6vyik458h1j0vi8bxplkzjsyndkyd2y394i569kdyl")))) (build-system gnu-build-system) (inputs `(("bdb" ,bdb) @@ -938,15 +924,15 @@ facilities for checking incoming mail.") (define-public dovecot (package (name "dovecot") - (version "2.2.25") + (version "2.2.27") (source (origin (method url-fetch) - (uri (string-append "http://www.dovecot.org/releases/" + (uri (string-append "https://www.dovecot.org/releases/" (version-major+minor version) "/" name "-" version ".tar.gz")) (sha256 (base32 - "0rwn5wc5b8j9fzqcjggdgpzmb77myrf4ra294z1gg5v3hhng7nfq")))) + "1s8qvr6fa9d0n179kdwgpsi72zkvpbh9q57q8fr2fjysgjl94zw9")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) @@ -968,8 +954,17 @@ facilities for checking incoming mail.") "doc/example-config/Makefile.in") (("pkgsysconfdir = .*") "pkgsysconfdir = /tmp/etc")) + #t)) + (add-after + 'unpack 'patch-other-shebangs + (lambda _ + (substitute* + "src/lib-program-client/test-program-client-local.c" + (("/bin/echo") (which "echo")) + (("/bin/cat") (which "cat")) + (("/bin/false") (which "false"))) #t))))) - (home-page "http://www.dovecot.org") + (home-page "https://www.dovecot.org") (synopsis "Secure POP3/IMAP server") (description "Dovecot is a mail server whose major goals are security and reliability. @@ -1027,7 +1022,7 @@ write simple, representation-independent mail handling code.") (define-public perl-email-address (package (name "perl-email-address") - (version "1.907") + (version "1.908") (source (origin (method url-fetch) @@ -1035,7 +1030,7 @@ write simple, representation-independent mail handling code.") "Email-Address-" version ".tar.gz")) (sha256 (base32 - "1ai4r149pzjv9dc2vddir8zylj0z1pii93rm4g591lx7avim71hx")))) + "0i6ljdvpy279hpbqf6lgv4figr376rb2sh4yphj86xkdzsyn1y75")))) (build-system perl-build-system) (home-page "http://search.cpan.org/dist/Email-Address") (synopsis "Email address parsing and creation") @@ -1066,7 +1061,7 @@ objects found. Alternatively you may construct objects manually.") (define-public perl-email-messageid (package (name "perl-email-messageid") - (version "1.405") + (version "1.406") (source (origin (method url-fetch) @@ -1074,7 +1069,7 @@ objects found. Alternatively you may construct objects manually.") "Email-MessageID-" version ".tar.gz")) (sha256 (base32 - "09216naz21x99ff33wdm3j3zq1zhdbxhrsmx8bvavjrw3gjsvrq3")))) + "1f22sdnfq169qw1l0lg7y74pmiam7j9v95bggjnf3q4mygdmshpc")))) (build-system perl-build-system) (home-page "http://search.cpan.org/dist/Email-MessageID") (synopsis "Generate world unique message-ids") @@ -1085,7 +1080,7 @@ identify a message uniquely.") (define-public perl-email-mime (package (name "perl-email-mime") - (version "1.929") + (version "1.937") (source (origin (method url-fetch) @@ -1093,7 +1088,7 @@ identify a message uniquely.") "Email-MIME-" version ".tar.gz")) (sha256 (base32 - "1sf7dldg4dvicyw6dl1vx6s1gjq3fcppi0103ikl0vi6v5xjdjdh")))) + "0s50i3nxi9dr81p4rn017nrarc40yrwz0qcw34q8k3pvdf46fr9n")))) (build-system perl-build-system) (propagated-inputs `(("perl-email-address" ,perl-email-address) @@ -1113,7 +1108,7 @@ message. Headers are decoded from MIME encoding.") (define-public perl-email-mime-contenttype (package (name "perl-email-mime-contenttype") - (version "1.017") + (version "1.018") (source (origin (method url-fetch) @@ -1121,7 +1116,7 @@ message. Headers are decoded from MIME encoding.") "Email-MIME-ContentType-" version ".tar.gz")) (sha256 (base32 - "1cl1l97lg690dh7i704hqi7yhxalq1chy7ylld5yc5v38jqa6gcn")))) + "1y8hpwm7p5a9y2azy0cgvlv2i2d0nj66ajfa0fj51wdq4w9cs23m")))) (build-system perl-build-system) (native-inputs `(("perl-capture-tiny" ,perl-capture-tiny))) @@ -1154,7 +1149,7 @@ header.") (define-public perl-email-sender (package (name "perl-email-sender") - (version "1.300016") + (version "1.300028") (source (origin (method url-fetch) @@ -1162,7 +1157,7 @@ header.") "Email-Sender-" version ".tar.gz")) (sha256 (base32 - "18x26fjh399q3s2g8dajb9r10633c46jrnbvycpnpclgnzhjs100")))) + "0c5dv1x9856nryj5mcbgb67a4irmadz80g0qnf4van3bd8wbj72a")))) (build-system perl-build-system) (native-inputs `(("perl-capture-tiny" ,perl-capture-tiny))) @@ -1186,7 +1181,7 @@ Email::Send library.") (define-public perl-email-simple (package (name "perl-email-simple") - (version "2.206") + (version "2.211") (source (origin (method url-fetch) @@ -1194,7 +1189,7 @@ Email::Send library.") "Email-Simple-" version ".tar.gz")) (sha256 (base32 - "19dpy3j5na2k9qw1jcpc8ia25038068r9j1bn34f9yyrisz7s522")))) + "1if4a2wh4iwlcycqrd2fhkx04ngmd75q444gh43w0r9p15ym5f8w")))) (build-system perl-build-system) (propagated-inputs `(("perl-email-date-format" ,perl-email-date-format))) @@ -1256,7 +1251,7 @@ program's primary purpose.") ("libtool" ,libtool))) (inputs `(("libesmtp" ,libesmtp))) - (home-page "http://sourceforge.net/projects/esmtp/") + (home-page "https://sourceforge.net/projects/esmtp/") (synopsis "Relay-only mail transfer agent (MTA)") (description "Esmtp is a simple relay-only mail transfer agent built using libESMTP. It sends e-mail via a remote SMTP server using credentials from the @@ -1347,38 +1342,27 @@ maintained.") (define-public khard (package (name "khard") - (version "0.9.0") + (version "0.11.3") (source (origin (method url-fetch) (uri (pypi-uri name version)) (sha256 (base32 - "0y83rji4f270hbb41m4jpr0z3yzvpvbsl32mpg9d38hlydw8fk1s")))) + "1v66khq5w17xdbkpb00pf9xbl84dlzx4lq286fvzskb949b3y4yn")))) (build-system python-build-system) (arguments - `(#:python ,python-2 ; only python-2 is supported. - #:phases + `(#:phases (modify-phases %standard-phases - (add-before 'build 'disable-egg-compression - ;; Do not compress the egg. - (lambda _ - (let ((port (open-file "setup.cfg" "a"))) - (display "\n[easy_install]\nzip_ok = 0\n" - port) - (close-port port) - #t))) (add-after 'install 'install-doc (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (doc (string-append out "/share/doc/khard"))) (copy-recursively "misc/khard" doc))))))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (propagated-inputs - `(("python2-vobject" ,python2-vobject) - ("python2-pyyaml" ,python2-pyyaml) - ("python2-atomicwrites" ,python2-atomicwrites) - ("python2-configobj" ,python2-configobj))) + `(("python-vobject" ,python-vobject) + ("python-pyyaml" ,python-pyyaml) + ("python-atomicwrites" ,python-atomicwrites) + ("python-configobj" ,python-configobj))) (synopsis "Console address book using CardDAV") (description "Khard is an address book for the console. It creates, reads, modifies and removes CardDAV address book entries at your local machine. For @@ -1744,7 +1728,7 @@ for OpenSMTPD to extend its functionality.") (build-system python-build-system) (arguments `(#:tests? #f)) ; Requires mailman running - (inputs + (propagated-inputs `(("python-six" ,python-six) ("python-httplib2" ,python-httplib2))) (home-page "https://launchpad.net/mailman.client") @@ -1752,12 +1736,7 @@ for OpenSMTPD to extend its functionality.") (description "The mailmanclient library provides official Python bindings for the GNU Mailman 3 REST API.") - (properties `((python2-variant . ,(delay python2-mailmanclient)))) (license lgpl3+))) (define-public python2-mailmanclient - (let ((base (package-with-python2 - (strip-python2-variant python-mailmanclient)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools)))))) + (package-with-python2 python-mailmanclient)) diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index fcd22ee68b..d2a559c084 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -32,6 +32,7 @@ #:use-module (gnu packages guile) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages linux) + #:use-module (gnu packages hurd) #:use-module (gnu packages multiprecision) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -332,7 +333,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." #t)))) (inputs `(("binutils" ,%binutils-static))))) -(define %glibc-stripped +(define (%glibc-stripped) ;; GNU libc's essential shared libraries, dynamic linker, and headers, ;; with all references to store directories stripped. As a result, ;; libc.so is unusable and need to be patched for proper relocation. @@ -341,52 +342,26 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (name "glibc-stripped") (build-system trivial-build-system) (arguments - `(#:modules ((guix build utils)) + `(#:modules ((guix build utils) + (guix build make-bootstrap)) #:builder (begin - (use-modules (guix build utils)) - - (setvbuf (current-output-port) _IOLBF) - (let* ((out (assoc-ref %outputs "out")) - (libdir (string-append out "/lib")) - (incdir (string-append out "/include")) - (libc (assoc-ref %build-inputs "libc")) - (linux (assoc-ref %build-inputs "kernel-headers"))) - (mkdir-p libdir) - (for-each (lambda (file) - (let ((target (string-append libdir "/" - (basename file)))) - (copy-file file target) - (remove-store-references target))) - (find-files (string-append libc "/lib") - "^(crt.*|ld.*|lib(c|m|dl|rt|pthread|nsl|util).*\\.so(\\..*)?|libc_nonshared\\.a)$")) - - (copy-recursively (string-append libc "/include") incdir) - - ;; Copy some of the Linux-Libre headers that glibc headers - ;; refer to. - (mkdir (string-append incdir "/linux")) - (for-each (lambda (file) - (copy-file (string-append linux "/include/linux/" file) - (string-append incdir "/linux/" - (basename file)))) - '("limits.h" "errno.h" "socket.h" "kernel.h" - "sysctl.h" "param.h" "ioctl.h" "types.h" - "posix_types.h" "stddef.h")) - - (copy-recursively (string-append linux "/include/asm") - (string-append incdir "/asm")) - (copy-recursively (string-append linux "/include/asm-generic") - (string-append incdir "/asm-generic")) - - #t)))) - (inputs `(("libc" ,(let ((target (%current-target-system))) + (use-modules (guix build make-bootstrap)) + (make-stripped-libc (assoc-ref %outputs "out") + (assoc-ref %build-inputs "libc") + (assoc-ref %build-inputs "kernel-headers"))))) + (inputs `(("kernel-headers" + ,(if (or (and (%current-target-system) + (hurd-triplet? (%current-target-system))) + (string-suffix? "-hurd" (%current-system))) + gnumach-headers + linux-libre-headers)) + ("libc" ,(let ((target (%current-target-system))) (if target (glibc-for-bootstrap (parameterize ((%current-target-system #f)) (cross-libc target))) - glibc))) - ("kernel-headers" ,linux-libre-headers))) + glibc))))) ;; Only one output. (outputs '("out"))))) @@ -648,9 +623,9 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ;; A tarball with the statically-linked Binutils programs. (tarball-package %binutils-static-stripped)) -(define %glibc-bootstrap-tarball +(define (%glibc-bootstrap-tarball) ;; A tarball with GNU libc's shared libraries, dynamic linker, and headers. - (tarball-package %glibc-stripped)) + (tarball-package (%glibc-stripped))) (define %gcc-bootstrap-tarball ;; A tarball with a dynamic-linked GCC and its headers. @@ -690,7 +665,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." (inputs `(("guile-tarball" ,%guile-bootstrap-tarball) ("gcc-tarball" ,%gcc-bootstrap-tarball) ("binutils-tarball" ,%binutils-bootstrap-tarball) - ("glibc-tarball" ,%glibc-bootstrap-tarball) + ("glibc-tarball" ,(%glibc-bootstrap-tarball)) ("coreutils&co-tarball" ,%bootstrap-binaries-tarball))) (synopsis "Tarballs containing all the bootstrap binaries") (description synopsis) diff --git a/gnu/packages/man.scm b/gnu/packages/man.scm index 2d99438420..69c560c1b0 100644 --- a/gnu/packages/man.scm +++ b/gnu/packages/man.scm @@ -134,7 +134,7 @@ the traditional flat-text whatis databases.") (define-public man-pages (package (name "man-pages") - (version "4.08") + (version "4.09") (source (origin (method url-fetch) (uri @@ -147,7 +147,7 @@ the traditional flat-text whatis databases.") "man-pages-" version ".tar.xz"))) (sha256 (base32 - "1d32ki8nkwd2xiln619jihqn7s15ydrg7386n4hxq530sys7svic")))) + "1740gq9sq28dp5a5sjn1ya7cvrv8mbky6knb7734v8k29a7a0x55")))) (build-system gnu-build-system) (arguments '(#:phases (alist-delete 'configure %standard-phases) diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm index e432ed5c05..18b06e7765 100644 --- a/gnu/packages/maths.scm +++ b/gnu/packages/maths.scm @@ -227,14 +227,14 @@ semiconductors.") (define-public gsl (package (name "gsl") - (version "2.2.1") + (version "2.3") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/gsl/gsl-" version ".tar.gz")) (sha256 (base32 - "095hp01d8lkqdvv0p1k25kvbisgfdmvx1rzpyc2i8kl2n33kvlhk")) + "1yxdzqjwmi2aid650fa9zyr8llw069x7lm489wx9nnfdi6vh09an")) (patches (search-patches "gsl-test-i686.patch")))) (build-system gnu-build-system) (arguments @@ -425,40 +425,35 @@ singular value problems.") "See LICENSE in the distribution.")))) (define-public gnuplot - ;; Gnuplot version 5.0.4 was updated in-place, resulting in a hash mismatch. - ;; This can be removed at the next version update. - (let ((upstream-version "5.0.4") - (guix-revision "1")) - (package - (name "gnuplot") - (version (string-append upstream-version "-" guix-revision)) - (source - (origin - (method url-fetch) - (uri (string-append "mirror://sourceforge/gnuplot/gnuplot/" - upstream-version "/gnuplot-" - upstream-version ".tar.gz")) - (sha256 - (base32 - "07n3w12dkcxjnhsvsliaqnkhajhi818v6q8mkpmpbplbf92vh70m")))) - (build-system gnu-build-system) - (inputs `(("readline" ,readline) - ("cairo" ,cairo) - ("pango" ,pango) - ("gd" ,gd))) - (native-inputs `(("pkg-config" ,pkg-config) - ("texlive" ,texlive-minimal))) - (home-page "http://www.gnuplot.info") - (synopsis "Command-line driven graphing utility") - (description "Gnuplot is a portable command-line driven graphing + (package + (name "gnuplot") + (version "5.0.5") + (source (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/gnuplot/gnuplot/" + version "/gnuplot-" + version ".tar.gz")) + (sha256 + (base32 + "0lr065qdlgss8lmy31l7hkmnk9fp4lvqq9qgb1f1209f36zy1wr5")))) + (build-system gnu-build-system) + (inputs `(("readline" ,readline) + ("cairo" ,cairo) + ("pango" ,pango) + ("gd" ,gd))) + (native-inputs `(("pkg-config" ,pkg-config) + ("texlive" ,texlive-minimal))) + (home-page "http://www.gnuplot.info") + (synopsis "Command-line driven graphing utility") + (description "Gnuplot is a portable command-line driven graphing utility. It was originally created to allow scientists and students to visualize mathematical functions and data interactively, but has grown to support many non-interactive uses such as web scripting. It is also used as a plotting engine by third-party applications like Octave.") - ;; X11 Style with the additional restriction that derived works may only be - ;; distributed as patches to the original. - (license (license:fsf-free - "http://gnuplot.cvs.sourceforge.net/gnuplot/gnuplot/Copyright"))))) + ;; X11 Style with the additional restriction that derived works may only be + ;; distributed as patches to the original. + (license (license:fsf-free + "http://gnuplot.cvs.sourceforge.net/gnuplot/gnuplot/Copyright")))) (define-public gctp (package @@ -549,15 +544,20 @@ incompatible with HDF5.") (define-public hdf5 (package (name "hdf5") - (version "1.8.17") + (version "1.8.18") (source (origin (method url-fetch) - (uri (string-append "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-" - version "/src/hdf5-" - version ".tar.bz2")) + (uri (list (string-append "http://www.hdfgroup.org/ftp/HDF5/releases/" + "hdf5-" version "/src/hdf5-" + version ".tar.bz2") + (string-append "https://support.hdfgroup.org/ftp/HDF5/" + "current" + (apply string-append + (take (string-split version #\.) 2)) + "/src/hdf5-" version ".tar.bz2"))) (sha256 - (base32 "0sj8x0gfs5fb28gipnynb9wpkz113h8wq9sva9mxx66kv27xsdgw")) + (base32 "13542vrnl1p35n8vbq0wzk40vddmm33q5nh04j98c7r1yjnxxih1")) (patches (list (search-patch "hdf5-config-date.patch"))))) (build-system gnu-build-system) (inputs @@ -709,7 +709,7 @@ HDF5 file is encoded according to the HDF File Format Specification.") (define-public netcdf (package (name "netcdf") - (version "4.4.0") + (version "4.4.1.1") (source (origin (method url-fetch) @@ -717,18 +717,21 @@ HDF5 file is encoded according to the HDF File Format Specification.") "netcdf-" version ".tar.gz")) (sha256 (base32 - "0y6gdcplarwqqnrav2xg1xd6ih732rzzbmdw78v3rl5b8mwcnh0d")) - (patches (list (search-patch "netcdf-config-date.patch"))))) + "1blc7ik5yin7i0ls2kag0a9xjk12m0dzx6v1x88az3ras3scci2d")) + (patches (search-patches "netcdf-date-time.patch" + "netcdf-tst_h_par.patch")))) (build-system gnu-build-system) (native-inputs `(("m4" ,m4) ("doxygen" ,doxygen) ("graphviz" ,graphviz))) (inputs - `(("hdf5" ,hdf5) - ("zlib" ,zlib))) + `(("hdf4" ,hdf4-alt) + ("hdf5" ,hdf5) + ("zlib" ,zlib) + ("libjpeg" ,libjpeg))) (arguments - `(#:configure-flags '("--enable-doxygen" "--enable-dot") + `(#:configure-flags '("--enable-doxygen" "--enable-dot" "--enable-hdf4") #:parallel-tests? #f)) ;various race conditions (home-page "http://www.unidata.ucar.edu/software/netcdf/") (synopsis "Library for scientific data") @@ -953,14 +956,14 @@ script files.") (define-public gmsh (package (name "gmsh") - (version "2.14.1") + (version "2.15.0") (source (origin (method url-fetch) (uri (string-append "http://gmsh.info/src/gmsh-" version "-source.tgz")) (sha256 - (base32 "1vsxp47j6srmy8kqb3p1z9pmlm42whhhz7r0vzpa2a86gga4zx17")) + (base32 "02h7fk4vv8qwnq3ymm409c5sp4nksd0m9h2vkxqmy42l0ic4nalr")) (modules '((guix build utils))) (snippet ;; Remove non-free METIS code @@ -1851,7 +1854,7 @@ to BMP, JPEG or PNG image formats.") (define-public maxima (package (name "maxima") - (version "5.38.1") + (version "5.39.0") (source (origin (method url-fetch) @@ -1859,7 +1862,7 @@ to BMP, JPEG or PNG image formats.") version "-source/" name "-" version ".tar.gz")) (sha256 (base32 - "1p6646rvq43hk09msyp0dk50cqpkh07mf4x0bc2fqisqmcv6b1hf")) + "1cvignn5y6qzrby6qb885yc8zdcdqdr1d50vcvc3gapw2f0gk3zm")) (patches (search-patches "maxima-defsystem-mkdir.patch")))) (build-system gnu-build-system) (inputs @@ -1931,7 +1934,7 @@ point numbers.") (define-public wxmaxima (package (name "wxmaxima") - (version "16.04.2") + (version "16.12.0") (source (origin (method url-fetch) @@ -1939,7 +1942,7 @@ point numbers.") version "/" name "-" version ".tar.gz")) (sha256 (base32 - "1fpqzk1921isiqrpgpf433ldq41924qs9sy99fl1zn5661b2l73n")))) + "01kas9viqabw5id6crbhz8ahjimmv78gqzizs5hgnj9kngrgrm1h")))) (build-system gnu-build-system) (inputs `(("wxwidgets" ,wxwidgets) @@ -1989,14 +1992,14 @@ full text searching.") (define-public armadillo (package (name "armadillo") - (version "7.500.0") + (version "7.600.2") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/arma/armadillo-" version ".tar.xz")) (sha256 (base32 - "1x98d32cgxbzbbma2ak6c37wnbpq13xxyxyd6jjvflv748mzi9ks")))) + "0bac9y46m61zxinj51l82w06v01ra9vw7a9j6rrwdjhznkkdb437")))) (build-system cmake-build-system) (arguments `(#:tests? #f)) ;no test target (inputs @@ -2017,14 +2020,14 @@ associated functions (eg. contiguous and non-contiguous submatrix views).") (define-public armadillo-for-rcpparmadillo (package (inherit armadillo) - (version "7.500.0") + (version "7.600.1") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/arma/armadillo-" version ".tar.xz")) (sha256 (base32 - "1x98d32cgxbzbbma2ak6c37wnbpq13xxyxyd6jjvflv748mzi9ks")))))) + "1dxgfd2r9lbh24nszvqm2lag439s0srxaf1l86f6ww6waqm5r8zk")))))) (define-public muparser ;; When switching download sites, muparser re-issued a 2.2.5 release with a diff --git a/gnu/packages/mc.scm b/gnu/packages/mc.scm index 43dab8ff41..3cdc542157 100644 --- a/gnu/packages/mc.scm +++ b/gnu/packages/mc.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> ;;; ;;; This file is part of GNU Guix. ;;; @@ -53,7 +54,18 @@ ("check" ,check))) (arguments `(#:configure-flags - '("--with-screen=ncurses" "--enable-aspell"))) + '("--with-screen=ncurses" "--enable-aspell") + #:phases + (modify-phases %standard-phases + (add-after 'patch-source-shebangs 'fix-absolutism + (lambda _ + ;; Modify files that contain absolute file names. + (substitute* "misc/mcedit.menu.in" + (("#! /bin/sh") (string-append "#!" (which "sh"))) + (("/bin/bash") (which "bash"))) + (substitute* "misc/ext.d/misc.sh.in" + (("/bin/cat") "cat")) + #t))))) (home-page "http://www.midnight-commander.org") (synopsis "Graphical file manager") (description diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm index 8660915bb0..95c265b987 100644 --- a/gnu/packages/messaging.scm +++ b/gnu/packages/messaging.scm @@ -34,6 +34,7 @@ #:use-module (guix build-system glib-or-gtk) #:use-module (guix build-system python) #:use-module (guix build-system perl) + #:use-module (guix build-system cmake) #:use-module (gnu packages) #:use-module (gnu packages aidc) #:use-module (gnu packages autotools) @@ -399,14 +400,14 @@ compromised.") (define-public znc (package (name "znc") - (version "1.6.3") + (version "1.6.4") (source (origin (method url-fetch) (uri (string-append "http://znc.in/releases/archive/znc-" version ".tar.gz")) (sha256 (base32 - "09xqi5fs40x6nj9gq99bnw1a7saq96bvqxknxx0ilq7yfvg4c733")))) + "070d6b1i3jy66m4ci4ypxkg4pbwqbzbzss1y1ycgq2w62zmrf423")))) (build-system gnu-build-system) (arguments '(#:tests? #f ; tries to download GoogleTest with wget @@ -622,49 +623,98 @@ protocols.") (license license:gpl3+) (home-page "https://tox.chat")))) +;; Some tox clients move to c-toxcore, which seems to be where all the +;; recent development happens. It is run by the same developers as toxcore, +;; forked into a group namespace. +(define-public c-toxcore + (package + (name "c-toxcore") + (version "0.1.1") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/TokTok/c-toxcore/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0dybpz44pi0zm8djppjna0r8yh5wvl3l885dv2f1wp5366bk59n3")))) + (build-system gnu-build-system) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("check" ,check) + ("pkg-config" ,pkg-config))) + (inputs + `(("libsodium" ,libsodium) + ("opus" ,opus) + ("libvpx" ,libvpx))) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'autoconf + ;; The tarball source is not bootstrapped. + (lambda _ + (zero? (system* "autoreconf" "-vfi"))))) + #:tests? #f)) ; FIXME: Testsuite fails, needs internet connection. + (synopsis "Library for the Tox encrypted messenger protocol") + (description + "Official fork of the C library implementation of the Tox +encrypted messenger protocol.") + (license license:gpl3+) + (home-page "https://tox.chat"))) + (define-public utox (package (name "utox") - (version "0.9.8") + (version "0.11.0") (source (origin (method url-fetch) - (uri (string-append "https://github.com/GrayHatter/uTox/archive/v" + (uri (string-append "https://github.com/uTox/uTox/archive/v" version ".tar.gz")) (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "13hfqbwzcgvfbvf9yjm62aqsvxnpqppb50c88sys43m7022yqcsy")))) - (build-system gnu-build-system) + "15s4iwjk1s0kihjqn0f07c9618clbphpr827mds3xddkiwnjz37v")))) + (build-system cmake-build-system) (arguments - '(#:make-flags (list (string-append "PREFIX=" %output) - "CC=gcc") - #:tests? #f ; No tests + '(#:tests? #f ; No test phase. #:phases (modify-phases %standard-phases - ;; No configure script - (delete 'configure)))) + (add-after 'unpack 'fix-freetype-include + (lambda _ + (substitute* "CMakeLists.txt" + (("/usr/include/freetype2") + (string-append (assoc-ref %build-inputs "freetype") + "/include/freetype2"))))) + (add-before 'install 'patch-cmake-find-utox + (lambda _ + (substitute* "../build/cmake_install.cmake" + (("/uTox-0.11.0/utox") + "/build/utox"))))))) (inputs + ;; TODO: Fix the file chooser dialog; which input does it need? `(("dbus" ,dbus) ("filteraudio" ,filteraudio) ("fontconfig" ,fontconfig) ("freetype" ,freetype) ("libsodium" ,libsodium) - ("libtoxcore" ,libtoxcore) + ("c-toxcore" ,c-toxcore) ("libvpx" ,libvpx) ("libx11" ,libx11) ("libxext" ,libxext) ("libxrender" ,libxrender) ("openal" ,openal) ("v4l-utils" ,v4l-utils))) - (native-inputs - `(("pkg-config" ,pkg-config))) (synopsis "Lightweight Tox client") - (description "A lightweight Tox client. Tox is a distributed and secure + (description + "Utox is a lightweight Tox client. Tox is a distributed and secure instant messenger with audio and video chat capabilities.") (home-page "http://utox.org/") (license license:gpl3))) - + (define-public qtox (package (name "qtox") diff --git a/gnu/packages/mingw.scm b/gnu/packages/mingw.scm new file mode 100644 index 0000000000..6a348da611 --- /dev/null +++ b/gnu/packages/mingw.scm @@ -0,0 +1,84 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages mingw) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (gnu packages) + #:use-module (gnu packages base) + #:use-module (gnu packages cross-base) + #:use-module (gnu packages gcc) + #:use-module (gnu packages compression) + #:use-module (gnu packages multiprecision) + #:use-module (guix build-system gnu) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix utils) + #:use-module (ice-9 match)) + +(define %mingw-triplet + "i686-w64-mingw32") + +(define-public mingw-w64 + (package + (name "mingw-w64") + (version "5.0-rc2") + (source (origin + (method url-fetch) + (uri (string-append + "https://sourceforge.net/projects/mingw-w64/files/mingw-w64/" + "mingw-w64-release/mingw-w64-v" version ".tar.bz2")) + (sha256 + (base32 "0imdary8j07if8ih73pfgxiclpf2ax8h3mz8mxln07i8sbbd30c9")) + (patches (search-patches "mingw-w64-5.0rc2-gcc-4.9.3.patch")))) + (native-inputs `(("xgcc-core" ,(cross-gcc %mingw-triplet)) + ("xbinutils" ,(cross-binutils %mingw-triplet)))) + (build-system gnu-build-system) + (search-paths + (list (search-path-specification + (variable "CROSS_C_INCLUDE_PATH") + (files '("include" "i686-w64-mingw32/include"))) + (search-path-specification + (variable "CROSS_LIBRARY_PATH") + (files + '("lib" "lib64" "i686-w64-mingw32/lib" "i686-w64-mingw32/lib64"))))) + (arguments + `(#:configure-flags '("--host=i686-w64-mingw32") + #:phases + (modify-phases %standard-phases + (add-before 'configure 'setenv + (lambda* (#:key inputs #:allow-other-keys) + (let ((xgcc-core (assoc-ref inputs "xgcc-core")) + (mingw-headers (string-append (getcwd) "/mingw-w64-headers"))) + (setenv "CPP" + (string-append xgcc-core "/bin/i686-w64-mingw32-cpp")) + (setenv "CROSS_C_INCLUDE_PATH" + (string-append + mingw-headers + ":" mingw-headers "/include" + ":" mingw-headers "/crt" + ":" mingw-headers "/defaults/include" + ":" mingw-headers "/direct-x/include")))))) + #:make-flags (list "DEFS=-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=1") + #:tests? #f ; compiles and includes glibc headers + #:strip-binaries? #f)) + (home-page "http://mingw.org") + (synopsis "Minimalist GNU for Windows") + (description "MinGW provides a complete Open Source programming tool set +which is suitable for the development of native MS-Windows applications, and +which does not depend on any 3rd-party C-Runtime dlls.") + (license license:fdl1.3+))) diff --git a/gnu/packages/monitoring.scm b/gnu/packages/monitoring.scm new file mode 100644 index 0000000000..ac80a6bb9d --- /dev/null +++ b/gnu/packages/monitoring.scm @@ -0,0 +1,125 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages monitoring) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix build-system perl) + #:use-module (guix build-system gnu) + #:use-module (gnu packages base) + #:use-module (gnu packages compression) + #:use-module (gnu packages gd) + #:use-module (gnu packages image) + #:use-module (gnu packages mail) + #:use-module (gnu packages perl) + #:use-module (gnu packages zip)) + +(define-public nagios + (package + (name "nagios") + (version "4.2.4") + ;; XXX: Nagios 4.2.x and later bundle a copy of AngularJS. + (source (origin + (method url-fetch) + (uri (string-append + "mirror://sourceforge/nagios/nagios-4.x/nagios-" + version "/nagios-" version ".tar.gz")) + (sha256 + (base32 + "0w0blbwiw0ps04b7gkyyk89qkgwsxh6gydhmggbm1kl3ar3mq1dh")) + (modules '((guix build utils))) + (snippet + ;; Ensure reproducibility. + '(substitute* (find-files "cgi" "\\.c$") + (("__DATE__") "\"1970-01-01\"") + (("__TIME__") "\"00:00:00\""))))) + (build-system gnu-build-system) + (native-inputs + `(("unzip" ,unzip))) + (inputs + `(("zlib" ,zlib) + ("libpng-apng" ,libpng) + ("gd" ,gd) + ("perl" ,perl) + ("mailutils" ,mailutils))) + (arguments + '(#:configure-flags (list "--sysconfdir=/etc" + + ;; 'include/locations.h.in' defines file + ;; locations, and many things go directly under + ;; LOCALSTATEDIR, hence the extra '/nagios'. + "--localstatedir=/var/nagios" + + (string-append + "--with-mail=" + (assoc-ref %build-inputs "mailutils") + "/bin/mail")) + #:make-flags '("all") + #:phases (modify-phases %standard-phases + (add-before 'build 'do-not-chown-to-nagios + (lambda _ + ;; Makefiles do 'install -o nagios -g nagios', which + ;; doesn't work for us. + (substitute* (find-files "." "^Makefile$") + (("-o nagios -g nagios") + "")) + #t)) + (add-before 'build 'do-not-create-sysconfdir + (lambda _ + ;; Don't try to create /var upon 'make install'. + (substitute* "Makefile" + (("\\$\\(INSTALL\\).*\\$\\(LOGDIR\\).*$" all) + (string-append "# " all)) + (("\\$\\(INSTALL\\).*\\$\\(CHECKRESULTDIR\\).*$" all) + (string-append "# " all)) + (("chmod g\\+s.*" all) + (string-append "# " all))) + #t)) + (add-before 'build 'set-html/php-directory + (lambda _ + ;; Install HTML and PHP files under 'share/nagios/html' + ;; instead of just 'share/'. + (substitute* '("html/Makefile" "Makefile") + (("HTMLDIR=.*$") + "HTMLDIR = $(datarootdir)/nagios/html\n")) + #t))) + #:tests? #f)) ;no 'check' target or similar + (home-page "https://www.nagios.org/") + (synopsis "Host, service, and network monitoring program") + (description + "Nagios is a host, service, and network monitoring program written in C. +CGI programs are included to allow you to view the current status, history, +etc. via a Web interface. Features include: + +@itemize +@item Monitoring of network services (via SMTP, POP3, HTTP, PING, etc). +@item Monitoring of host resources (processor load, disk usage, etc.). +@item A plugin interface to allow for user-developed service monitoring + methods. +@item Ability to define network host hierarchy using \"parent\" hosts, + allowing detection of and distinction between hosts that are down + and those that are unreachable. +@item Notifications when problems occur and get resolved (via email, + pager, or user-defined method). +@item Ability to define event handlers for proactive problem resolution. +@item Automatic log file rotation/archiving. +@item Optional web interface for viewing current network status, + notification and problem history, log file, etc. +@end itemize\n") + (license license:gpl2))) diff --git a/gnu/packages/moreutils.scm b/gnu/packages/moreutils.scm index 79ab9bbc9a..965876b971 100644 --- a/gnu/packages/moreutils.scm +++ b/gnu/packages/moreutils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,43 +30,42 @@ (define-public moreutils (package (name "moreutils") - (version "0.58") - (source (origin - (method url-fetch) - (uri (list - (string-append - "mirror://debian/pool/main/m/moreutils/moreutils_" - version ".orig.tar.gz") - ;; The main Debian mirrors only hold the current packages - (string-append - "http://snapshot.debian.org/archive/debian/20160304T165744Z" - "/pool/main/m/moreutils/moreutils_0.58.orig.tar.gz"))) - (sha256 - (base32 - "02n00vqp6jxbxr5v3rdjxmzp6kxxjdkjgcclam6wrw8qamsbljww")))) + (version "0.59") + (source + (origin + (method url-fetch) + (uri (list + (string-append + "mirror://debian/pool/main/m/moreutils/moreutils_" + version ".orig.tar.gz") + ;; The main Debian mirrors only hold the current packages. + (string-append + "http://snapshot.debian.org/archive/debian/20161223T212806Z" + "/pool/main/m/moreutils/moreutils_0.59.orig.tar.gz"))) + (sha256 + (base32 + "1d6ik3j4lwp90vb93p7yv60k6vk2chz448d1z9xrmxvv371i33m4")))) (build-system gnu-build-system) - (inputs `(("perl" ,perl) - ("libxml2" ,libxml2) - ("libxslt" ,libxslt) - ("docbook-xml" ,docbook-xml-4.4) - ("docbook-xsl" ,docbook-xsl))) + ;; For building the manual pages. + (native-inputs + `(("docbook-xml" ,docbook-xml-4.4) + ("docbook-xsl" ,docbook-xsl) + ("libxml2" ,libxml2) + ("libxslt" ,libxslt))) + (inputs + `(("perl" ,perl))) (arguments `(#:phases (modify-phases %standard-phases - (replace 'configure - (lambda* (#:key inputs #:allow-other-keys) - (use-modules (srfi srfi-1)) - (substitute* "Makefile" - (("/usr/share/xml/.*/docbook.xsl") - (let* ((docbook-xsl (assoc-ref inputs "docbook-xsl")) - (files (find-files docbook-xsl "^docbook\\.xsl$"))) - (find (lambda (file) - (string-suffix? "/manpages/docbook.xsl" file)) - files))))))) + (delete 'configure)) ; no configure script #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")) + (string-append "DOCBOOKXSL=" + (assoc-ref %build-inputs "docbook-xsl") "/xml/xsl/" + ,(package-name docbook-xsl) "-" + ,(package-version docbook-xsl)) "CC=gcc"))) - (home-page "http://joeyh.name/code/moreutils/") + (home-page "https://joeyh.name/code/moreutils/") (synopsis "Miscellaneous general-purpose command-line tools") (description "Moreutils is a collection of general-purpose command-line tools to diff --git a/gnu/packages/mp3.scm b/gnu/packages/mp3.scm index 7f0099ee6d..4f799bd200 100644 --- a/gnu/packages/mp3.scm +++ b/gnu/packages/mp3.scm @@ -145,14 +145,14 @@ a highly stable and efficient implementation.") (define-public taglib (package (name "taglib") - (version "1.9.1") + (version "1.10") (source (origin (method url-fetch) (uri (string-append "http://taglib.github.io/releases/taglib-" version ".tar.gz")) (sha256 (base32 - "06n7gnbcqa3r6c9gv00y0y1r48dyyazm6yj403i7ma0r2k6p3lvj")))) + "1alv6vp72p0x9i9yscmz2a71anjwqy53y9pbcbqxvc1c0i82vhr4")))) (build-system cmake-build-system) (arguments '(#:tests? #f)) ;no 'test' target (inputs `(("zlib" ,zlib))) @@ -392,7 +392,7 @@ Ogg, MP3, or FLAC formats. Its goal is to be easy to use, requiring only a few mouse clicks to convert an entire album. It supports CDDB lookups for album and track information.") (license license:gpl2) - (home-page "http://sourceforge.net/projects/ripperx/"))) + (home-page "https://sourceforge.net/projects/ripperx/"))) (define-public libmpcdec (package @@ -471,8 +471,7 @@ compression format (.mpc files).") (arguments `(#:python ,python-2)) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-nose" ,python2-nose) + `(("python2-nose" ,python2-nose) ("python2-sphinx" ,python2-sphinx) ("python2-coverage" ,python2-coverage))) (synopsis "MP3 tag ID3 metadata editor") diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm index d3da5f5daa..5231c3f7f7 100644 --- a/gnu/packages/mpd.scm +++ b/gnu/packages/mpd.scm @@ -74,7 +74,7 @@ interfacing MPD in the C, C++ & Objective C languages.") (define-public mpd (package (name "mpd") - (version "0.19.19") + (version "0.19.21") (source (origin (method url-fetch) (uri @@ -83,8 +83,19 @@ interfacing MPD in the C, C++ & Objective C languages.") "/mpd-" version ".tar.xz")) (sha256 (base32 - "07af1m2lgblyiq0gcs26zv8n22wrhrpmf49xsm338h1n87d6r1dw")))) + "0c0p61p3jfh89pnqwd9nrw55krfvvnzhkpdq53g6njvg0aybh1c3")))) (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'install-service-files + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (systemd (string-append out "/etc/systemd/system")) + (systemd-user (string-append out "/etc/systemd/user"))) + (install-file "systemd/system/mpd.service" systemd) + (install-file "systemd/user/mpd.service" systemd-user) + #t)))))) (inputs `(("ao" ,ao) ("alsa-lib" ,alsa-lib) ("avahi" ,avahi) @@ -257,15 +268,10 @@ information about tracks being played to a scrobbler, such as Libre.FM.") (synopsis "Python MPD client library") (description "Python-mpd2 is a Python library which provides a client interface for the Music Player Daemon.") - (license license:lgpl3+) - (properties `((python2-variant . ,(delay python2-mpd2)))))) + (license license:lgpl3+))) (define-public python2-mpd2 - (let ((mpd2 (package-with-python2 - (strip-python2-variant python-mpd2)))) - (package (inherit mpd2) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs mpd2)))))) + (package-with-python2 python-mpd2)) (define-public sonata (package diff --git a/gnu/packages/mtools.scm b/gnu/packages/mtools.scm index a95b8ef5e9..34bcb5d803 100644 --- a/gnu/packages/mtools.scm +++ b/gnu/packages/mtools.scm @@ -21,8 +21,7 @@ #:use-module (guix licenses) #:use-module (guix packages) #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module (gnu packages python)) + #:use-module (guix build-system gnu)) (define-public mtools (package @@ -49,7 +48,7 @@ FAT-specific file attributes.") (define-public exfat-utils (package (name "exfat-utils") - (version "1.2.4") + (version "1.2.5") (source (origin (method url-fetch) (uri (string-append @@ -57,7 +56,7 @@ FAT-specific file attributes.") version "/" name "-" version ".tar.gz")) (sha256 (base32 - "04dvrdmwmj9ggad8aq6inbjcq2yi9i62z42nnivhk7bb84k1k9ba")))) + "1qhvjd6dmzhxjdnm4cklajbr03wsjjvkxrsjij517a33napcl93s")))) (build-system gnu-build-system) (home-page "https://github.com/relan/exfat") (synopsis "Utilities to manipulate exFAT file systems") diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm index 80fb11ac93..b6d2d7f4af 100644 --- a/gnu/packages/multiprecision.scm +++ b/gnu/packages/multiprecision.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -49,7 +50,13 @@ '(;; Build a "fat binary", with routines for several ;; sub-architectures. "--enable-fat" - "--enable-cxx"))) + "--enable-cxx" + ,@(cond ((target-mingw?) + ;; Static and shared cannot be built in one go: + ;; they produce different headers. We need shared. + `("--disable-static" + "--enable-shared")) + (else '()))))) (synopsis "Multiple-precision arithmetic library") (description "GMP is a library for arbitrary precision arithmetic, operating on diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm index 78ca558b2d..59fd508f62 100644 --- a/gnu/packages/music.scm +++ b/gnu/packages/music.scm @@ -231,6 +231,85 @@ score, keyboard, guitar, drum and controller views.") many input formats and provides a customisable Vi-style user interface.") (license license:gpl2+))) +(define-public denemo + (package + (name "denemo") + (version "2.0.14") + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/denemo/denemo-" + version ".tar.gz")) + (sha256 + (base32 + "1a7g38695g7jjypx25qp0dx0asrh72xwdj0mdhmb9pfyzlppq0wh")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + ;; Denemo's documentation says to use this command to run its + ;; testsuite. + (lambda _ + (zero? (system* "make" "-C" "tests" "check")))) + (add-before 'build 'set-lilypond + ;; This phase sets the default path for lilypond to its current + ;; location in the store. + (lambda* (#:key inputs #:allow-other-keys) + (let* ((lilypond (string-append (assoc-ref inputs "lilypond") + "/bin/lilypond"))) + (substitute* "src/core/prefops.c" + (("g_string_new \\(\"lilypond\"\\);") + (string-append "g_string_new (\"" + lilypond + "\");")))) + #t)) + (add-after 'install 'correct-filename + ;; "graft-derivation/shallow" from the (guix grafts) module runs in + ;; the C locale, expecting file names to be ASCII encoded. This + ;; phase renames a filename with a Unicode character in it to meet + ;; the aforementioned condition. + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (chdir (string-append + out + "/share/denemo/templates/instruments/woodwind")) + (rename-file "Clarinet in B♭.denemo" + "Clarinet in Bb.denemo")) + #t))))) + (native-inputs + `(("glib:bin", glib "bin") ; for gtester + ("pkg-config" ,pkg-config))) + (inputs + `(("alsa-lib" ,alsa-lib) + ("aubio" ,aubio) + ("evince" ,evince) + ("fftw" ,fftw) + ("fluidsynth" ,fluidsynth) + ("glib" ,glib) + ("gtk+" ,gtk+) + ("gtk-doc" ,gtk-doc) + ("gtksourceview" ,gtksourceview) + ("guile" ,guile-2.0) + ("intltool" ,intltool) + ("librsvg" ,librsvg) + ("libsndfile" ,libsndfile) + ("libtool" ,libtool) + ("libxml2" ,libxml2) + ("lilypond", lilypond) + ("portaudio" ,portaudio) + ("portmidi" ,portmidi) + ("rubberband" ,rubberband))) + (synopsis "Graphical music notation, front-end to GNU Lilypond") + (description + "GNU Denemo is a music notation editor that provides a convenient +interface to the powerful music engraving program Lilypond. Music can be +typed in using the computer keyboard, played in using a MIDI keyboard, or +even input via a microphone connected to the sound card. The final product +is publication-quality music notation that is continuously generated in the +background while you work.") + (home-page "http://www.denemo.org") + (license license:gpl3+))) + (define-public hydrogen (package (name "hydrogen") @@ -588,11 +667,12 @@ Guile.") (define-public non-sequencer ;; The latest tagged release is three years old and uses a custom build - ;; system, so we take the last commit affecting the "sequencer" directory. - (let ((commit "1d9bd576f6bf7ea240af5f7a60260592750af0dd")) + ;; system, so we take the last commit. + (let ((commit "a22f33f486a5c6f75b60e36f66504c036c0f6f8c") + (revision "2")) (package (name "non-sequencer") - (version (string-append "1.9.5-" (string-take commit 7))) + (version (string-append "1.9.5-" revision "." (string-take commit 7))) (source (origin (method git-fetch) (uri (git-reference @@ -600,7 +680,7 @@ Guile.") (commit commit))) (sha256 (base32 - "0pkkw8q6d55j38xm7r4rwpdv1wy00a44h8c4wrn7vbgpq9nij46y")) + "09q5x8i4f8mqnl8w6xnsq5zriy4bzdl4x2vq9n34a433rfrk84bg")) (file-name (string-append name "-" version "-checkout")))) (build-system waf-build-system) (arguments @@ -638,6 +718,28 @@ Sequencer happens on-line, in real-time. Music can be composed live, while the transport is rolling.") (license license:gpl2+)))) +(define-public non-session-manager + (package (inherit non-sequencer) + (name "non-session-manager") + (arguments + (substitute-keyword-arguments (package-arguments non-sequencer) + ((#:configure-flags flags) + `(cons "--project=session-manager" + (delete "--project=sequencer" ,flags))))) + (inputs + `(("jack" ,jack-1) + ("liblo" ,liblo) + ("ntk" ,ntk))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "http://non.tuxfamily.org/nsm/") + (synopsis "Audio session management") + (description + "The Non Session Manager is an API and an implementation for audio +session management. NSM clients use a well-specified OSC protocol to +communicate with the session management daemon.") + (license license:gpl2+))) + (define-public solfege (package (name "solfege") @@ -1090,7 +1192,6 @@ Laurens Hammond and Don Leslie.") `(("rapicorn" ,rapicorn) ("guile" ,guile-1.8) ("python" ,python-2) - ("cython" ,python2-cython) ("libgnomecanvas" ,libgnomecanvas) ("libogg" ,libogg) ("libmad" ,libmad) @@ -1101,6 +1202,7 @@ Laurens Hammond and Don Leslie.") (native-inputs `(("pkg-config" ,pkg-config) ("glib:bin" ,glib "bin") + ("cython" ,python2-cython) ("perl" ,perl) ("perl-xml-parser" ,perl-xml-parser))) (home-page "https://testbit.eu/wiki/Beast_Home") @@ -1382,10 +1484,10 @@ using a system-independent interface.") #t))))) (inputs `(("portmidi" ,portmidi) - ("alsa-lib" ,alsa-lib) - ("python-cython" ,python-cython))) + ("alsa-lib" ,alsa-lib))) (native-inputs - `(("unzip" ,unzip))) + `(("python-cython" ,python-cython) + ("unzip" ,unzip))) (home-page "http://portmedia.sourceforge.net/portmidi/") (synopsis "Python bindings to PortMidi") (description @@ -1405,6 +1507,7 @@ using a system-independent interface.") (base32 "1rnk8i8dlshzx16n2qxcsqcs7kywgyazzyzw2vy4vp2gsm9vs9ml")))) (build-system python-build-system) + (arguments `(#:tests? #f)) ; no tests included (inputs `(("lilypond" ,lilypond) ("portmidi" ,portmidi) @@ -1474,7 +1577,7 @@ backends, including ALSA, OSS, Network and FluidSynth.") (define-public zynaddsubfx (package (name "zynaddsubfx") - (version "3.0.0") + (version "3.0.1") (source (origin (method url-fetch) (uri (string-append @@ -1482,7 +1585,7 @@ backends, including ALSA, OSS, Network and FluidSynth.") version "/zynaddsubfx-" version ".tar.bz2")) (sha256 (base32 - "0p640hlw28264nzrnd2lm4bi5snas4fvh80p8lpxvph2hjw3sncl")))) + "1qijvlbv41lnqaqbp6gh1i42xzf1syviyxz8wr39xbz55cw7y0d8")))) (build-system cmake-build-system) (arguments `(#:phases @@ -1520,7 +1623,7 @@ capabilities, custom envelopes, effects, etc.") (define-public yoshimi (package (name "yoshimi") - (version "1.4.1") + (version "1.5.0") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/yoshimi/" @@ -1528,7 +1631,7 @@ capabilities, custom envelopes, effects, etc.") "/yoshimi-" version ".tar.bz2")) (sha256 (base32 - "133sx42wb66g803pcrgdwph40wh94knvab3yfqkgm0001jv4v14y")))) + "10s1i18xlmvqfrnr0zn2mj2b28i7p62dlqzzzkmpaapqj1gsgpz5")))) (build-system cmake-build-system) (arguments `(#:tests? #f ; there are no tests @@ -1673,6 +1776,48 @@ JACK for audio and ALSA sequencer for MIDI as multimedia infrastructures and follows a traditional multi-track tape recorder control paradigm.") (license license:gpl2+))) +(define-public ams-lv2 + (package + (name "ams-lv2") + (version "1.2.0") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/blablack/ams-lv2/" + "archive/" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1392spswkhfd38fggf584wb3m8aqpg7csfrs9zxnzyvhgmp0fgqk")))) + (build-system waf-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'remove-sse-flags + (lambda* (#:key system #:allow-other-keys) + (when (not (or (string-prefix? "x86_64" system) + (string-prefix? "i686" system))) + (substitute* "wscript" + (("'-msse', '-mfpmath=sse', ") "")) + #t)))) + #:tests? #f)) ; no tests + (inputs + `(("lv2" ,lv2) + ("lvtk" ,lvtk) + ("gtkmm" ,gtkmm-2) + ("gtk" ,gtk+-2) + ("cairo" ,cairo) + ("fftw" ,fftw))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "https://objectivewave.wordpress.com/ams-lv2/") + (synopsis "Port of Alsa Modular Synth internal modules into LV2") + (description "This set of LV2 plugins is a port of the internal modules +found in Alsa Modular Synth. These plugins are used to create modular +synthesizers and contain: VCO, VCF, VCA, LFO, slew limiter, envelopes, sample +and hold, etc.") + (license license:gpl2))) + (define-public gxtuner (package (name "gxtuner") @@ -1744,8 +1889,8 @@ analogue-like user interface.") #t))))) (inputs `(("lilv" ,lilv) - ("fftw" ,fftw) - ("fftwf" ,fftwf) + ("fftw" ,fftw-with-threads) + ("fftwf" ,fftwf-with-threads) ("lv2" ,lv2) ("jack" ,jack-1) ("readline" ,readline))) @@ -1796,14 +1941,16 @@ event-based scripts for scrobbling, notifications, etc.") (define-public python-mutagen (package (name "python-mutagen") - (version "1.31") + (version "1.35.1") (source (origin (method url-fetch) (uri (pypi-uri "mutagen" version)) (sha256 (base32 - "16fnnhspniac2i7qswxafawsh2x2a803hmc6bn9k1zl5fxq1380a")))) + "0klk68c1n3285vvm2xzk8ii7mlqp1dxii04askan0gi1wlpagka9")))) (build-system python-build-system) + (native-inputs + `(("python-pytest" ,python-pytest))) (home-page "https://bitbucket.org/lazka/mutagen") (synopsis "Read and write audio tags") (description "Mutagen is a Python module to handle audio metadata. It @@ -1821,14 +1968,18 @@ streams on an individual packet/page level.") (define-public python-musicbrainzngs (package (name "python-musicbrainzngs") - (version "0.5") + (version "0.6") (source (origin (method url-fetch) (uri (pypi-uri "musicbrainzngs" version)) (sha256 (base32 - "12f48llmdf5rkiqxcb70k2k1dmhm8byq0ifazvlrca8dfnmqh4r8")))) + "1dddarpjawryll2wss65xq3v9q8ln8dan7984l5dxzqx88d2dvr8")))) (build-system python-build-system) + (arguments + '(;; The tests fail suffer from race conditions: + ;; https://github.com/alastair/python-musicbrainzngs/issues/211 + #:tests? #f)) (home-page "https://python-musicbrainzngs.readthedocs.org/") (synopsis "Python bindings for MusicBrainz NGS webservice") (description "Musicbrainzngs implements Python bindings of the MusicBrainz @@ -1855,7 +2006,6 @@ MusicBrainz database.") `(;; Python 3 is not supported: ;; https://github.com/echonest/pyechonest/issues/42 #:python ,python-2)) - (native-inputs `(("python2-setuptools" ,python2-setuptools))) (home-page "https://github.com/echonest/pyechonest") (synopsis "Python interface to The Echo Nest APIs") (description "Pyechonest is a Python library for the Echo Nest API. With @@ -1877,13 +2027,13 @@ detailed track info including timbre, pitch, rhythm and loudness information. (define-public python-pylast (package (name "python-pylast") - (version "1.5.1") + (version "1.6.0") (source (origin (method url-fetch) (uri (pypi-uri "pylast" version)) (sha256 (base32 - "10znd9xr1vs2ix519jkz3ccm90zciaddcdr2w2wrrh2jyy3bc59a")))) + "0bml11gfkxqd3i2jxkn5k2xllc4rvxjcyhs8an05gcyy1zp2bwvb")))) (build-system python-build-system) (native-inputs `(("python-coverage" ,python-coverage) @@ -1898,58 +2048,50 @@ detailed track info including timbre, pitch, rhythm and loudness information. (synopsis "Python interface to Last.fm and Libre.fm") (description "A Python interface to Last.fm and other API-compatible websites such as Libre.fm.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-pylast)))))) + (license license:asl2.0))) (define-public python2-pylast - (let ((pylast (package-with-python2 - (strip-python2-variant python-pylast)))) - (package (inherit pylast) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs pylast)))))) + (package-with-python2 python-pylast)) (define-public beets (package (name "beets") - (version "1.3.19") + (version "1.4.2") (source (origin (method url-fetch) (uri (pypi-uri "beets" version)) (sha256 (base32 - "1vi1dh3fr554bnm8y9pjy09hblw18v6cl2jppzwlp72afri1w93b")))) + "0sna2hx8sdaa36jnvw5a7m31wzfm717lw2ixh906fsfp43i74k5m")))) (build-system python-build-system) (arguments - `(#:python ,python-2 ; only Python 2 is supported - #:phases + `(#:phases (modify-phases %standard-phases (add-after 'unpack 'set-HOME (lambda _ (setenv "HOME" (string-append (getcwd) "/tmp")))) (replace 'check (lambda _ (zero? (system* "nosetests" "-v"))))))) (native-inputs - `(("python2-beautifulsoup4" ,python2-beautifulsoup4) - ("python2-flask" ,python2-flask) - ("python2-setuptools" ,python2-setuptools) - ("python2-mock" ,python2-mock) - ("python2-mpd2" ,python2-mpd2) - ("python2-nose" ,python2-nose) - ("python2-pathlib" ,python2-pathlib) - ("python2-pyxdg" ,python2-pyxdg) - ("python2-pyechonest" ,python2-pyechonest) - ("python2-pylast" ,python2-pylast) - ("python2-rarfile" ,python2-rarfile) - ("python2-responses" ,python2-responses))) + `(("python-beautifulsoup4" ,python-beautifulsoup4) + ("python-flask" ,python-flask) + ("python-mock" ,python-mock) + ("python-mpd2" ,python-mpd2) + ("python-nose" ,python-nose) + ("python-pathlib" ,python-pathlib) + ("python-pyxdg" ,python-pyxdg) + ("python-pylast" ,python-pylast) + ("python-rarfile" ,python-rarfile) + ("python-responses" ,python-responses))) ;; TODO: Install optional plugins and dependencies. (inputs - `(("python2-enum34" ,python2-enum34) - ("python2-jellyfish" ,python2-jellyfish) - ("python2-munkres" ,python2-munkres) - ("python2-musicbrainzngs" ,python2-musicbrainzngs) - ("python2-mutagen" ,python2-mutagen) - ("python2-pyyaml" ,python2-pyyaml) - ("python2-unidecode" ,python2-unidecode))) + `(("python-discogs-client" ,python-discogs-client) + ("python-enum34" ,python-enum34) + ("python-jellyfish" ,python-jellyfish) + ("python-munkres" ,python-munkres) + ("python-musicbrainzngs" ,python-musicbrainzngs) + ("python-mutagen" ,python-mutagen) + ("python-pyyaml" ,python-pyyaml) + ("python-unidecode" ,python-unidecode))) (home-page "http://beets.io") (synopsis "Music organizer") (description "The purpose of beets is to get your music collection right @@ -2421,3 +2563,178 @@ a simulation of an analog Wah pedal with switchless activation.")))) filters, crossovers, simple gain plugins without zipper noise, switch box plugins, a switch trigger, a toggle switch, and a peakmeter.") (license license:gpl2+)))) + +(define-public ingen + (let ((commit "fd147d0b888090bfb897505852c1f25dbdf77e18") + (revision "1")) + (package + (name "ingen") + (version (string-append "0.0.0-" revision "." + (string-take commit 9))) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "http://git.drobilla.net/ingen.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "1qmg79962my82c43vyrv5sxbqci9c7gc2s9bwaaqd0fcf08xcz1z")))) + (build-system waf-build-system) + (arguments + `(#:tests? #f ; no "check" target + #:configure-flags (list "--no-webkit") + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-wscript + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (substitute* "wscript" + ;; FIXME: Our version of lv2specgen.py does not behave as + ;; expected. Maybe this requires a development version of + ;; LV2. + (("lv2specgen.py") "touch ingen.lv2/ingen.html; echo") + ;; Add libraries to RUNPATH. + (("^(.+)target.*= 'src/ingen/ingen'," line prefix) + (string-append prefix + "linkflags=[\"-Wl,-rpath=" + out "/lib" "\"]," line))) + (substitute* '("src/wscript" + "src/server/wscript") + ;; Add libraries to RUNPATH. + (("bld.env.PTHREAD_LINKFLAGS" line) + (string-append line + " + [\"-Wl,-rpath=" out "/lib" "\"]"))) + (substitute* "src/client/wscript" + ;; Add libraries to RUNPATH. + (("^(.+)target.*= 'ingen_client'," line prefix) + (string-append prefix + "linkflags=[\"-Wl,-rpath=" + out "/lib" "\"]," line))) + (substitute* "src/gui/wscript" + ;; Add libraries to RUNPATH. + (("^(.+)target.* = 'ingen_gui.*" line prefix) + (string-append prefix + "linkflags=[\"-Wl,-rpath=" + out "/lib" "\"]," line)))) + #t))))) + (inputs + `(("boost" ,boost) + ("python-rdflib" ,python-rdflib) + ("python" ,python) + ("jack" ,jack-1) + ("lv2" ,lv2) + ("lilv" ,lilv) + ("raul" ,raul-devel) + ("ganv" ,ganv-devel) + ("suil" ,suil) + ("serd" ,serd) + ("sord" ,sord) + ("sratom" ,sratom) + ("gtkmm" ,gtkmm-2))) + (native-inputs + `(("pkg-config" ,pkg-config) + ("python-pygments" ,python-pygments))) + (home-page "http://drobilla.net/software/ingen") + (synopsis "Modular audio processing system") + (description "Ingen is a modular audio processing system for JACK and +LV2 based systems. Ingen is built around LV2 technology and a strict +separation of engine from user interface. The engine is controlled +exclusively through a protocol, and can execute as a headless process, with an +in-process GUI, or as an LV2 plugin. The GUI can run as a program which +communicates over a Unix or TCP/IP socket, or as an embeddable LV2 GUI which +communicates via LV2 ports. Any saved Ingen graph can be loaded as an LV2 +plugin on any system where Ingen is installed. This allows users to visually +develop custom plugins for use in other applications without programming.") + (license license:agpl3+)))) + +(define-public qmidiarp + (package + (name "qmidiarp") + (version "0.6.4") + (source (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/qmidiarp/qmidiarp/" + version "/qmidiarp-" version ".tar.bz2")) + (sha256 + (base32 + "1gkfv8ajgf86kbn6j5ilfc1zlz17gdi9yxzywqd6jwff4xlm75hx")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags + (list "--enable-qt5" + "CXXFLAGS=-std=gnu++11"))) + (inputs + `(("qtbase" ,qtbase) + ("alsa-lib" ,alsa-lib) + ("jack" ,jack-1) + ("liblo" ,liblo) + ("lv2" ,lv2))) + (native-inputs + `(("pkg-config" ,pkg-config) + ("qttools" ,qttools))) + (home-page "http://qmidiarp.sourceforge.net/") + (synopsis "MIDI arpeggiator") + (description "QMidiArp is an advanced MIDI arpeggiator, programmable step +sequencer and LFO. It can hold any number of arpeggiator, sequencer, or LFO +modules running in parallel.") + (license license:gpl2+))) + +(define-public seq24 + (package + (name "seq24") + (version "0.9.3") + (source (origin + (method url-fetch) + (uri (string-append "https://launchpad.net/seq24/trunk/" + version "/+download/seq24-" + version ".tar.bz2")) + (sha256 + (base32 + "12dphdhnvfk1k0vmagi1v2lhyxjyj1j3cz6ksjw0ydcvid1x8ap2")) + (patches (search-patches "seq24-rename-mutex.patch")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags + (list "CXXFLAGS=-std=gnu++11"))) + (inputs + `(("gtkmm" ,gtkmm-2) + ("alsa-lib" ,alsa-lib) + ("jack" ,jack-1) + ("lash" ,lash))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "https://edge.launchpad.net/seq24/") + (synopsis "Real-time MIDI sequencer") + (description "Seq24 is a real-time MIDI sequencer. It was created to +provide a very simple interface for editing and playing MIDI loops.") + (license license:gpl2+))) + +(define-public python-discogs-client + (package + (name "python-discogs-client") + (version "2.2.1") + (source (origin + (method url-fetch) + (uri (pypi-uri "discogs-client" version)) + (sha256 + (base32 + "053ld2psh0yj3z0kg6z5bn4y3cr562m727494n0ayhgzbkjbacly")))) + (build-system python-build-system) + (propagated-inputs + `(("python-oauthlib" ,python-oauthlib) + ("python-requests" ,python-requests))) + (native-inputs + `(("python-six" ,python-six))) + (home-page "https://github.com/discogs/discogs_client") + (synopsis "Official Python client for the Discogs API") + (description "This is the official Discogs API client for Python. It enables +you to query the Discogs database for information on artists, releases, labels, +users, Marketplace listings, and more. It also supports OAuth 1.0a +authorization, which allows you to change user data such as profile information, +collections and wantlists, inventory, and orders.") + (license license:bsd-2))) + +(define-public python2-discogs-client + (package-with-python2 python-discogs-client)) diff --git a/gnu/packages/nano.scm b/gnu/packages/nano.scm index e1830d291b..68444771a0 100644 --- a/gnu/packages/nano.scm +++ b/gnu/packages/nano.scm @@ -29,7 +29,7 @@ (define-public nano (package (name "nano") - (version "2.7.1") + (version "2.7.3") (source (origin (method url-fetch) @@ -37,7 +37,7 @@ version ".tar.gz")) (sha256 (base32 - "06715a39hmp2dl0qz0979cyv8brpb91z5hn94q224ymbsc876m41")))) + "123si2acvfhnl2kip08bqm413yv36zy3pmj75ibkn7q59mcx8x1m")))) (build-system gnu-build-system) (inputs `(("gettext" ,gettext-minimal) diff --git a/gnu/packages/ncurses.scm b/gnu/packages/ncurses.scm index 81da864413..d725a71c0d 100644 --- a/gnu/packages/ncurses.scm +++ b/gnu/packages/ncurses.scm @@ -1,9 +1,10 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org> -;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> +;;; Copyright © 2014, 2016 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Leo Famulari <leo@famulari.name> ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages ncurses) + #:use-module (gnu packages) #:use-module (guix licenses) #:use-module (guix packages) #:use-module (guix download) @@ -29,136 +31,162 @@ #:use-module (gnu packages) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) - #:use-module (gnu packages swig)) + #:use-module (gnu packages swig) + #:use-module (guix utils)) (define-public ncurses - (let ((patch-makefile-phase - '(lambda _ - (for-each patch-makefile-SHELL - (find-files "." "Makefile.in")))) - (configure-phase - ;; The 'configure' script does not understand '--docdir', so we must - ;; override that and use '--mandir' instead. - '(lambda* (#:key build target outputs configure-flags - #:allow-other-keys) - (let ((out (assoc-ref outputs "out")) - (doc (assoc-ref outputs "doc"))) - (zero? (apply system* "./configure" - (string-append "SHELL=" (which "sh")) - (string-append "--build=" build) - (string-append "--prefix=" out) - (string-append "--mandir=" doc "/share/man") - (if target - (cons (string-append "--host=" target) - configure-flags) - configure-flags)))))) - (remove-shebang-phase - '(lambda _ - ;; To avoid retaining a reference to the bootstrap Bash via the - ;; shebang of the 'ncursesw6-config' script, simply remove that - ;; shebang: it'll work just as well without it. Likewise, do not - ;; retain a reference to the "doc" output. - (substitute* "misc/ncurses-config.in" - (("#!@SHELL@") - "# No shebang here, use /bin/sh!\n") - (("@SHELL@ \\$0") - "$0") - (("mandir=.*$") - "mandir=share/man")) - #t)) - (post-install-phase - '(lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - ;; When building a wide-character (Unicode) build, create backward - ;; compatibility links from the the "normal" libraries to the - ;; wide-character ones (e.g. libncurses.so to libncursesw.so). - (with-directory-excursion (string-append out "/lib") - (for-each (lambda (lib) - (define libw.a - (string-append "lib" lib "w.a")) - (define lib.a - (string-append "lib" lib ".a")) - (define libw.so.x - (string-append "lib" lib "w.so.6")) - (define lib.so.x - (string-append "lib" lib ".so.6")) - (define lib.so - (string-append "lib" lib ".so")) - (define packagew.pc - (string-append lib "w.pc")) - (define package.pc - (string-append lib ".pc")) - - (when (file-exists? libw.a) - (format #t "creating symlinks for `lib~a'~%" lib) - (symlink libw.a lib.a) - (symlink libw.so.x lib.so.x) - (false-if-exception (delete-file lib.so)) - (call-with-output-file lib.so - (lambda (p) - (format p "INPUT (-l~aw)~%" lib)))) - (with-directory-excursion "pkgconfig" - (format #t "creating symlink for `~a'~%" package.pc) - (when (file-exists? packagew.pc) - (symlink packagew.pc package.pc)))) - '("curses" "ncurses" "form" "panel" "menu"))))))) - (package - (name "ncurses") - (version "6.0") - (source (origin + (package + (name "ncurses") + (version "6.0") + (source (origin (method url-fetch) (uri (string-append "mirror://gnu/ncurses/ncurses-" version ".tar.gz")) (sha256 (base32 "0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm")))) - (build-system gnu-build-system) - (outputs '("out" - "doc")) ;1 MiB of man pages - (arguments - `(#:configure-flags - `("--with-shared" "--without-debug" "--enable-widec" + (build-system gnu-build-system) + (outputs '("out" + "doc")) ;1 MiB of man pages + (arguments + (let ((patch-makefile-phase + '(lambda _ + (for-each patch-makefile-SHELL + (find-files "." "Makefile.in")))) + (configure-phase + ;; The 'configure' script does not understand '--docdir', so we must + ;; override that and use '--mandir' instead. + '(lambda* (#:key build target outputs configure-flags + #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (doc (assoc-ref outputs "doc"))) + (zero? (apply system* "./configure" + (string-append "SHELL=" (which "sh")) + (string-append "--build=" build) + (string-append "--prefix=" out) + (string-append "--mandir=" doc "/share/man") + (if target + (cons (string-append "--host=" target) + configure-flags) + configure-flags)))))) + (remove-shebang-phase + '(lambda _ + ;; To avoid retaining a reference to the bootstrap Bash via the + ;; shebang of the 'ncursesw6-config' script, simply remove that + ;; shebang: it'll work just as well without it. Likewise, do not + ;; retain a reference to the "doc" output. + (substitute* "misc/ncurses-config.in" + (("#!@SHELL@") + "# No shebang here, use /bin/sh!\n") + (("@SHELL@ \\$0") + "$0") + (("mandir=.*$") + "mandir=share/man")) + #t)) + (post-install-phase + `(lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + ;; When building a wide-character (Unicode) build, create backward + ;; compatibility links from the the "normal" libraries to the + ;; wide-character ones (e.g. libncurses.so to libncursesw.so). + ,@(if (target-mingw?) + '( ;; TODO: create .la files to link to the .dll? + (with-directory-excursion (string-append out "/bin") + (for-each + (lambda (lib) + (define lib.dll + (string-append "lib" lib ".dll")) + (define libw6.dll + (string-append "lib" lib "w6.dll")) + + (when (file-exists? libw6.dll) + (format #t "creating symlinks for `lib~a'~%" lib) + (symlink libw6.dll lib.dll))) + '("curses" "ncurses" "form" "panel" "menu")))) + '()) + (with-directory-excursion (string-append out "/lib") + (for-each (lambda (lib) + (define libw.a + (string-append "lib" lib "w.a")) + (define lib.a + (string-append "lib" lib ".a")) - "--enable-pc-files" - ,(string-append "--with-pkg-config-libdir=" - (assoc-ref %outputs "out") - "/lib/pkgconfig") + ,@(if (not (target-mingw?)) + '((define libw.so.x + (string-append "lib" lib "w.so.6")) + (define lib.so.x + (string-append "lib" lib ".so.6")) + (define lib.so + (string-append "lib" lib ".so")) + (define packagew.pc + (string-append lib "w.pc")) + (define package.pc + (string-append lib ".pc"))) + '()) - ;; By default headers land in an `ncursesw' subdir, which is not - ;; what users expect. - ,(string-append "--includedir=" (assoc-ref %outputs "out") - "/include") - "--enable-overwrite" ;really honor --includedir + (when (file-exists? libw.a) + (format #t "creating symlinks for `lib~a'~%" lib) + (symlink libw.a lib.a) + ,@(if (not (target-mingw?)) + '((symlink libw.so.x lib.so.x) + (false-if-exception (delete-file lib.so)) + (call-with-output-file lib.so + (lambda (p) + (format p "INPUT (-l~aw)~%" lib))) + (with-directory-excursion "pkgconfig" + (format #t "creating symlink for `~a'~%" + package.pc) + (when (file-exists? packagew.pc) + (symlink packagew.pc package.pc)))) + '()))) + '("curses" "ncurses" "form" "panel" "menu"))))))) + `(#:configure-flags + ,(cons* + 'quasiquote + `(("--with-shared" "--without-debug" "--enable-widec" + + "--enable-pc-files" + ,(list 'unquote '(string-append "--with-pkg-config-libdir=" + (assoc-ref %outputs "out") + "/lib/pkgconfig")) - ;; Make sure programs like 'tic', 'reset', and 'clear' have a - ;; correct RUNPATH. - ,(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out") - "/lib")) - #:tests? #f ; no "check" target - #:phases (modify-phases %standard-phases - (replace 'configure ,configure-phase) - (add-after 'install 'post-install - ,post-install-phase) - (add-before 'configure 'patch-makefile-SHELL - ,patch-makefile-phase) - (add-after 'unpack 'remove-unneeded-shebang - ,remove-shebang-phase)))) - (self-native-input? #t) ; for `tic' + ;; By default headers land in an `ncursesw' subdir, which is not + ;; what users expect. + ,(list 'unquote '(string-append "--includedir=" (assoc-ref %outputs "out") + "/include")) + "--enable-overwrite" ;really honor --includedir + + ;; Make sure programs like 'tic', 'reset', and 'clear' have a + ;; correct RUNPATH. + ,(list 'unquote '(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out") + "/lib")) + ;; MinGW: Use term-driver created for the MinGW port. + ,@(if (target-mingw?) '("--enable-term-driver") '())))) + #:tests? #f ; no "check" target + #:phases (modify-phases %standard-phases + (replace 'configure ,configure-phase) + (add-after 'install 'post-install + ,post-install-phase) + (add-before 'configure 'patch-makefile-SHELL + ,patch-makefile-phase) + (add-after 'unpack 'remove-unneeded-shebang + ,remove-shebang-phase))))) + (self-native-input? #t) ; for `tic' (native-inputs `(("pkg-config" ,pkg-config))) - (native-search-paths - (list (search-path-specification - (variable "TERMINFO_DIRS") - (files '("share/terminfo"))))) - (synopsis "Terminal emulation (termcap, terminfo) library") - (description - "GNU Ncurses is a library which provides capabilities to write text to + (native-search-paths + (list (search-path-specification + (variable "TERMINFO_DIRS") + (files '("share/terminfo"))))) + (synopsis "Terminal emulation (termcap, terminfo) library") + (description + "GNU Ncurses is a library which provides capabilities to write text to a terminal in a terminal-independent manner. It supports pads and color as well as multiple highlights and forms characters. It is typically used to implement user interfaces for command-line applications. The accompanying ncursesw library provides wide character support.") - (license x11) - (home-page "http://www.gnu.org/software/ncurses/")))) + (license x11) + (home-page "http://www.gnu.org/software/ncurses/"))) (define-public dialog (package diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm index de7aaf0680..3c7c073497 100644 --- a/gnu/packages/networking.scm +++ b/gnu/packages/networking.scm @@ -2,7 +2,7 @@ ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> -;;; Copyright © 2015 Stefan Reichör <stefan@xsteve.at> +;;; Copyright © 2015, 2016 Stefan Reichör <stefan@xsteve.at> ;;; Copyright © 2016 Raimon Grau <raimonster@gmail.com> ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2016 John Darrington <jmd@gnu.org> @@ -34,6 +34,7 @@ #:use-module (guix download) #:use-module (guix build-system glib-or-gtk) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (gnu packages) #:use-module (gnu packages admin) #:use-module (gnu packages adns) @@ -43,6 +44,7 @@ #:use-module (gnu packages check) #:use-module (gnu packages code) #:use-module (gnu packages compression) + #:use-module (gnu packages curl) #:use-module (gnu packages databases) #:use-module (gnu packages flex) #:use-module (gnu packages gettext) @@ -301,14 +303,14 @@ receiving NDP messages.") (define-public ethtool (package (name "ethtool") - (version "4.0") + (version "4.8") (source (origin (method url-fetch) (uri (string-append "mirror://kernel.org/software/network/" name "/" name "-" version ".tar.xz")) (sha256 (base32 - "1zzcwn6pk8qfasalqkxg8vrhacksfa50xsq4xifw7yfjqyn8fj4h")))) + "0hsaxcka0ks76k23sb65c46i53hjm465sgxyn3m3301diqlgwga0")))) (build-system gnu-build-system) (home-page "https://www.kernel.org/pub/software/network/ethtool/") (synopsis "Display or change Ethernet device settings") @@ -467,7 +469,7 @@ which can be used to encrypt a password with @code{crypt(3)}.") (define-public wireshark (package (name "wireshark") - (version "2.2.2") + (version "2.2.3") (synopsis "Network traffic analyzer") (source (origin @@ -476,7 +478,7 @@ which can be used to encrypt a password with @code{crypt(3)}.") version ".tar.bz2")) (sha256 (base32 - "1csm035ayfzn1xzzsmzcjk2ixx39d70aykr4nh0a88chk9gfzb7r")))) + "0fsrvl6sp772g2q2j24h10h9lfda6q67x7wahjjm8849i2gciflp")))) (build-system glib-or-gtk-build-system) (inputs `(("bison" ,bison) ("c-ares" ,c-ares) @@ -549,6 +551,38 @@ by firewalls or when you want to monitor the response time of the actual web application stack itself.") (license license:gpl2))) ; with permission to link with OpenSSL +(define-public httpstat + (package + (name "httpstat") + (version "1.2.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "httpstat" version)) + (sha256 + (base32 + "1chw2nk56vaq87aba012a270k9na06hfx1pfbsrc3jfvlc2kb9hb")))) + (build-system python-build-system) + (inputs `(("curl" ,curl))) + (arguments + '(#:phases + (modify-phases %standard-phases + (add-before 'build 'fix-curl-path + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "httpstat.py" + (("ENV_CURL_BIN.get\\('curl'\\)") + (string-append "ENV_CURL_BIN.get('" + (assoc-ref inputs "curl") + "/bin/curl')")))))))) + (home-page "https://github.com/reorx/httpstat") + (synopsis "Visualize curl statistics") + (description + "@command{httpstat} is a tool to visualize statistics from the +@command{curl} HTTP client. It acts as a wrapper for @command{curl} and +prints timing information for each step of the HTTP request (DNS lookup, +TCP connection, TLS handshake and so on) in the terminal.") + (license license:expat))) + (define-public bwm-ng (package (name "bwm-ng") diff --git a/gnu/packages/ntp.scm b/gnu/packages/ntp.scm index 177eb8946a..13781fbdad 100644 --- a/gnu/packages/ntp.scm +++ b/gnu/packages/ntp.scm @@ -39,33 +39,34 @@ (define-public ntp (package (name "ntp") - (version "4.2.8p8") - (source (origin - (method url-fetch) - (uri (list (string-append - "http://archive.ntp.org/ntp4/ntp-" - (version-major+minor version) - "/ntp-" version ".tar.gz") - (string-append - "https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-" - (version-major+minor version) - "/ntp-" version ".tar.gz"))) - (sha256 - (base32 - "1vlpgd0dk2wkpmmf869sfxi8f46sfnmjgk51vl8n6vj5y2sx1cra")) - (modules '((guix build utils))) - (snippet - '(begin - ;; Remove the bundled copy of libevent, but we must keep - ;; sntp/libevent/build-aux since configure.ac contains - ;; AC_CONFIG_AUX_DIR([sntp/libevent/build-aux]) - (rename-file "sntp/libevent/build-aux" - "sntp/libevent:build-aux") - (delete-file-recursively "sntp/libevent") - (mkdir "sntp/libevent") - (rename-file "sntp/libevent:build-aux" - "sntp/libevent/build-aux") - #t)))) + (version "4.2.8p9") + (source + (origin + (method url-fetch) + (uri (list (string-append + "http://archive.ntp.org/ntp4/ntp-" + (version-major+minor version) + "/ntp-" version ".tar.gz") + (string-append + "https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-" + (version-major+minor version) + "/ntp-" version ".tar.gz"))) + (sha256 + (base32 + "0whbyf82lrczbri4adbsa4hg1ppfa6c7qcj7nhjwdfp1g1vjh95p")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove the bundled copy of libevent, but we must keep + ;; sntp/libevent/build-aux since configure.ac contains + ;; AC_CONFIG_AUX_DIR([sntp/libevent/build-aux]) + (rename-file "sntp/libevent/build-aux" + "sntp/libevent:build-aux") + (delete-file-recursively "sntp/libevent") + (mkdir "sntp/libevent") + (rename-file "sntp/libevent:build-aux" + "sntp/libevent/build-aux") + #t)))) (native-inputs `(("which" ,which) ("pkg-config" ,pkg-config))) (inputs diff --git a/gnu/packages/nutrition.scm b/gnu/packages/nutrition.scm index 636379806c..9e0430b20a 100644 --- a/gnu/packages/nutrition.scm +++ b/gnu/packages/nutrition.scm @@ -52,11 +52,7 @@ `(("pygtk" ,python2-pygtk) ("sqlalchemy" ,python2-sqlalchemy) ("python-pillow" ,python2-pillow) - ("elib.intl" ,python2-elib.intl) - ;; XXX: This really isn't an input for gourmet but of pillow. Making - ;; it a propagated input in pillow doesn't seem to get its site path - ;; into gourmet's wrapper's PYTHONPATH however... - ("python-setuptools" ,python2-setuptools))) + ("elib.intl" ,python2-elib.intl))) (arguments `(#:python ,python-2 ;exception and print syntax #:tests? #f)) ;tests look bitrotted diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm index f1b4bdbf6f..93020f1c06 100644 --- a/gnu/packages/ocaml.scm +++ b/gnu/packages/ocaml.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu> ;;; ;;; This file is part of GNU Guix. ;;; @@ -23,31 +24,43 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu packages ocaml) - #:use-module ((guix licenses) #:hide (zlib)) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix svn-download) - #:use-module (guix utils) - #:use-module (guix build-system gnu) #:use-module (gnu packages) - #:use-module (gnu packages gcc) - #:use-module (gnu packages gnome) - #:use-module (gnu packages gtk) + #:use-module (gnu packages autotools) #:use-module (gnu packages base) - #:use-module (gnu packages emacs) - #:use-module (gnu packages texinfo) - #:use-module (gnu packages pkg-config) #:use-module (gnu packages compression) - #:use-module (gnu packages xorg) - #:use-module (gnu packages tex) + #:use-module (gnu packages curl) + #:use-module (gnu packages emacs) + #:use-module (gnu packages gcc) #:use-module (gnu packages ghostscript) + #:use-module (gnu packages gnome) + #:use-module (gnu packages gtk) #:use-module (gnu packages lynx) - #:use-module (gnu packages perl) - #:use-module (gnu packages python) #:use-module (gnu packages m4) + #:use-module (gnu packages multiprecision) #:use-module (gnu packages ncurses) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages tex) + #:use-module (gnu packages texinfo) + #:use-module (gnu packages time) #:use-module (gnu packages version-control) - #:use-module (gnu packages curl)) + #:use-module (gnu packages xml) + #:use-module (gnu packages xorg) + #:use-module (guix build-system gnu) + #:use-module (guix build-system ocaml) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix svn-download) + #:use-module (guix utils)) + +;; A shortcut for files from ocaml forge. Downloaded files are computed from +;; their number, not their name. +(define (ocaml-forge-uri name version file-number) + (string-append "https://forge.ocamlcore.org/frs/download.php/" + (number->string file-number) "/" name "-" version + ".tar.gz")) (define-public ocaml (package @@ -62,12 +75,18 @@ (sha256 (base32 "1qwwvy8nzd87hk8rd9sm667nppakiapnx4ypdwcrlnav2dz6kil3")) - (patches (search-patches "ocaml-CVE-2015-8869.patch")))) + (patches + (search-patches + "ocaml-CVE-2015-8869.patch" + "ocaml-Add-a-.file-directive.patch")))) (build-system gnu-build-system) (native-search-paths (list (search-path-specification (variable "OCAMLPATH") - (files (list (string-append "lib/ocaml")))))) + (files (list "lib/ocaml" "lib/ocaml/site-lib"))) + (search-path-specification + (variable "CAML_LD_LIBRARY_PATH") + (files (list "lib/ocaml/site-lib/stubslibs"))))) (native-inputs `(("perl" ,perl) ("pkg-config" ,pkg-config))) @@ -83,58 +102,59 @@ #:phases (modify-phases %standard-phases (add-after 'unpack 'patch-/bin/sh-references - (lambda* (#:key inputs #:allow-other-keys) - (let* ((sh (string-append (assoc-ref inputs "bash") - "/bin/sh")) - (quoted-sh (string-append "\"" sh "\""))) - (with-fluids ((%default-port-encoding #f)) - (for-each (lambda (file) - (substitute* file - (("\"/bin/sh\"") - (begin - (format (current-error-port) "\ + (lambda* (#:key inputs #:allow-other-keys) + (let* ((sh (string-append (assoc-ref inputs "bash") + "/bin/sh")) + (quoted-sh (string-append "\"" sh "\""))) + (with-fluids ((%default-port-encoding #f)) + (for-each + (lambda (file) + (substitute* file + (("\"/bin/sh\"") + (begin + (format (current-error-port) "\ patch-/bin/sh-references: ~a: changing `\"/bin/sh\"' to `~a'~%" - file quoted-sh) - quoted-sh)))) - (find-files "." "\\.ml$")) - #t)))) + file quoted-sh) + quoted-sh)))) + (find-files "." "\\.ml$")) + #t)))) (replace 'configure - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (mandir (string-append out "/share/man"))) - ;; Custom configure script doesn't recognize - ;; --prefix=<PREFIX> syntax (with equals sign). - (zero? (system* "./configure" - "--prefix" out - "--mandir" mandir))))) + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (mandir (string-append out "/share/man"))) + ;; Custom configure script doesn't recognize + ;; --prefix=<PREFIX> syntax (with equals sign). + (zero? (system* "./configure" + "--prefix" out + "--mandir" mandir))))) (replace 'build - (lambda _ - (zero? (system* "make" "-j" (number->string - (parallel-job-count)) - "world.opt")))) + (lambda _ + (zero? (system* "make" "-j" (number->string + (parallel-job-count)) + "world.opt")))) (delete 'check) (add-after 'install 'check - (lambda _ - (with-directory-excursion "testsuite" - (zero? (system* "make" "all"))))) + (lambda _ + (with-directory-excursion "testsuite" + (zero? (system* "make" "all"))))) (add-before 'check 'prepare-socket-test - (lambda _ - (format (current-error-port) - "Spawning local test web server on port 8080~%") - (when (zero? (primitive-fork)) - (run-server (lambda (request request-body) - (values '((content-type . (text/plain))) - "Hello!")) - 'http '(#:port 8080))) - (let ((file "testsuite/tests/lib-threads/testsocket.ml")) - (format (current-error-port) - "Patching ~a to use localhost port 8080~%" - file) - (substitute* file - (("caml.inria.fr") "localhost") - (("80") "8080") - (("HTTP1.0") "HTTP/1.0")) - #t)))))) + (lambda _ + (format (current-error-port) + "Spawning local test web server on port 8080~%") + (when (zero? (primitive-fork)) + (run-server (lambda (request request-body) + (values '((content-type . (text/plain))) + "Hello!")) + 'http '(#:port 8080))) + (let ((file "testsuite/tests/lib-threads/testsocket.ml")) + (format (current-error-port) + "Patching ~a to use localhost port 8080~%" + file) + (substitute* file + (("caml.inria.fr") "localhost") + (("80") "8080") + (("HTTP1.0") "HTTP/1.0")) + #t)))))) (home-page "https://ocaml.org/") (synopsis "The OCaml programming language") (description @@ -145,7 +165,7 @@ functional, imperative and object-oriented styles of programming.") ;; The compiler is distributed under qpl1.0 with a change to choice of ;; law: the license is governed by the laws of France. The library is ;; distributed under lgpl2.0. - (license (list qpl lgpl2.0)))) + (license (list license:qpl license:lgpl2.0)))) (define-public opam (package @@ -210,7 +230,7 @@ simultaneous compiler installations, flexible package constraints, and a Git-friendly development workflow.") ;; The 'LICENSE' file waives some requirements compared to LGPLv3. - (license lgpl3))) + (license license:lgpl3))) (define-public camlp4 (package @@ -230,6 +250,10 @@ Git-friendly development workflow.") (inputs `(("ocaml" ,ocaml))) (arguments '(#:tests? #f ;no documented test target + ;; a race-condition will lead byte and native targets to mkdir _build + ;; which fails on the second attempt. + #:parallel-build? #f + #:make-flags '("all") #:phases (modify-phases %standard-phases (replace 'configure @@ -237,9 +261,19 @@ Git-friendly development workflow.") ;; This is a home-made 'configure' script. (let ((out (assoc-ref outputs "out"))) (zero? (system* "./configure" - (string-append "--libdir=" out "/lib") + (string-append "--libdir=" out + "/lib/ocaml/site-lib") (string-append "--bindir=" out "/bin") - (string-append "--pkgdir=" out))))))))) + (string-append "--pkgdir=" out + "/lib/ocaml/site-lib")))))) + (add-after 'install 'install-meta + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (substitute* "camlp4/META.in" + (("directory = .*") + (string-append "directory = \"" out + "/lib/ocaml/site-lib/camlp4\"\n"))) + (zero? (system* "make" "install-META")))))))) (home-page "https://github.com/ocaml/camlp4") (synopsis "Write parsers in OCaml") (description @@ -252,7 +286,7 @@ syntax of OCaml.") ;; This is LGPLv2 with an exception that allows packages statically-linked ;; against the library to be released under any terms. - (license lgpl2.0))) + (license license:lgpl2.0))) (define-public camlp5 (package @@ -293,7 +327,7 @@ syntax of OCaml.") tools for syntax (Stream Parsers and Grammars) and the ability to modify the concrete syntax of the language (Quotations, Syntax Extensions).") ;; Most files are distributed under bsd-3, but ocaml_stuff/* is under qpl. - (license (list bsd-3 qpl)))) + (license (list license:bsd-3 license:qpl)))) (define-public hevea (package @@ -324,48 +358,51 @@ concrete syntax of the language (Quotations, Syntax Extensions).") (description "HeVeA is a LaTeX to HTML translator that generates modern HTML 5. It is written in Objective Caml.") - (license qpl))) + (license license:qpl))) (define-public coq (package (name "coq") - (version "8.4pl6") + (version "8.5pl2") (source (origin (method url-fetch) (uri (string-append "https://coq.inria.fr/distrib/V" version "/files/" name "-" version ".tar.gz")) (sha256 (base32 - "1mpbj4yf36kpjg2v2sln12i8dzqn8rag6fd07hslj2lpm4qs4h55")))) + "0wyywia0darak2zmc5v0ra9rn0b9whwdfiahralm8v5za499s8w3")))) (build-system gnu-build-system) (native-inputs `(("texlive" ,texlive) + ("findlib" ,ocaml-findlib) ("hevea" ,hevea))) (inputs `(("ocaml" ,ocaml) + ("lablgtk" ,lablgtk) ("camlp5" ,camlp5))) (arguments `(#:phases (modify-phases %standard-phases (replace 'configure - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (mandir (string-append out "/share/man")) - (browser "icecat -remote \"OpenURL(%s,new-tab)\"")) - (zero? (system* "./configure" - "--prefix" out - "--mandir" mandir - "--browser" browser))))) + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (mandir (string-append out "/share/man")) + (browser "icecat -remote \"OpenURL(%s,new-tab)\"")) + (zero? (system* "./configure" + "-prefix" out + "-mandir" mandir + "-browser" browser + "-coqide" "opt"))))) (replace 'build - (lambda _ - (zero? (system* "make" "-j" (number->string - (parallel-job-count)) - "world")))) + (lambda _ + (zero? (system* "make" "-j" (number->string + (parallel-job-count)) + "world")))) (delete 'check) (add-after 'install 'check - (lambda _ - (with-directory-excursion "test-suite" - (zero? (system* "make")))))))) + (lambda _ + (with-directory-excursion "test-suite" + (zero? (system* "make")))))))) (home-page "https://coq.inria.fr") (synopsis "Proof assistant for higher-order logic") (description @@ -374,7 +411,7 @@ development of computer programs consistent with their formal specification. It is developed using Objective Caml and Camlp5.") ;; The code is distributed under lgpl2.1. ;; Some of the documentation is distributed under opl1.0+. - (license (list lgpl2.1 opl1.0+)))) + (license (list license:lgpl2.1 license:opl1.0+)))) (define-public proof-general (package @@ -452,24 +489,59 @@ It is developed using Objective Caml and Camlp5.") "Proof General is a major mode to turn Emacs into an interactive proof assistant to write formal mathematical proofs using a variety of theorem provers.") - (license gpl2+))) + (license license:gpl2+))) + +(define-public ocaml-menhir + (package + (name "ocaml-menhir") + (version "20161115") + (source (origin + (method url-fetch) + (uri (string-append + "http://gallium.inria.fr/~fpottier/menhir/" + "menhir-" version ".tar.gz")) + (sha256 + (base32 + "1j8nmcj2gq6hyyi16z27amiahplgrnk4ppchpm0v4qy80kwkf47k")))) + (build-system gnu-build-system) + (inputs + `(("ocaml" ,ocaml))) + (arguments + `(#:parallel-build? #f ; Parallel build causes failure + #:tests? #f ; No check target + #:phases + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (setenv "PREFIX" out)) + #t))))) + (home-page "http://gallium.inria.fr/~fpottier/menhir") + (synopsis "Parser generator") + (description "Menhir is a parser generator. It turns high-level grammar +specifications, decorated with semantic actions expressed in the OCaml +programming language into parsers, again expressed in OCaml. It is based on +Knuth’s LR(1) parser construction technique.") + ;; The file src/standard.mly and all files listed in src/mnehirLib.mlpack + ;; that have an *.ml or *.mli extension are GPL licensed. All other files + ;; are QPL licensed. + (license (list license:gpl2+ license:qpl)))) (define-public lablgtk (package (name "lablgtk") - (version "2.18.3") - (source - (origin - (method url-fetch) - (uri (string-append "https://forge.ocamlcore.org/frs/download.php/" - "1479/lablgtk-2.18.3.tar.gz")) - (sha256 - (base32 - "1bybn3jafxf4cx25zvn8h2xj9agn1xjbn7j3ywxxqx6az7rfnnwp")))) + (version "2.18.5") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri name version 1627)) + (sha256 + (base32 + "0cyj6sfdvzx8hw7553lhgwc0krlgvlza0ph3dk9gsxy047dm3wib")))) (build-system gnu-build-system) (native-inputs `(("camlp4" ,camlp4) ("ocaml" ,ocaml) + ("findlib" ,ocaml-findlib) ("pkg-config" ,pkg-config))) ;; FIXME: Add inputs gtkgl-2.0, libpanelapplet-2.0, gtkspell-2.0, ;; and gtk+-quartz-2.0 once available. @@ -484,21 +556,24 @@ provers.") `(#:tests? #f ; no check target ;; opt: also install cmxa files - #:make-flags (list "all" "opt") + #:make-flags (list "all" "opt" + (string-append "FINDLIBDIR=" + (assoc-ref %outputs "out") + "/lib/ocaml")) ;; Occasionally we would get "Error: Unbound module GtkThread" when ;; compiling 'gtkThInit.ml', with 'make -j'. So build sequentially. #:parallel-build? #f #:phases (modify-phases %standard-phases - (replace 'install + (add-before 'install 'prepare-install (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out")) (ocaml (assoc-ref inputs "ocaml"))) ;; Install into the output and not the ocaml directory. + (mkdir-p (string-append out "/lib/ocaml")) (substitute* "config.make" ((ocaml) out)) - (system* "make" "old-install") #t)))))) (home-page "http://lablgtk.forge.ocamlcore.org/") (synopsis "GTK+ bindings for OCaml") @@ -511,7 +586,7 @@ gdk-pixbuf, the GLArea widget (in combination with LablGL), gnomecanvas, gnomeui, gtksourceview, gtkspell, libglade (and it an generate OCaml code from .glade files), libpanel, librsvg and quartz.") - (license lgpl2.1))) + (license license:lgpl2.1))) (define-public unison (package @@ -632,7 +707,7 @@ a collection of files and directories to be stored on different hosts (or different disks on the same host), modified separately, and then brought up to date by propagating the changes in each replica to the other.") - (license gpl3+))) + (license license:gpl3+))) (define-public ocaml-findlib (package @@ -666,7 +741,12 @@ to the other.") "-config" (string-append out "/etc/ocamfind.conf") "-mandir" (string-append out "/share/man") "-sitelib" (string-append out "/lib/ocaml/site-lib") - "-with-toolbox"))))))) + "-with-toolbox")))) + (add-after 'install 'remove-camlp4 + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (delete-file-recursively + (string-append out "/lib/ocaml/site-lib/camlp4")))))))) (home-page "http://projects.camlcity.org/projects/findlib.html") (synopsis "Management tool for OCaml libraries") (description @@ -680,4 +760,461 @@ dependency information about multiple packages. There is also a tool that allows the user to enter queries on the command-line. In order to simplify compilation and linkage, there are new frontends of the various OCaml compilers that can directly deal with packages.") - (license x11))) + (license license:x11))) + +;; note that some tests may hang for no obvious reason. +(define-public ocaml-ounit + (package + (name "ocaml-ounit") + (version "2.0.0") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri "ounit" version 1258)) + (sha256 + (base32 + "118xsadrx84pif9vaq13hv4yh22w9kmr0ypvhrs0viir1jr0ajjd")))) + (build-system ocaml-build-system) + (native-inputs + `(("libxml2" ,libxml2))) ; for xmllint + (arguments + `(#:phases + (modify-phases %standard-phases + ;; Tests are done during build. + (delete 'check)))) + (home-page "http://ounit.forge.ocamlcore.org") + (synopsis "Unit testing framework for OCaml") + (description "Unit testing framework for OCaml. It is similar to JUnit and +other XUnit testing frameworks.") + (license license:expat))) + +(define-public camlzip + (package + (name "camlzip") + (version "1.0.6") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri name version 1616)) + (sha256 + (base32 + "0m6gyjw46w3qnhxfsyqyag42znl5lwargks7w7rfchr9jzwpff68")))) + (build-system ocaml-build-system) + (inputs + `(("zlib" ,zlib))) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + (add-before 'install 'fix-install-name + (lambda* (#:key #:allow-other-keys) + (substitute* "Makefile" + (("install zip") "install camlzip"))))) + #:install-target "install-findlib" + #:make-flags + (list "all" "allopt" + (string-append "INSTALLDIR=" (assoc-ref %outputs "out") + "/lib/ocaml")))) + (home-page "http://forge.ocamlcore.org/projects/camlzip") + (synopsis "Provides easy access to compressed files") + (description "Provides easy access to compressed files in ZIP, GZIP and +JAR format. It provides functions for reading from and writing to compressed +files in these formats.") + (license license:lgpl2.1+))) + +(define-public ocamlmod + (package + (name "ocamlmod") + (version "0.0.8") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri name version 1544)) + (sha256 + (base32 + "1w0w8lfyymvk300dv13gvhrddpcyknvyp4g2yvq2vaw7khkhjs9g")))) + (build-system ocaml-build-system) + (native-inputs + `(("ounit" ,ocaml-ounit))) + (arguments + `(#:phases + (modify-phases %standard-phases + ;; Tests are done during build. + (delete 'check)))) + (home-page "https://forge.ocamlcore.org/projects/ocamlmod") + (synopsis "Generate modules from OCaml source files") + (description "Generate modules from OCaml source files.") + (license license:lgpl2.1+))) ; with an exception + +(define-public ocaml-zarith + (package + (name "ocaml-zarith") + (version "1.4.1") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri "zarith" version 1574)) + (sha256 + (base32 + "0l36hzmfbvdai2kcgynh13vfdim5x2grnaw61fxqalyjm90c3di3")))) + (build-system ocaml-build-system) + (native-inputs + `(("perl" ,perl))) + (inputs + `(("gmp" ,gmp))) + (arguments + `(#:tests? #f ; no test target + #:phases + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key #:allow-other-keys) + (zero? (system* "./configure"))))))) + (home-page "https://forge.ocamlcore.org/projects/zarith/") + (synopsis "Implements arbitrary-precision integers") + (description "Implements arithmetic and logical operations over +arbitrary-precision integers. It uses GMP to efficiently implement arithmetic +over big integers. Small integers are represented as Caml unboxed integers, +for speed and space economy.") + (license license:lgpl2.1+))) ; with an exception + +(define-public ocaml-frontc + (package + (name "ocaml-frontc") + (version "3.4") + (source (origin + (method url-fetch) + (uri (string-append "https://www.irit.fr/recherches/ARCHI/MARCH/" + "frontc/Frontc-" version ".tgz")) + (sha256 + (base32 + "16dz153s92dgbw1rrfwbhscy73did87kfmjwyh3qpvs748h1sc4g")))) + (build-system ocaml-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + (add-after 'install 'install-meta + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (with-output-to-file + (string-append out "/lib/ocaml/frontc/META") + (lambda _ + (display + (string-append + "description = \"Parser for the C language\" +version = \"" ,version "\" +requires = \"unix\" +archive(byte) = \"frontc.cma\" +archive(native) = \"frontc.cmxa\"")))) + (symlink (string-append out "/lib/ocaml/frontc") + (string-append out "/lib/ocaml/FrontC")))))) + #:make-flags (list (string-append "PREFIX=" + (assoc-ref %outputs "out")) + "OCAML_SITE=$(LIB_DIR)/ocaml/"))) + (home-page "https://www.irit.fr/FrontC") + (synopsis "C parser and lexer library") + (description "FrontC is an OCAML library providing a C parser and lexer. +The result is a syntactic tree easy to process with usual OCAML tree management. +It provides support for ANSI C syntax, old-C K&R style syntax and the standard +GNU CC attributes. It provides also a C pretty printer as an example of use.") + (license license:lgpl2.1))) + +(define-public ocaml-qtest + (package + (name "ocaml-qtest") + (version "2.3") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/vincent-hugot/iTeML/" + "archive/v" version ".tar.gz")) + (sha256 + (base32 + "1n7x5l6h4j44f75wzgzjsjkq349i4gj707w1hr7fx84igxxfr6vl")))) + (build-system ocaml-build-system) + (native-inputs + `(("findlib" ,ocaml-findlib))) + (propagated-inputs + `(("ounit" ,ocaml-ounit))) + (arguments + `(#:tests? #f ; No test target. + #:make-flags + (list (string-append "BIN=" (assoc-ref %outputs "out") "/bin")) + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "https://github.com/vincent-hugot/iTeML") + (synopsis "Inline (Unit) Tests for OCaml") + (description "Qtest extracts inline unit tests written using a special +syntax in comments. Those tests are then run using the oUnit framework and the +qcheck library. The possibilities range from trivial tests -- extremely simple +to use -- to sophisticated random generation of test cases.") + (license license:lgpl3+))) + +(define-public ocaml-stringext + (package + (name "ocaml-stringext") + (version "1.4.3") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/rgrinberg/stringext" + "/archive/v" version ".tar.gz")) + (sha256 + (base32 + "19g6lfn03iki9f8h91hi0yiqn0b3wkxyq08b3y23wgv6jw6mssfh")))) + (build-system ocaml-build-system) + (native-inputs + `(("qtest" ,ocaml-qtest))) + (home-page "https://github.com/rgrinberg/stringext") + (synopsis "Extra string functions for OCaml") + (description "Provides a single module named Stringext that provides a grab +bag of often used but missing string functions from the stdlib. E.g, split, +full_split, cut, rcut, etc..") + ;; the only mention of a license in this project is in its `opam' file + ;; where it says `mit'. + (license license:expat))) + + +(define-public ocaml-bisect + (package + (name "ocaml-bisect") + (version "1.3") + (source (origin + (method url-fetch) + (uri (ocaml-forge-uri "bisect" version 1051)) + (sha256 + (base32 + "0kcg2rh0qlkfpbv3nhcb75n62b04gbrz0zasq15ynln91zd5qrg0")) + (patches + (search-patches + "ocaml-bisect-fix-camlp4-in-another-directory.patch")))) + (build-system ocaml-build-system) + (native-inputs + `(("camlp4" ,camlp4) + ("libxml2" ,libxml2) + ("which" ,which))) + (propagated-inputs + `(("camlp4" ,camlp4))) + (arguments + `(#:test-target "tests" + #:make-flags + (list "all" (string-append "CAMLP4_LIBDIR=" + (assoc-ref %build-inputs "camlp4") + "/lib/ocaml/site-lib/camlp4")) + #:phases + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key outputs #:allow-other-keys) + (zero? (system* "./configure" "-prefix" + (assoc-ref outputs "out")))))))) + (home-page "http://bisect.x9c.fr") + (synopsis "Code coverage tool for the OCaml language") + (description "Bisect is a code coverage tool for the OCaml language. It is +a camlp4-based tool that allows to instrument your application before running +tests. After application execution, it is possible to generate a report in HTML +format that is the replica of the application source code annotated with code +coverage information.") + (license license:gpl3+))) + +(define-public ocaml-bitstring + (package + (name "ocaml-bitstring") + (version "2.1.0") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/xguerin/bitstring" + "/archive/v" version ".tar.gz")) + (sha256 + (base32 + "0miw4banfpmx4kxrckpqr57b1fcmsqdmspyjx6gqjd4kghm4l7xj")) + (patches (search-patches "ocaml-bitstring-fix-configure.patch")))) + (build-system ocaml-build-system) + (native-inputs + `(("camlp4" ,camlp4) + ("time" ,time) + ("autoconf" ,autoconf) + ("automake" ,automake) + ("bisect" ,ocaml-bisect))) + (propagated-inputs + `(("camlp4" ,camlp4))) + (arguments + `(#:configure-flags + (list "CAMLP4OF=camlp4of" "--enable-coverage") + #:make-flags + (list (string-append "BISECTLIB=" + (assoc-ref %build-inputs "bisect") + "/lib/ocaml/site-lib") + (string-append "OCAMLCFLAGS=-g -I " + (assoc-ref %build-inputs "camlp4") + "/lib/ocaml/site-lib/camlp4 -I " + "$(BISECTLIB)/bisect") + (string-append "OCAMLOPTFLAGS=-g -I " + (assoc-ref %build-inputs "camlp4") + "/lib/ocaml/site-lib/camlp4 -I " + "$(BISECTLIB)/bisect")) + #:phases + (modify-phases %standard-phases + (add-before 'configure 'fix-configure + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "Makefile.in" + (("@abs_top_builddir@") + (string-append "@abs_top_builddir@:" (getenv "LIBRARY_PATH")))) + (substitute* "configure" + (("-/bin/sh") (string-append "-" (assoc-ref inputs "bash") + "/bin/sh"))))) + (add-after 'install 'link-lib + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (stubs (string-append out + "/lib/ocaml/site-lib/stubslibs")) + (lib (string-append out + "/lib/ocaml/site-lib/bitstring"))) + (mkdir-p stubs) + (symlink (string-append lib "/dllbitstring.so") + (string-append stubs "/dllbitstring.so")))))))) + (home-page "https://github.com/xguerin/bitstring") + (synopsis "Bitstrings and bitstring matching for OCaml") + (description "Adds Erlang-style bitstrings and matching over bitstrings as +a syntax extension and library for OCaml. You can use this module to both parse +and generate binary formats, files and protocols. Bitstring handling is added +as primitives to the language, making it exceptionally simple to use and very +powerful.") + (license license:isc))) + +(define-public ocaml-result + (package + (name "ocaml-result") + (version "1.2") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/janestreet/result" + "/archive/" version ".tar.gz")) + (sha256 + (base32 + "1pgpfsgvhxnh0i37fkvp9j8nadns9hz9iqgabj4dr519j2gr1xvw")))) + (build-system ocaml-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "https://github.com/janestreet/result") + (synopsis "Compatibility Result module") + (description "Uses the new result type defined in OCaml >= 4.03 while +staying compatible with older version of OCaml should use the Result module +defined in this library.") + (license license:bsd-3))) + +(define-public ocaml-topkg + (package + (name "ocaml-topkg") + (version "0.8.1") + (source (origin + (method url-fetch) + (uri (string-append "http://erratique.ch/software/topkg/releases/" + "topkg-" version ".tbz")) + (sha256 + (base32 + "18rrh6fmf708z7dd30amljmcgaypj3kk49jrmrj68r4wnw8004j8")))) + (build-system ocaml-build-system) + (native-inputs + `(("opam" ,opam))) + (propagated-inputs + `(("result" ,ocaml-result))) + (arguments + `(#:tests? #f + #:build-flags '("build") + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "http://erratique.ch/software/topkg") + (synopsis "Transitory OCaml software packager") + (description "Topkg is a packager for distributing OCaml software. It +provides an API to describe the files a package installs in a given build +configuration and to specify information about the package's distribution, +creation and publication procedures.") + (license license:isc))) + +(define-public ocaml-rresult + (package + (name "ocaml-rresult") + (version "0.5.0") + (source (origin + (method url-fetch) + (uri (string-append "http://erratique.ch/software/rresult/releases/" + "rresult-" version ".tbz")) + (sha256 + (base32 + "1xxycxhdhaq8p9vhwi93s2mlxjwgm44fcxybx5vghzgbankz9yhm")))) + (build-system ocaml-build-system) + (native-inputs + `(("opam" ,opam))) + (propagated-inputs + `(("topkg" ,ocaml-topkg))) + (arguments + `(#:tests? #f + #:build-flags '("build") + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "http://erratique.ch/software/rresult") + (synopsis "Result value combinators for OCaml") + (description "Handle computation results and errors in an explicit and +declarative manner, without resorting to exceptions. It defines combinators +to operate on the result type available from OCaml 4.03 in the standard +library.") + (license license:isc))) + +(define-public ocaml-mtime + (package + (name "ocaml-mtime") + (version "0.8.3") + (source (origin + (method url-fetch) + (uri (string-append "http://erratique.ch/software/mtime/releases/" + "mtime-" version ".tbz")) + (sha256 + (base32 + "1hfx4ny2dkw6jf3jppz0640dafl5xgn8r2si9kpwzhmibal8qrah")))) + (build-system ocaml-build-system) + (native-inputs + `(("opam" ,opam))) + (propagated-inputs + `(("topkg" ,ocaml-topkg))) + (arguments + `(#:tests? #f + #:build-flags + '("native=true" "native-dynlink=true" "jsoo=false") + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "http://erratique.ch/software/mtime") + (synopsis "Monotonic wall-clock time for OCaml") + (description "Access monotonic wall-clock time. It allows to measure time +spans without being subject to operating system calendar time adjustments.") + (license license:isc))) + +(define-public ocaml-cmdliner + (package + (name "ocaml-cmdliner") + (version "0.9.8") + (source (origin + (method url-fetch) + (uri (string-append "http://erratique.ch/software/cmdliner/releases/" + "cmdliner-" version ".tbz")) + (sha256 + (base32 + "0hdxlkgiwjml9dpaa80282a8350if7mc1m6yz2mrd7gci3fszykx")))) + (build-system ocaml-build-system) + (native-inputs + `(("opam" ,opam))) + (arguments + `(#:tests? #f + #:build-flags '("native=true" "native-dynlink=true") + #:phases + (modify-phases %standard-phases + (delete 'configure)))) + (home-page "http://erratique.ch/software/cmdliner") + (synopsis "Declarative definition of command line interfaces for OCaml") + (description "Cmdliner is a module for the declarative definition of command +line interfaces. It provides a simple and compositional mechanism to convert +command line arguments to OCaml values and pass them to your functions. The +module automatically handles syntax errors, help messages and UNIX man page +generation. It supports programs with single or multiple commands and respects +most of the POSIX and GNU conventions.") + (license license:bsd-3))) diff --git a/gnu/packages/onc-rpc.scm b/gnu/packages/onc-rpc.scm index 0bcc885c39..5353846ece 100644 --- a/gnu/packages/onc-rpc.scm +++ b/gnu/packages/onc-rpc.scm @@ -43,11 +43,19 @@ (modify-phases %standard-phases (add-after 'unpack 'remote-dangling-symlink (lambda _ + (substitute* '("man/netconfig.5" + "man/getnetconfig.3t" + "man/getnetpath.3t" + "man/rpc.3t" + "src/getnetconfig.c" + "tirpc/netconfig.h") + (("/etc/netconfig") (string-append %output "/etc/netconfig"))) + ;; Remove the dangling symlinks since it breaks the ;; 'patch-source-shebangs' file tree traversal. (delete-file "INSTALL")))))) (inputs `(("mit-krb5" ,mit-krb5))) - (home-page "http://sourceforge.net/projects/libtirpc/") + (home-page "https://sourceforge.net/projects/libtirpc/") (synopsis "Transport-independent Sun/ONC RPC implementation") (description "This package provides a library that implements the Sun/ONC RPC (remote diff --git a/gnu/packages/openstack.scm b/gnu/packages/openstack.scm index 43a6490b22..e2672668d8 100644 --- a/gnu/packages/openstack.scm +++ b/gnu/packages/openstack.scm @@ -49,9 +49,8 @@ ("python-pyyaml" ,python-pyyaml) ("python-six" ,python-six) ("python-stevedore" ,python-stevedore))) - (inputs + (native-inputs `(("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests ("python-fixtures" ,python-fixtures) ("python-mock" ,python-mock) @@ -85,10 +84,9 @@ all the files it generates a report.") (propagated-inputs `(("python-six" ,python-six) ("python-wrapt" ,python-wrapt))) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests. ("python-oslotest" ,python-oslotest))) (home-page "http://www.openstack.org/") @@ -122,9 +120,8 @@ manner.") ("python-pep8-1.5.7" ,python-pep8-1.5.7) ("python-pyflakes-0.8.1" ,python-pyflakes-0.8.1) ("python-six" ,python-six))) - (inputs - `(("python-setuptools" ,python-setuptools) - ;; Tests + (native-inputs + `(;; Tests ("python-testscenarios" ,python-testscenarios))) (home-page "http://github.com/openstack-dev/hacking") (synopsis "OpenStack hacking guideline enforcement") @@ -152,8 +149,6 @@ guidelines}.") (native-inputs `(("python-fixtures" ,python-fixtures) ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) - ("python-six" ,python-six) ("python-testtools" ,python-testtools))) (home-page "http://www.openstack.org/") (synopsis "Mock object framework for Python") @@ -181,14 +176,14 @@ tested on Python version 3.2, 2.7 and 2.6.") (build-system python-build-system) (arguments `(#:tests? #f)) ;; Circular dependency with python-oslotest - (inputs + (propagated-inputs `(("python-appdirs" ,python-appdirs) + ("python-pyyaml" ,python-pyyaml))) + (native-inputs + `(("python-pbr" ,python-pbr) ("python-fixtures" ,python-fixtures) ("python-mimeparse" ,python-mimeparse) - ("python-pbr" ,python-pbr) - ("python-pyyaml" ,python-pyyaml) ("python-testrepository" ,python-testrepository) - ("python-setuptools" ,python-setuptools) ("python-testscenarios" ,python-testscenarios) ("python-testtools" ,python-testtools))) (home-page "http://www.openstack.org/") @@ -221,12 +216,11 @@ tested on Python version 3.2, 2.7 and 2.6.") ;; when building the package. Skip the tests for now. `(#:tests? #f)) (propagated-inputs + `(("python-subunit" ,python-subunit))) + (native-inputs `(("python-pbr" ,python-pbr) - ("python-subunit" ,python-subunit) - ("python-testtools" ,python-testtools))) - (inputs - `(("python-babel" ,python-babel) - ("python-setuptools" ,python-setuptools))) + ("python-testtools" ,python-testtools) + ("python-babel" ,python-babel))) (home-page "https://www.openstack.org/") (synopsis "Testr wrapper to provide functionality for OpenStack projects") (description @@ -252,10 +246,9 @@ tested on Python version 3.2, 2.7 and 2.6.") (propagated-inputs `(("python-requests" ,python-requests) ("python-six" ,python-six))) - (inputs - `(("python-pbr" ,python-pbr))) (native-inputs - `(("python-discover" ,python-discover) + `(("python-pbr" ,python-pbr) + ("python-discover" ,python-discover) ("python-docutils" ,python-docutils) ("python-fixtures" ,python-fixtures) ("python-mock" ,python-mock) @@ -267,16 +260,10 @@ tested on Python version 3.2, 2.7 and 2.6.") (description "This module provides a building block to stub out the HTTP requests portions of your testing code.") - (license asl2.0) - (properties `((python2-variant . ,(delay python2-requests-mock)))))) + (license asl2.0))) (define-public python2-requests-mock - (let ((base (package-with-python2 - (strip-python2-variant python-requests-mock)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-requests-mock)) (define-public python-stevedore (package @@ -292,10 +279,8 @@ portions of your testing code.") (build-system python-build-system) (propagated-inputs `(("python-six" ,python-six))) - (inputs - `(("python-pbr" ,python-pbr))) (native-inputs - `(("python-setuptools" ,python-setuptools) + `(("python-pbr" ,python-pbr) ;; Tests ("python-docutils" ,python-docutils) ("python-mock" ,python-mock) @@ -346,12 +331,11 @@ extensions.") ("python-paramiko" ,python-paramiko) ("python-pbr" ,python-pbr) ("python-six" ,python-six))) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-mock" ,python-mock) ("python-os-testr" ,python-os-testr) - ("python-oslotest" ,python-oslotest) - ("python-setuptools" ,python-setuptools))) + ("python-oslotest" ,python-oslotest))) (home-page "https://www.openstack.org/") (synopsis "OpenStack functional testing library") (description @@ -382,9 +366,8 @@ common features used in Tempest.") `(("python-netaddr" ,python-netaddr) ("python-six" ,python-six) ("python-stevedore" ,python-stevedore))) - (inputs + (native-inputs `(("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests ("python-oslo.i18n" ,python-oslo.i18n) ("python-mock" ,python-mock) @@ -412,10 +395,9 @@ common features used in Tempest.") (base32 "0kvha0rs9295njyl2z6n6zm5dapi5mrl5zwjm0m6ldqrvccyf8c3")))) (build-system python-build-system) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests. ("python-oslotest" ,python-oslotest))) (home-page "http://launchpad.net/oslo") @@ -444,9 +426,8 @@ pipeline and used by various modules such as logging.") (propagated-inputs `(("python-babel" ,python-babel) ("python-six" ,python-six))) - (inputs + (native-inputs `(("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests ("python-mock" ,python-mock) ("python-mox3" ,python-mox3) @@ -486,13 +467,12 @@ in an application or library.") ("python-oslo.utils" ,python-oslo.utils) ("python-oslo.serialization" ,python-oslo.serialization) ("python-six" ,python-six))) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-iso8601" ,python-iso8601) ("python-mock" ,python-mock) ("python-oslotest" ,python-oslotest) - ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools))) + ("python-pbr" ,python-pbr))) (home-page "http://launchpad.net/oslo") (synopsis "Python logging library of the Oslo project") (description @@ -523,10 +503,9 @@ handlers and support for context specific logging (like resource id’s etc).") ("python-simplejson" ,python-simplejson) ("python-six" ,python-six) ("python-pytz" ,python-pytz))) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests. ("python-mock" ,python-mock) ("python-oslo.i18n" ,python-oslo.i18n) @@ -555,11 +534,10 @@ in transmittable and storable formats, such as JSON and MessagePack.") (build-system python-build-system) (propagated-inputs `(("python-requests" ,python-requests))) - (inputs + (native-inputs `(("python-pbr" ,python-pbr) ("python-docutils" ,python-docutils) ("python-hacking" ,python-hacking) - ("python-setuptools" ,python-setuptools) ("python-sphinx" ,python-sphinx))) (home-page "http://www.openstack.org/") (synopsis "OpenStack sphinx extensions and theme") @@ -591,10 +569,9 @@ from the OpenStack project.") ("python-mock" ,python-mock) ("python-mox3" ,python-mox3) ("python-six" ,python-six))) - (inputs + (native-inputs `(("python-pbr" ,python-pbr) ("python-os-client-config" ,python-os-client-config) - ("python-setuptools" ,python-setuptools) ("python-subunit" ,python-subunit) ("python-testrepository" ,python-testrepository) ("python-testscenarios" ,python-testscenarios) @@ -635,10 +612,9 @@ and better support for mocking results.") ("python-netifaces" ,python-netifaces) ("python-pytz" ,python-pytz) ("python-six" ,python-six))) - (inputs + (native-inputs `(("python-babel" ,python-babel) ("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ;; Tests. ("python-oslotest" ,python-oslotest) ("python-mock" ,python-mock) @@ -668,8 +644,7 @@ handling.") "1w4csvkah67rfpxylxnvs2s3594i0f9isy8pf4gnsqs5zirvjaa4")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-sphinx" ,python-sphinx) + `(("python-sphinx" ,python-sphinx) ;; and some packages for the tests ("openssl" ,openssl) ("python-coverage" ,python-coverage) @@ -744,7 +719,6 @@ LDAP.") (build-system python-build-system) (native-inputs `(("python-pbr" ,python-pbr) - ("python-setuptools" ,python-setuptools) ("python-sphinx" ,python-sphinx) ;; The folloing packages are needed for the tests. ("python-coverage" ,python-coverage) @@ -814,9 +788,10 @@ permanence.") (list git openssh)))))))))) (native-inputs `(("python-pbr" ,python-pbr))) + (propagated-inputs + `(("python-requests" ,python-requests))) (inputs - `(("python-requests" ,python-requests) - ("git" ,git) + `(("git" ,git) ("openssh" ,openssh))) (home-page "http://docs.openstack.org/infra/git-review/") (synopsis "Command-line tool for Gerrit") @@ -826,8 +801,4 @@ Gerrit for review, or fetching existing ones.") (license asl2.0))) (define-public python2-git-review - (let ((base (package-with-python2 (strip-python2-variant python-git-review)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-git-review)) diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm index 051dff34b7..23f34cd306 100644 --- a/gnu/packages/package-management.scm +++ b/gnu/packages/package-management.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> -;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2015, 2017 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -44,13 +44,15 @@ #:use-module (gnu packages curl) #:use-module (gnu packages web) #:use-module (gnu packages man) - #:use-module (gnu packages emacs) #:use-module (gnu packages bdw-gc) + #:use-module (gnu packages patchutils) #:use-module (gnu packages python) #:use-module (gnu packages popt) #:use-module (gnu packages gnuzilla) #:use-module (gnu packages cpio) #:use-module (gnu packages tls) + #:use-module (gnu packages ssh) + #:use-module (gnu packages vim) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 popen) @@ -67,17 +69,17 @@ arch "-linux" "/20131110/guile-2.0.9.tar.xz"))) -(define-public guix-0.11.0 +(define-public guix-0.12.0 (package (name "guix") - (version "0.11.0") + (version "0.12.0") (source (origin (method url-fetch) (uri (string-append "ftp://alpha.gnu.org/gnu/guix/guix-" version ".tar.gz")) (sha256 (base32 - "1cwrbpv4dq7aczwksmcfw9w8r2bzrb5ld9zvjcr90i804hjpcb93")))) + "1jgy5mlygmhxdqhrp6vr8w83ndcm5mk64xfravr8l2d7hq8y40b2")))) (build-system gnu-build-system) (arguments `(#:configure-flags (list @@ -120,7 +122,7 @@ ;; XXX FIXME: These tests fail within the build container. (lambda _ (substitute* "tests/syscalls.scm" - (("^\\(test-assert \"(clone|setns|pivot-root)\"" all) + (("^\\(test-(assert|equal) \"(clone|setns|pivot-root)\"" all) (string-append "(test-skip 1)\n" all))) (substitute* "tests/containers.scm" (("^\\(test-(assert|equal)" all) @@ -143,9 +145,11 @@ ;; Guile-JSON automatically. (let* ((out (assoc-ref outputs "out")) (json (assoc-ref inputs "guile-json")) + (ssh (assoc-ref inputs "guile-ssh")) (gnutls (assoc-ref inputs "gnutls")) (path (string-append json "/share/guile/site/2.0:" + ssh "/share/guile/site/2.0:" gnutls "/share/guile/site/2.0"))) ;; Ignore user settings so that a bogus @@ -159,7 +163,6 @@ #t)))))) (native-inputs `(("pkg-config" ,pkg-config) - ("emacs" ,emacs-minimal) ;for guix.el ;; XXX: Keep the development inputs here even though ;; they're unnecessary, just so that 'guix environment @@ -203,8 +206,7 @@ (propagated-inputs `(("gnutls" ,gnutls) ;for 'guix download' & co. ("guile-json" ,guile-json) - ("geiser" ,geiser) ;for guix.el - ("emacs-magit-popup" ,emacs-magit-popup))) ;for "M-x guix" command + ("guile-ssh" ,guile-ssh))) (home-page "http://www.gnu.org/software/guix") (synopsis "Functional package manager for installed software packages and versions") @@ -222,9 +224,9 @@ the Nix package manager.") ;; ;; Note: use a very short commit id; with a longer one, the limit on ;; hash-bang lines would be exceeded while running the tests. - (let ((commit "1f410017ff91458feda8c5788223d17696b71e36")) - (package (inherit guix-0.11.0) - (version (string-append "0.11.0-4." (string-take commit 4))) + (let ((commit "b291b3271a025dfe41e1a7fdfadd393373b0128d")) + (package (inherit guix-0.12.0) + (version (string-append "0.12.0-2." (string-take commit 4))) (source (origin (method git-fetch) (uri (git-reference @@ -234,10 +236,10 @@ the Nix package manager.") (commit commit))) (sha256 (base32 - "1mgzcbf1mry39wvvjflj76zggsshsip2pngxpaf2479yr3ri6v50")) + "1hris387xn2wk4lcl20x1zyhiz96060w34xs1x13b4vmvkkvcpg4")) (file-name (string-append "guix-" version "-checkout")))) (arguments - (substitute-keyword-arguments (package-arguments guix-0.11.0) + (substitute-keyword-arguments (package-arguments guix-0.12.0) ((#:configure-flags flags) ;; Set 'DOT_USER_PROGRAM' to the empty string so we don't keep a ;; reference to Graphviz, whose closure is pretty big (too big for @@ -478,13 +480,13 @@ transactions from C or Python.") (define-public diffoscope (package (name "diffoscope") - (version "62") + (version "63") (source (origin (method url-fetch) (uri (pypi-uri name version)) (sha256 (base32 - "127b4gsw11hjbha5jpz5i42pc142h52pwzs1p792047y0j1yjg8z")))) + "12q5d2nszql1g4jf2ss863v0wpvvhrkaivqzhy6af9m9zwvw0p0k")))) (build-system python-build-system) (arguments `(#:phases (modify-phases %standard-phases @@ -495,26 +497,28 @@ transactions from C or Python.") (lambda _ (substitute* "setup.py" (("'python-magic',") "")))) - ;; The test suite assumes we have pytest >= 2.9.0. - ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=841146 - (add-after 'unpack 'disable-failing-test - (lambda _ - (substitute* "tests/comparators/utils.py" - (("skip\\(reason\\=\\\"requires \\{\\}\\\"\\.format\\(tool\\)\\)") - "skipif(True, reason=\"Requires pytest >= 2.9\")")))) - (add-before 'build 'disable-egg-zipping - (lambda _ - ;; Leave the .egg file uncompressed. - (let ((port (open-file "setup.cfg" "a"))) - (display "\n[easy_install]\nzip_ok = 0\n" - port) - (close-port port) - #t)))))) + (add-after 'unpack 'embed-tool-references + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "diffoscope/difference.py" + (("@tool_required\\('colordiff'\\)") "") + (("\\[\"colordiff\"") + (string-append "[\"" (which "colordiff") "\""))) + (substitute* "diffoscope/comparators/utils.py" + (("@tool_required\\('xxd'\\)") "") + (("\\['xxd',") + (string-append "['" (which "xxd") "',"))) + (substitute* "diffoscope/comparators/elf.py" + (("@tool_required\\('readelf'\\)") "") + (("\\['readelf',") + (string-append "['" (which "readelf") "',"))) + #t))))) (inputs `(("rpm" ,rpm) ;for rpm-python ("python-file" ,python-file) ("python-debian" ,python-debian) ("python-libarchive-c" ,python-libarchive-c) ("python-tlsh" ,python-tlsh) + ("colordiff" ,colordiff) + ("xxd" ,vim) ;; Below are modules used for tests. ("python-pytest" ,python-pytest) diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm index 89195f31c2..097e4e182b 100644 --- a/gnu/packages/parallel.scm +++ b/gnu/packages/parallel.scm @@ -45,7 +45,7 @@ (define-public parallel (package (name "parallel") - (version "20161022") + (version "20161222") (source (origin (method url-fetch) @@ -53,7 +53,7 @@ version ".tar.bz2")) (sha256 (base32 - "1mz82chm5qav6h64rcckxzabr7w4ma0sjx61xav85x0swgcbjdsr")))) + "1chgr3csyc7hbq2wq4jnwnbsr3ix8rzsk2lf4vdnvkjpd6dvw517")))) (build-system gnu-build-system) (arguments `(#:phases diff --git a/gnu/packages/password-utils.scm b/gnu/packages/password-utils.scm index 55c14762e9..f8111b2abf 100644 --- a/gnu/packages/password-utils.scm +++ b/gnu/packages/password-utils.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2016 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org> ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com> +;;; Copyright © 2017 Leo Famulari <leo@famulari.name> ;;; ;;; This file is part of GNU Guix. ;;; @@ -33,8 +34,8 @@ #:use-module (gnu packages admin) #:use-module (gnu packages base) #:use-module (gnu packages compression) + #:use-module (gnu packages glib) #:use-module (gnu packages gnupg) - #:use-module (gnu packages gtk) #:use-module (gnu packages guile) #:use-module (gnu packages linux) #:use-module (gnu packages man) @@ -216,7 +217,7 @@ random passwords that pass the checks.") (define-public assword (package (name "assword") - (version "0.8") + (version "0.10") (source (origin (method url-fetch) (uri (list @@ -225,10 +226,9 @@ random passwords that pass the checks.") "assword_" version ".orig.tar.gz"))) (sha256 (base32 - "0dl4wizbi0r21wxzykm8s445xbvqim5nabi799dmpkdnnh8i546i")))) + "0l6170y6my1gprqkazvzabgjkrkr9v2q7z48vjflna4r323yqira")))) (arguments - `(#:python ,python-2 - ;; irritatingly, tests do run but not there are two problems: + `(;; irritatingly, tests do run but not there are two problems: ;; - "import gtk" fails for unknown reasons here despite it the ;; program working (indeed, I've found I have to do a logout and log ;; back in in after an install order for some mumbo jumbo environment @@ -242,18 +242,21 @@ random passwords that pass the checks.") (add-after 'install 'manpage (lambda* (#:key outputs #:allow-other-keys) (and + ;; Without this substitution, it fails with + ;; ImportError: No module named 'gpg' + (substitute* "Makefile" + (("PYTHONPATH=.") "")) (zero? (system* "make" "assword.1")) (install-file "assword.1" (string-append (assoc-ref outputs "out") "/share/man/man1")))))))) (build-system python-build-system) (native-inputs - `(("help2man" ,help2man))) + `(("txt2man" ,txt2man))) (inputs - `(("python-setuptools" ,python2-setuptools) - ("python2-xdo" ,python2-xdo) - ("python2-pygpgme" ,python2-pygpgme) - ("python2-pygtk" ,python2-pygtk))) + `(("python-xdo" ,python-xdo) + ("python-gpg" ,python-gpg) + ("python-pygobject" ,python-pygobject))) (propagated-inputs `(("xclip" ,xclip))) (home-page "https://finestructure.net/assword/") @@ -281,6 +284,7 @@ any X11 window.") '(#:phases (modify-phases %standard-phases (delete 'configure) + (delete 'build) (add-after 'install 'wrap-path (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out")) @@ -291,6 +295,9 @@ any X11 window.") (wrap-program (string-append out "/bin/pass") `("PATH" ":" prefix (,(string-join path ":")))))))) #:make-flags (list "CC=gcc" (string-append "PREFIX=" %output)) + ;; Parallel tests may cause a race condition leading to a + ;; timeout in some circumstances. + #:parallel-tests? #f #:test-target "test")) (inputs `(("getopt" ,util-linux) @@ -314,18 +321,17 @@ through the pass command.") (define-public argon2 (package (name "argon2") - (version "20160406") + (version "20161029") (source (origin (method url-fetch) (uri - (string-append - "https://codeload.github.com/P-H-C/phc-winner-" - name "/tar.gz/" version)) + (string-append "https://github.com/P-H-C/phc-winner-argon2/archive/" + version ".tar.gz")) (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0g6wa94sh639xl1qc8z21q43r1mp8y77r1zf8nwx5pfsxd8fmyzv")))) + "1rymikbysasdadm325jx69i0q19d9srqkny69jwmhswlidr4j07y")))) (build-system gnu-build-system) (arguments `(#:test-target "test" @@ -362,7 +368,7 @@ winner of the 2015 Password Hashing Competition.") (native-inputs `(("python-pycparser" ,python-pycparser) ("python-pytest" ,python-pytest))) - (inputs + (propagated-inputs `(("python-cffi" ,python-cffi) ("python-six" ,python-six))) (home-page "https://github.com/pyca/bcrypt/") @@ -376,8 +382,4 @@ Password Scheme\"} by Niels Provos and David Mazieres.") (license license:asl2.0))) (define-public python2-bcrypt - (let ((bcrypt (package-with-python2 python-bcrypt))) - (package (inherit bcrypt) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs bcrypt)))))) + (package-with-python2 python-bcrypt)) diff --git a/gnu/packages/patches/awesome-reproducible-png.patch b/gnu/packages/patches/awesome-reproducible-png.patch index 0fae65bc71..d8e92c70f9 100644 --- a/gnu/packages/patches/awesome-reproducible-png.patch +++ b/gnu/packages/patches/awesome-reproducible-png.patch @@ -7,8 +7,8 @@ See <https://wiki.debian.org/ReproducibleBuilds/TimestampsInPNG>. set(ALL_ICONS ${ALL_ICONS} ${output}) add_custom_command( -- COMMAND ${CONVERT_EXECUTABLE} ${input} ${ARGN} ${output} -+ COMMAND ${CONVERT_EXECUTABLE} +set date:create +set date:modify -define png:exclude-chunk=time ${input} ${ARGN} ${output} +- COMMAND ${CONVERT_EXECUTABLE} ${input} -strip ${ARGN} ${output} ++ COMMAND ${CONVERT_EXECUTABLE} +set date:create +set date:modify -define png:exclude-chunk=time ${input} -strip ${ARGN} ${output} OUTPUT ${output} DEPENDS ${input} VERBATIM) diff --git a/gnu/packages/patches/cairo-CVE-2016-9082.patch b/gnu/packages/patches/cairo-CVE-2016-9082.patch new file mode 100644 index 0000000000..ad83404194 --- /dev/null +++ b/gnu/packages/patches/cairo-CVE-2016-9082.patch @@ -0,0 +1,122 @@ +From: Adrian Johnson <ajohnson@redneon.com> +Date: Thu, 20 Oct 2016 21:12:30 +1030 +Subject: [PATCH] image: prevent invalid ptr access for > 4GB images + +Image data is often accessed using: + + image->data + y * image->stride + +On 64-bit achitectures if the image data is > 4GB, this computation +will overflow since both y and stride are 32-bit types. + +bug report: https://bugs.freedesktop.org/show_bug.cgi?id=98165 +patch: https://bugs.freedesktop.org/attachment.cgi?id=127421 +--- + boilerplate/cairo-boilerplate.c | 4 +++- + src/cairo-image-compositor.c | 4 ++-- + src/cairo-image-surface-private.h | 2 +- + src/cairo-mesh-pattern-rasterizer.c | 2 +- + src/cairo-png.c | 2 +- + src/cairo-script-surface.c | 3 ++- + 6 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c +index 7fdbf79..4804dea 100644 +--- a/boilerplate/cairo-boilerplate.c ++++ b/boilerplate/cairo-boilerplate.c +@@ -42,6 +42,7 @@ + #undef CAIRO_VERSION_H + #include "../cairo-version.h" + ++#include <stddef.h> + #include <stdlib.h> + #include <ctype.h> + #include <assert.h> +@@ -976,7 +977,8 @@ cairo_surface_t * + cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) + { + char format; +- int width, height, stride; ++ int width, height; ++ ptrdiff_t stride; + int x, y; + unsigned char *data; + cairo_surface_t *image = NULL; +diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c +index 48072f8..3ca0006 100644 +--- a/src/cairo-image-compositor.c ++++ b/src/cairo-image-compositor.c +@@ -1575,7 +1575,7 @@ typedef struct _cairo_image_span_renderer { + pixman_image_t *src, *mask; + union { + struct fill { +- int stride; ++ ptrdiff_t stride; + uint8_t *data; + uint32_t pixel; + } fill; +@@ -1594,7 +1594,7 @@ typedef struct _cairo_image_span_renderer { + struct finish { + cairo_rectangle_int_t extents; + int src_x, src_y; +- int stride; ++ ptrdiff_t stride; + uint8_t *data; + } mask; + } u; +diff --git a/src/cairo-image-surface-private.h b/src/cairo-image-surface-private.h +index 8ca694c..7e78d61 100644 +--- a/src/cairo-image-surface-private.h ++++ b/src/cairo-image-surface-private.h +@@ -71,7 +71,7 @@ struct _cairo_image_surface { + + int width; + int height; +- int stride; ++ ptrdiff_t stride; + int depth; + + unsigned owns_data : 1; +diff --git a/src/cairo-mesh-pattern-rasterizer.c b/src/cairo-mesh-pattern-rasterizer.c +index 1b63ca8..e7f0db6 100644 +--- a/src/cairo-mesh-pattern-rasterizer.c ++++ b/src/cairo-mesh-pattern-rasterizer.c +@@ -470,7 +470,7 @@ draw_pixel (unsigned char *data, int width, int height, int stride, + tg += tg >> 16; + tb += tb >> 16; + +- *((uint32_t*) (data + y*stride + 4*x)) = ((ta << 16) & 0xff000000) | ++ *((uint32_t*) (data + y*(ptrdiff_t)stride + 4*x)) = ((ta << 16) & 0xff000000) | + ((tr >> 8) & 0xff0000) | ((tg >> 16) & 0xff00) | (tb >> 24); + } + } +diff --git a/src/cairo-png.c b/src/cairo-png.c +index 562b743..aa8c227 100644 +--- a/src/cairo-png.c ++++ b/src/cairo-png.c +@@ -673,7 +673,7 @@ read_png (struct png_read_closure_t *png_closure) + } + + for (i = 0; i < png_height; i++) +- row_pointers[i] = &data[i * stride]; ++ row_pointers[i] = &data[i * (ptrdiff_t)stride]; + + png_read_image (png, row_pointers); + png_read_end (png, info); +diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c +index ea0117d..91e4baa 100644 +--- a/src/cairo-script-surface.c ++++ b/src/cairo-script-surface.c +@@ -1202,7 +1202,8 @@ static cairo_status_t + _write_image_surface (cairo_output_stream_t *output, + const cairo_image_surface_t *image) + { +- int stride, row, width; ++ int row, width; ++ ptrdiff_t stride; + uint8_t row_stack[CAIRO_STACK_BUFFER_SIZE]; + uint8_t *rowdata; + uint8_t *data; +-- +2.1.4 + diff --git a/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch new file mode 100644 index 0000000000..59decde0e9 --- /dev/null +++ b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch @@ -0,0 +1,81 @@ +diff -ur a/irregex-core.scm b/irregex-core.scm +--- a/irregex-core.scm 2016-09-11 19:03:00.000000000 -0400 ++++ b/irregex-core.scm 2017-01-01 22:24:08.000000000 -0500 +@@ -30,6 +30,8 @@ + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;;; History ++;; 0.9.6: 2016/12/05 - fixed exponential memory use of + in compilation ++;; of backtracking matcher. + ;; 0.9.5: 2016/09/10 - fixed a bug in irregex-fold handling of bow + ;; 0.9.4: 2015/12/14 - performance improvement for {n,m} matches + ;; 0.9.3: 2014/07/01 - R7RS library +@@ -3170,16 +3172,7 @@ + ((sre-empty? (sre-sequence (cdr sre))) + (error "invalid sre: empty *" sre)) + (else +- (letrec +- ((body +- (lp (sre-sequence (cdr sre)) +- n +- flags +- (lambda (cnk init src str i end matches fail) +- (body cnk init src str i end matches +- (lambda () +- (next cnk init src str i end matches fail) +- )))))) ++ (let ((body (rec (list '+ (sre-sequence (cdr sre)))))) + (lambda (cnk init src str i end matches fail) + (body cnk init src str i end matches + (lambda () +@@ -3204,10 +3197,21 @@ + (lambda () + (body cnk init src str i end matches fail)))))))) + ((+) +- (lp (sre-sequence (cdr sre)) +- n +- flags +- (rec (list '* (sre-sequence (cdr sre)))))) ++ (cond ++ ((sre-empty? (sre-sequence (cdr sre))) ++ (error "invalid sre: empty +" sre)) ++ (else ++ (letrec ++ ((body ++ (lp (sre-sequence (cdr sre)) ++ n ++ flags ++ (lambda (cnk init src str i end matches fail) ++ (body cnk init src str i end matches ++ (lambda () ++ (next cnk init src str i end matches fail) ++ )))))) ++ body)))) + ((=) + (rec `(** ,(cadr sre) ,(cadr sre) ,@(cddr sre)))) + ((>=) +diff -ur a/irregex-utils.scm b/irregex-utils.scm +--- a/irregex-utils.scm 2016-09-11 19:03:00.000000000 -0400 ++++ b/irregex-utils.scm 2017-01-01 22:25:25.000000000 -0500 +@@ -89,7 +89,7 @@ + (case (car x) + ((: seq) + (cond +- ((and (pair? (cddr x)) (pair? (cddr x)) (not (eq? x obj))) ++ ((and (pair? (cdr x)) (pair? (cddr x)) (not (eq? x obj))) + (display "(?:" out) (for-each lp (cdr x)) (display ")" out)) + (else (for-each lp (cdr x))))) + ((submatch) +diff -ur "a/manual-html/Unit irregex.html" "b/manual-html/Unit irregex.html" +--- "a/manual-html/Unit irregex.html" 2016-09-11 19:10:47.000000000 -0400 ++++ "b/manual-html/Unit irregex.html" 2017-01-01 22:26:05.000000000 -0500 +@@ -353,6 +353,6 @@ + <dd class="defsig"><p>Returns an optimized SRE matching any of the literal strings in the list, like Emacs' <tt>regexp-opt</tt>. Note this optimization doesn't help when irregex is able to build a DFA.</p></dd> + </dl> + <h5 id="sec:sre-.3estring"><a href="#sec:sre-.3estring">sre->string</a></h5><dl class="defsig"><dt class="defsig" id="def:sre-.3estring"><span class="sig"><tt>(sre->string <sre>)</tt></span> <span class="type">procedure</span></dt> +-<dd class="defsig"><p>Convert an SRE to a POSIX-style regular expression string, if possible.</p></dd> ++<dd class="defsig"><p>Convert an SRE to a PCRE-style regular expression string, if possible.</p></dd> + </dl> +-<hr /><p>Previous: <a href="Unit%20extras.html">Unit extras</a></p><p>Next: <a href="Unit%20srfi-1.html">Unit srfi-1</a></p></div></div></body> +\ No newline at end of file ++<hr /><p>Previous: <a href="Unit%20extras.html">Unit extras</a></p><p>Next: <a href="Unit%20srfi-1.html">Unit srfi-1</a></p></div></div></body> diff --git a/gnu/packages/patches/cssc-gets-undeclared.patch b/gnu/packages/patches/cssc-gets-undeclared.patch deleted file mode 100644 index 68c607cf58..0000000000 --- a/gnu/packages/patches/cssc-gets-undeclared.patch +++ /dev/null @@ -1,17 +0,0 @@ -CSSC uses a gets in a couple of places. For security reasons, modern gnulib -does not allow this. This patch allows it again. ---- CSSC-1.3.0/gl/lib/stdio.in.h 2010-05-15 00:15:35.000000000 +0200 -+++ CSSC-1.3.0/gl/lib/stdio.in.h 2014-02-03 21:27:10.000000000 +0100 -@@ -135,12 +135,6 @@ - "use gnulib module fflush for portable POSIX compliance"); - #endif - --/* It is very rare that the developer ever has full control of stdin, -- so any use of gets warrants an unconditional warning. Assume it is -- always declared, since it is required by C89. */ --#undef gets --_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); -- - #if @GNULIB_FOPEN@ - # if @REPLACE_FOPEN@ - # if !(defined __cplusplus && defined GNULIB_NAMESPACE) diff --git a/gnu/packages/patches/cssc-missing-include.patch b/gnu/packages/patches/cssc-missing-include.patch deleted file mode 100644 index 3cef9c15f1..0000000000 --- a/gnu/packages/patches/cssc-missing-include.patch +++ /dev/null @@ -1,12 +0,0 @@ -Added a missing include file (necessary for gid_t and others). -So far as I am aware, this has not been added upstream yet. ---- CSSC-1.3.0/src/file.h 2010-05-16 19:31:33.000000000 +0200 -+++ CSSC-1.3.0/src/file.h 2014-02-03 21:48:30.000000000 +0100 -@@ -30,6 +30,7 @@ - #ifndef CSSC__FILE_H__ - #define CSSC__FILE_H__ - -+#include <sys/types.h> - #include "filelock.h" - - enum create_mode { diff --git a/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch b/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch new file mode 100644 index 0000000000..0f921b120b --- /dev/null +++ b/gnu/packages/patches/fcgi-2.4.0-gcc44-fixes.patch @@ -0,0 +1,14 @@ +Taken from http://pkgs.fedoraproject.org/cgit/rpms/fcgi.git/plain/fcgi-2.4.0-gcc44_fixes.patch. +Fixes compilation with GCC 4.4 and later. + +diff -up fcgi-2.4.0/libfcgi/fcgio.cpp.gcc44_fixes fcgi-2.4.0/libfcgi/fcgio.cpp +--- fcgi-2.4.0/libfcgi/fcgio.cpp.gcc44_fixes 2002-02-24 21:12:22.000000000 +0100 ++++ fcgi-2.4.0/libfcgi/fcgio.cpp 2009-02-15 11:35:18.000000000 +0100 +@@ -23,6 +23,7 @@ + #endif + + #include <limits.h> ++#include <cstdio> + #include "fcgio.h" + + using std::streambuf; diff --git a/gnu/packages/patches/fcgi-2.4.0-poll.patch b/gnu/packages/patches/fcgi-2.4.0-poll.patch new file mode 100644 index 0000000000..73be6a0a08 --- /dev/null +++ b/gnu/packages/patches/fcgi-2.4.0-poll.patch @@ -0,0 +1,89 @@ +Taken from http://pkgs.fedoraproject.org/cgit/rpms/fcgi.git/plain/fcgi-2.4.0-poll.patch +Fixes CVE-2012-6687. + +Author: Anton Kortunov <toshic.toshic@gmail.com> +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libfcgi/+bug/933417 +Description: use poll in os_unix.c instead of select to avoid problem with > 1024 connections +Forwarded: yes, fastcgi-developers@mailman.fastcgi.com + +diff --git a/libfcgi/os_unix.c b/libfcgi/os_unix.c +index 73e6a7f..af35aee 100755 +--- a/libfcgi/os_unix.c ++++ b/libfcgi/os_unix.c +@@ -42,6 +42,7 @@ static const char rcsid[] = "$Id: os_unix.c,v 1.37 2002/03/05 19:14:49 robs Exp + #include <sys/time.h> + #include <sys/un.h> + #include <signal.h> ++#include <poll.h> + + #ifdef HAVE_NETDB_H + #include <netdb.h> +@@ -103,6 +104,9 @@ static int volatile maxFd = -1; + static int shutdownPending = FALSE; + static int shutdownNow = FALSE; + ++static int libfcgiOsClosePollTimeout = 2000; ++static int libfcgiIsAfUnixKeeperPollTimeout = 2000; ++ + void OS_ShutdownPending() + { + shutdownPending = TRUE; +@@ -168,6 +172,16 @@ int OS_LibInit(int stdioFds[3]) + if(libInitialized) + return 0; + ++ char *libfcgiOsClosePollTimeoutStr = getenv( "LIBFCGI_OS_CLOSE_POLL_TIMEOUT" ); ++ if(libfcgiOsClosePollTimeoutStr) { ++ libfcgiOsClosePollTimeout = atoi(libfcgiOsClosePollTimeoutStr); ++ } ++ ++ char *libfcgiIsAfUnixKeeperPollTimeoutStr = getenv( "LIBFCGI_IS_AF_UNIX_KEEPER_POLL_TIMEOUT" ); ++ if(libfcgiIsAfUnixKeeperPollTimeoutStr) { ++ libfcgiIsAfUnixKeeperPollTimeout = atoi(libfcgiIsAfUnixKeeperPollTimeoutStr); ++ } ++ + asyncIoTable = (AioInfo *)malloc(asyncIoTableSize * sizeof(AioInfo)); + if(asyncIoTable == NULL) { + errno = ENOMEM; +@@ -755,19 +769,16 @@ int OS_Close(int fd) + + if (shutdown(fd, 1) == 0) + { +- struct timeval tv; +- fd_set rfds; ++ struct pollfd pfd; + int rv; + char trash[1024]; + +- FD_ZERO(&rfds); ++ pfd.fd = fd; ++ pfd.events = POLLIN; + + do + { +- FD_SET(fd, &rfds); +- tv.tv_sec = 2; +- tv.tv_usec = 0; +- rv = select(fd + 1, &rfds, NULL, NULL, &tv); ++ rv = poll(&pfd, 1, libfcgiOsClosePollTimeout); + } + while (rv > 0 && read(fd, trash, sizeof(trash)) > 0); + } +@@ -1116,13 +1127,11 @@ static int is_reasonable_accept_errno (const int error) + */ + static int is_af_unix_keeper(const int fd) + { +- struct timeval tval = { READABLE_UNIX_FD_DROP_DEAD_TIMEVAL }; +- fd_set read_fds; +- +- FD_ZERO(&read_fds); +- FD_SET(fd, &read_fds); ++ struct pollfd pfd; ++ pfd.fd = fd; ++ pfd.events = POLLIN; + +- return select(fd + 1, &read_fds, NULL, NULL, &tval) >= 0 && FD_ISSET(fd, &read_fds); ++ return poll(&pfd, 1, libfcgiIsAfUnixKeeperPollTimeout) >= 0 && (pfd.revents & POLLIN); + } + + /* diff --git a/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch b/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch new file mode 100644 index 0000000000..0ea008a7cb --- /dev/null +++ b/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch @@ -0,0 +1,11 @@ +--- a/libgcc/config/i386/gthr-win32.h 2016-03-30 07:45:33.388684463 +0200 ++++ b/libgcc/config/i386/gthr-win32.h 2016-03-30 15:51:24.123896436 +0200 +@@ -30,7 +30,7 @@ + + /* Make sure CONST_CAST2 (origin in system.h) is declared. */ + #ifndef CONST_CAST2 +-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq) ++#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)X) + #endif + + /* Windows32 threads specific definitions. The windows32 threading model diff --git a/gnu/packages/patches/gcj-arm-mode.patch b/gnu/packages/patches/gcj-arm-mode.patch new file mode 100644 index 0000000000..a3f999f7e9 --- /dev/null +++ b/gnu/packages/patches/gcj-arm-mode.patch @@ -0,0 +1,36 @@ +Taken from +https://sources.debian.net/data/main/g/gcc-4.9/4.9.2-10/debian/patches/gcj-arm-mode.diff + +# DP: For armhf, force arm mode instead of thumb mode + +--- a/libjava/configure.host ++++ b/libjava/configure.host +@@ -66,6 +66,9 @@ + ;; + esac + ++# on armhf force arm mode ++libgcj_flags="${libgcj_flags} -marm" ++ + AM_RUNTESTFLAGS= + + # Set any host dependent compiler flags. +--- a/gcc/java/lang-specs.h ++++ b/gcc/java/lang-specs.h +@@ -47,7 +47,7 @@ + %{.class|.zip|.jar|!fsyntax-only:jc1 \ + %{.java|fsaw-java-file:%U.jar -fsource-filename=%i %<ffilelist-file} \ + %{.class|.zip|.jar|ffilelist-file|fcompile-resource*:%i} \ +- %(jc1) %(cc1_options) %{I*} %{!findirect-dispatch:-faux-classpath %U.zip} \ ++ %(jc1) %(cc1_options) -marm %{I*} %{!findirect-dispatch:-faux-classpath %U.zip} \ + %{MD:-MD_} %{MMD:-MMD_} %{M} %{MM} %{MA} %{MT*} %{MF*}\ + %(invoke_as)}", + 0, 0, 0}, +--- a/libjava/libgcj.spec.in ++++ b/libjava/libgcj.spec.in +@@ -9,4 +9,4 @@ + %rename lib liborig + *lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ @LIBMATHSPEC@ @LDLIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) @LIBSTDCXXSPEC@ %(liborig) + +-*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ @ATOMICSPEC@ @LIBGCJ_BC_SPEC@ -fkeep-inline-functions ++*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ @ATOMICSPEC@ @LIBGCJ_BC_SPEC@ -fkeep-inline-functions -marm diff --git a/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch b/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch new file mode 100644 index 0000000000..79bb41caaa --- /dev/null +++ b/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch @@ -0,0 +1,40 @@ +This fixes a segfault on 32-bit architectures. Upstream discussion: + +https://lists.gnupg.org/pipermail/gnupg-devel/2016-December/032364.html + +Guix thread: https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00631.html + +Patch copied from upstream source repository: + +https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=commitdiff;h=6e96cdd41a0e55b672309431062f37c4a4a9f485 + +From 6e96cdd41a0e55b672309431062f37c4a4a9f485 Mon Sep 17 00:00:00 2001 +From: Justus Winter <justus@g10code.com> +Date: Wed, 21 Dec 2016 16:14:45 +0100 +Subject: [PATCH] gpgscm: Guard use of union member. + +* tests/gpgscm/scheme.c (opexe_5): Check that we have a file port +before accessing filename. Fixes a crash on 32-bit architectures. + +Fixes-commit: e7429b1ced0c69fa7901f888f8dc25f00fc346a4 +Signed-off-by: Justus Winter <justus@g10code.com> +--- + tests/gpgscm/scheme.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c +index a5b7691..2844545 100644 +--- a/tests/gpgscm/scheme.c ++++ b/tests/gpgscm/scheme.c +@@ -4838,7 +4838,7 @@ static pointer opexe_5(scheme *sc, enum scheme_opcodes op) { + } else { + sc->nesting_stack[sc->file_i]++; + #if USE_TAGS && SHOW_ERROR_LINE +- { ++ if (sc->load_stack[sc->file_i].kind & port_file) { + const char *filename = + sc->load_stack[sc->file_i].rep.stdio.filename; + int lineno = +-- +2.8.0.rc3 + diff --git a/gnu/packages/patches/gst-plugins-good-fix-crashes.patch b/gnu/packages/patches/gst-plugins-good-fix-crashes.patch deleted file mode 100644 index c36a595608..0000000000 --- a/gnu/packages/patches/gst-plugins-good-fix-crashes.patch +++ /dev/null @@ -1,1047 +0,0 @@ -Fixes upstream bug #774859 (flic decoder: Invalid memory read in -flx_decode_chunks): - -https://bugzilla.gnome.org/show_bug.cgi?id=774859 - -Patch copied from upstream source repository: - -https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=be670f0daf67304fb92c76aa09c30cae0bfd1fe4 - -From be670f0daf67304fb92c76aa09c30cae0bfd1fe4 Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Wed, 23 Nov 2016 07:09:06 +1100 -Subject: [PATCH] flxdec: rewrite logic based on GstByteReader/Writer - -Solves overreading/writing the given arrays and will error out if the -streams asks to do that. - -Also does more error checking that the stream is valid and won't -overrun any allocated arrays. Also mitigate integer overflow errors -calculating allocation sizes. - -https://bugzilla.gnome.org/show_bug.cgi?id=774859 ---- - gst/flx/flx_color.c | 1 - - gst/flx/flx_fmt.h | 72 ------- - gst/flx/gstflxdec.c | 610 ++++++++++++++++++++++++++++++++++++---------------- - gst/flx/gstflxdec.h | 4 +- - 4 files changed, 427 insertions(+), 260 deletions(-) - -diff --git a/gst/flx/flx_color.c b/gst/flx/flx_color.c -index 047bfdf..3a58135 100644 ---- a/gst/flx/flx_color.c -+++ b/gst/flx/flx_color.c -@@ -101,7 +101,6 @@ flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num, - } else { - memcpy (&flxpal->palvec[start * 3], newpal, grab * 3); - } -- - } - - void -diff --git a/gst/flx/flx_fmt.h b/gst/flx/flx_fmt.h -index 9ab31ba..abff200 100644 ---- a/gst/flx/flx_fmt.h -+++ b/gst/flx/flx_fmt.h -@@ -123,78 +123,6 @@ typedef struct _FlxFrameType - } FlxFrameType; - #define FlxFrameTypeSize 10 - --#if G_BYTE_ORDER == G_BIG_ENDIAN --#define LE_TO_BE_16(i16) ((guint16) (((i16) << 8) | ((i16) >> 8))) --#define LE_TO_BE_32(i32) \ -- (((guint32) (LE_TO_BE_16((guint16) (i32))) << 16) | (LE_TO_BE_16((i32) >> 16))) -- --#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) \ -- do { \ -- (frm_type_p)->chunks = LE_TO_BE_16((frm_type_p)->chunks); \ -- (frm_type_p)->delay = LE_TO_BE_16((frm_type_p)->delay); \ -- } while(0) -- --#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) \ -- do { \ -- (hffmn_table_p)->codelength = \ -- LE_TO_BE_16((hffmn_table_p)->codelength); \ -- (hffmn_table_p)->numcodes = LE_TO_BE_16((hffmn_table_p)->numcodes); \ -- } while(0) -- --#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) \ -- ((sgmnt_table_p)->segments = LE_TO_BE_16((sgmnt_table_p)->segments)) -- --#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) \ -- do { \ -- (prfx_chnk_p)->chunks = LE_TO_BE_16((prfx_chnk_p)->chunks); \ -- } while(0) -- --#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) \ -- do { \ -- (frm_chnk_p)->size = LE_TO_BE_32((frm_chnk_p)->size); \ -- (frm_chnk_p)->id = LE_TO_BE_16((frm_chnk_p)->id); \ -- } while(0) -- --#define FLX_HDR_FIX_ENDIANNESS(hdr_p) \ -- do { \ -- (hdr_p)->size = LE_TO_BE_32((hdr_p)->size); \ -- (hdr_p)->type = LE_TO_BE_16((hdr_p)->type); \ -- (hdr_p)->frames = LE_TO_BE_16((hdr_p)->frames); \ -- (hdr_p)->width = LE_TO_BE_16((hdr_p)->width); \ -- (hdr_p)->height = LE_TO_BE_16((hdr_p)->height); \ -- (hdr_p)->depth = LE_TO_BE_16((hdr_p)->depth); \ -- (hdr_p)->flags = LE_TO_BE_16((hdr_p)->flags); \ -- (hdr_p)->speed = LE_TO_BE_32((hdr_p)->speed); \ -- (hdr_p)->reserved1 = LE_TO_BE_16((hdr_p)->reserved1); \ -- (hdr_p)->created = LE_TO_BE_32((hdr_p)->created); \ -- (hdr_p)->creator = LE_TO_BE_32((hdr_p)->creator); \ -- (hdr_p)->updated = LE_TO_BE_32((hdr_p)->updated); \ -- (hdr_p)->updater = LE_TO_BE_32((hdr_p)->updater); \ -- (hdr_p)->aspect_dx = LE_TO_BE_16((hdr_p)->aspect_dx); \ -- (hdr_p)->aspect_dy = LE_TO_BE_16((hdr_p)->aspect_dy); \ -- (hdr_p)->ext_flags = LE_TO_BE_16((hdr_p)->ext_flags); \ -- (hdr_p)->keyframes = LE_TO_BE_16((hdr_p)->keyframes); \ -- (hdr_p)->totalframes = LE_TO_BE_16((hdr_p)->totalframes); \ -- (hdr_p)->req_memory = LE_TO_BE_32((hdr_p)->req_memory); \ -- (hdr_p)->max_regions = LE_TO_BE_16((hdr_p)->max_regions); \ -- (hdr_p)->transp_num = LE_TO_BE_16((hdr_p)->transp_num); \ -- (hdr_p)->oframe1 = LE_TO_BE_32((hdr_p)->oframe1); \ -- (hdr_p)->oframe2 = LE_TO_BE_32((hdr_p)->oframe2); \ -- } while(0) --#else -- --#define LE_TO_BE_16(i16) ((i16)) --#define LE_TO_BE_32(i32) ((i32)) -- --#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) --#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) --#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) --#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) --#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) --#define FLX_HDR_FIX_ENDIANNESS(hdr_p) -- --#endif /* G_BYTE_ORDER == G_BIG_ENDIAN */ -- - G_END_DECLS - - #endif /* __GST_FLX_FMT_H__ */ -diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c -index a237976..aa1bed5 100644 ---- a/gst/flx/gstflxdec.c -+++ b/gst/flx/gstflxdec.c -@@ -1,5 +1,6 @@ - /* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@temple-baptist.com> -+ * Copyright (C) <2016> Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public -@@ -24,6 +25,7 @@ - /* - * http://www.coolutils.com/Formats/FLI - * http://woodshole.er.usgs.gov/operations/modeling/flc.html -+ * http://www.compuphase.com/flic.htm - */ - - #ifdef HAVE_CONFIG_H -@@ -73,10 +75,14 @@ static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, - static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstObject * parent, - GstQuery * query); - --static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); --static gboolean flx_decode_brun (GstFlxDec *, guchar *, guchar *); --static gboolean flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); --static gboolean flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); -+static gboolean flx_decode_color (GstFlxDec * flxdec, GstByteReader * reader, -+ GstByteWriter * writer, gint scale); -+static gboolean flx_decode_brun (GstFlxDec * flxdec, -+ GstByteReader * reader, GstByteWriter * writer); -+static gboolean flx_decode_delta_fli (GstFlxDec * flxdec, -+ GstByteReader * reader, GstByteWriter * writer); -+static gboolean flx_decode_delta_flc (GstFlxDec * flxdec, -+ GstByteReader * reader, GstByteWriter * writer); - - #define rndalign(off) ((off) + ((off) & 1)) - -@@ -204,57 +210,59 @@ gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent, - } - - static gboolean --flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, -- guchar * dest) -+flx_decode_chunks (GstFlxDec * flxdec, gulong n_chunks, GstByteReader * reader, -+ GstByteWriter * writer) - { -- FlxFrameChunk *hdr; - gboolean ret = TRUE; - -- g_return_val_if_fail (data != NULL, FALSE); -- -- while (count--) { -- hdr = (FlxFrameChunk *) data; -- FLX_FRAME_CHUNK_FIX_ENDIANNESS (hdr); -- data += FlxFrameChunkSize; -+ while (n_chunks--) { -+ GstByteReader chunk; -+ guint32 size; -+ guint16 type; -+ -+ if (!gst_byte_reader_get_uint32_le (reader, &size)) -+ goto parse_error; -+ if (!gst_byte_reader_get_uint16_le (reader, &type)) -+ goto parse_error; -+ GST_LOG_OBJECT (flxdec, "chunk has type 0x%02x size %d", type, size); -+ -+ if (!gst_byte_reader_get_sub_reader (reader, &chunk, -+ size - FlxFrameChunkSize)) { -+ GST_ERROR_OBJECT (flxdec, "Incorrect size in the chunk header"); -+ goto error; -+ } - -- switch (hdr->id) { -+ switch (type) { - case FLX_COLOR64: -- flx_decode_color (flxdec, data, dest, 2); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ ret = flx_decode_color (flxdec, &chunk, writer, 2); - break; - - case FLX_COLOR256: -- flx_decode_color (flxdec, data, dest, 0); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ ret = flx_decode_color (flxdec, &chunk, writer, 0); - break; - - case FLX_BRUN: -- ret = flx_decode_brun (flxdec, data, dest); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ ret = flx_decode_brun (flxdec, &chunk, writer); - break; - - case FLX_LC: -- ret = flx_decode_delta_fli (flxdec, data, dest); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ ret = flx_decode_delta_fli (flxdec, &chunk, writer); - break; - - case FLX_SS2: -- ret = flx_decode_delta_flc (flxdec, data, dest); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ ret = flx_decode_delta_flc (flxdec, &chunk, writer); - break; - - case FLX_BLACK: -- memset (dest, 0, flxdec->size); -+ ret = gst_byte_writer_fill (writer, 0, flxdec->size); - break; - - case FLX_MINI: -- data += rndalign (hdr->size) - FlxFrameChunkSize; - break; - - default: -- GST_WARNING ("Unimplented chunk type: 0x%02x size: %d - skipping", -- hdr->id, hdr->size); -- data += rndalign (hdr->size) - FlxFrameChunkSize; -+ GST_WARNING ("Unimplemented chunk type: 0x%02x size: %d - skipping", -+ type, size); - break; - } - -@@ -263,43 +271,60 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, - } - - return ret; -+ -+parse_error: -+ GST_ERROR_OBJECT (flxdec, "Failed to decode chunk"); -+error: -+ return FALSE; - } - - --static void --flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) -+static gboolean -+flx_decode_color (GstFlxDec * flxdec, GstByteReader * reader, -+ GstByteWriter * writer, gint scale) - { -- guint packs, count, indx; -+ guint8 count, indx; -+ guint16 packs; - -- g_return_if_fail (flxdec != NULL); -- -- packs = (data[0] + (data[1] << 8)); -- -- data += 2; -+ if (!gst_byte_reader_get_uint16_le (reader, &packs)) -+ goto error; - indx = 0; - -- GST_LOG ("GstFlxDec: cmap packs: %d", packs); -+ GST_LOG ("GstFlxDec: cmap packs: %d", (guint) packs); - while (packs--) { -+ const guint8 *data; -+ guint16 actual_count; -+ - /* color map index + skip count */ -- indx += *data++; -+ if (!gst_byte_reader_get_uint8 (reader, &indx)) -+ goto error; - - /* number of rgb triplets */ -- count = *data++ & 0xff; -- if (count == 0) -- count = 256; -+ if (!gst_byte_reader_get_uint8 (reader, &count)) -+ goto error; - -- GST_LOG ("GstFlxDec: cmap count: %d (indx: %d)", count, indx); -- flx_set_palette_vector (flxdec->converter, indx, count, data, scale); -+ actual_count = count == 0 ? 256 : count; - -- data += (count * 3); -+ if (!gst_byte_reader_get_data (reader, count * 3, &data)) -+ goto error; -+ -+ GST_LOG_OBJECT (flxdec, "cmap count: %d (indx: %d)", actual_count, indx); -+ flx_set_palette_vector (flxdec->converter, indx, actual_count, -+ (guchar *) data, scale); - } -+ -+ return TRUE; -+ -+error: -+ GST_ERROR_OBJECT (flxdec, "Error decoding color palette"); -+ return FALSE; - } - - static gboolean --flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) -+flx_decode_brun (GstFlxDec * flxdec, GstByteReader * reader, -+ GstByteWriter * writer) - { -- gulong count, lines, row; -- guchar x; -+ gulong lines, row; - - g_return_val_if_fail (flxdec != NULL, FALSE); - -@@ -310,82 +335,125 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - * contain more then 255 RLE packets. we use the frame - * width instead. - */ -- data++; -+ if (!gst_byte_reader_skip (reader, 1)) -+ goto error; - - row = flxdec->hdr.width; - while (row) { -- count = *data++; -+ gint8 count; -+ -+ if (!gst_byte_reader_get_int8 (reader, &count)) -+ goto error; -+ -+ if (count <= 0) { -+ const guint8 *data; - -- if (count > 0x7f) { - /* literal run */ -- count = 0x100 - count; -- if ((glong) row - (glong) count < 0) { -- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); -+ count = ABS (count); -+ -+ GST_LOG_OBJECT (flxdec, "have literal run of size %d", count); -+ -+ if (count > row) { -+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN line detected. " -+ "bytes to write exceeds the end of the row"); - return FALSE; - } - row -= count; - -- while (count--) -- *dest++ = *data++; -- -+ if (!gst_byte_reader_get_data (reader, count, &data)) -+ goto error; -+ if (!gst_byte_writer_put_data (writer, data, count)) -+ goto error; - } else { -- if ((glong) row - (glong) count < 0) { -- GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); -+ guint8 x; -+ -+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d", count); -+ -+ if (count > row) { -+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected." -+ "bytes to write exceeds the end of the row"); - return FALSE; - } - - /* replicate run */ - row -= count; -- x = *data++; - -- while (count--) -- *dest++ = x; -+ if (!gst_byte_reader_get_uint8 (reader, &x)) -+ goto error; -+ if (!gst_byte_writer_fill (writer, x, count)) -+ goto error; - } - } - } - - return TRUE; -+ -+error: -+ GST_ERROR_OBJECT (flxdec, "Failed to decode BRUN packet"); -+ return FALSE; - } - - static gboolean --flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) -+flx_decode_delta_fli (GstFlxDec * flxdec, GstByteReader * reader, -+ GstByteWriter * writer) - { -- gulong count, packets, lines, start_line; -- guchar *start_p, x; -+ guint16 start_line, lines; -+ guint line_start_i; - - g_return_val_if_fail (flxdec != NULL, FALSE); - g_return_val_if_fail (flxdec->delta_data != NULL, FALSE); - - /* use last frame for delta */ -- memcpy (dest, flxdec->delta_data, flxdec->size); -+ if (!gst_byte_writer_put_data (writer, flxdec->delta_data, flxdec->size)) -+ goto error; -+ -+ if (!gst_byte_reader_get_uint16_le (reader, &start_line)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &lines)) -+ goto error; -+ GST_LOG_OBJECT (flxdec, "height %d start line %d line count %d", -+ flxdec->hdr.height, start_line, lines); - -- start_line = (data[0] + (data[1] << 8)); -- lines = (data[2] + (data[3] << 8)); - if (start_line + lines > flxdec->hdr.height) { - GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. too many lines."); - return FALSE; - } -- data += 4; - -- /* start position of delta */ -- dest += (flxdec->hdr.width * start_line); -- start_p = dest; -+ line_start_i = flxdec->hdr.width * start_line; -+ if (!gst_byte_writer_set_pos (writer, line_start_i)) -+ goto error; - - while (lines--) { -+ guint8 packets; -+ - /* packet count */ -- packets = *data++; -+ if (!gst_byte_reader_get_uint8 (reader, &packets)) -+ goto error; -+ GST_LOG_OBJECT (flxdec, "have %d packets", packets); - - while (packets--) { - /* skip count */ -- guchar skip = *data++; -- dest += skip; -+ guint8 skip; -+ gint8 count; -+ if (!gst_byte_reader_get_uint8 (reader, &skip)) -+ goto error; -+ -+ /* skip bytes */ -+ if (!gst_byte_writer_set_pos (writer, -+ gst_byte_writer_get_pos (writer) + skip)) -+ goto error; - - /* RLE count */ -- count = *data++; -+ if (!gst_byte_reader_get_int8 (reader, &count)) -+ goto error; -+ -+ if (count < 0) { -+ guint8 x; - -- if (count > 0x7f) { - /* literal run */ -- count = 0x100 - count; -+ count = ABS (count); -+ GST_LOG_OBJECT (flxdec, "have literal run of size %d at offset %d", -+ count, skip); - - if (skip + count > flxdec->hdr.width) { - GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. " -@@ -393,11 +461,16 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - return FALSE; - } - -- x = *data++; -- while (count--) -- *dest++ = x; -- -+ if (!gst_byte_reader_get_uint8 (reader, &x)) -+ goto error; -+ if (!gst_byte_writer_fill (writer, x, count)) -+ goto error; - } else { -+ const guint8 *data; -+ -+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d at offset %d", -+ count, skip); -+ - if (skip + count > flxdec->hdr.width) { - GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. " - "line too long."); -@@ -405,45 +478,60 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - } - - /* replicate run */ -- while (count--) -- *dest++ = *data++; -+ if (!gst_byte_reader_get_data (reader, count, &data)) -+ goto error; -+ if (!gst_byte_writer_put_data (writer, data, count)) -+ goto error; - } - } -- start_p += flxdec->hdr.width; -- dest = start_p; -+ line_start_i += flxdec->hdr.width; -+ if (!gst_byte_writer_set_pos (writer, line_start_i)) -+ goto error; - } - - return TRUE; -+ -+error: -+ GST_ERROR_OBJECT (flxdec, "Failed to decode FLI packet"); -+ return FALSE; - } - - static gboolean --flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) -+flx_decode_delta_flc (GstFlxDec * flxdec, GstByteReader * reader, -+ GstByteWriter * writer) - { -- gulong count, lines, start_l, opcode; -- guchar *start_p; -+ guint16 lines, start_l; - - g_return_val_if_fail (flxdec != NULL, FALSE); - g_return_val_if_fail (flxdec->delta_data != NULL, FALSE); - - /* use last frame for delta */ -- memcpy (dest, flxdec->delta_data, flxdec->size); -+ if (!gst_byte_writer_put_data (writer, flxdec->delta_data, flxdec->size)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &lines)) -+ goto error; - -- lines = (data[0] + (data[1] << 8)); - if (lines > flxdec->hdr.height) { - GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. too many lines."); - return FALSE; - } -- data += 2; - -- start_p = dest; - start_l = lines; - - while (lines) { -- dest = start_p + (flxdec->hdr.width * (start_l - lines)); -+ guint16 opcode; -+ -+ if (!gst_byte_writer_set_pos (writer, -+ flxdec->hdr.width * (start_l - lines))) -+ goto error; - - /* process opcode(s) */ -- while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { -- data += 2; -+ while (TRUE) { -+ if (!gst_byte_reader_get_uint16_le (reader, &opcode)) -+ goto error; -+ if ((opcode & 0xc000) == 0) -+ break; -+ - if ((opcode & 0xc000) == 0xc000) { - /* line skip count */ - gulong skip = (0x10000 - opcode); -@@ -453,27 +541,44 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - return FALSE; - } - start_l += skip; -- dest += flxdec->hdr.width * skip; -+ if (!gst_byte_writer_set_pos (writer, -+ gst_byte_writer_get_pos (writer) + flxdec->hdr.width * skip)) -+ goto error; - } else { - /* last pixel */ -- dest += flxdec->hdr.width; -- *dest++ = (opcode & 0xff); -+ if (!gst_byte_writer_set_pos (writer, -+ gst_byte_writer_get_pos (writer) + flxdec->hdr.width)) -+ goto error; -+ if (!gst_byte_writer_put_uint8 (writer, opcode & 0xff)) -+ goto error; - } - } -- data += 2; - - /* last opcode is the packet count */ -+ GST_LOG_OBJECT (flxdec, "have %d packets", opcode); - while (opcode--) { - /* skip count */ -- guchar skip = *data++; -- dest += skip; -+ guint8 skip; -+ gint8 count; -+ -+ if (!gst_byte_reader_get_uint8 (reader, &skip)) -+ goto error; -+ if (!gst_byte_writer_set_pos (writer, -+ gst_byte_writer_get_pos (writer) + skip)) -+ goto error; - - /* RLE count */ -- count = *data++; -+ if (!gst_byte_reader_get_int8 (reader, &count)) -+ goto error; -+ -+ if (count < 0) { -+ guint16 x; - -- if (count > 0x7f) { - /* replicate word run */ -- count = 0x100 - count; -+ count = ABS (count); -+ -+ GST_LOG_OBJECT (flxdec, "have replicate run of size %d at offset %d", -+ count, skip); - - if (skip + count > flxdec->hdr.width) { - GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. " -@@ -481,22 +586,31 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - return FALSE; - } - -+ if (!gst_byte_reader_get_uint16_le (reader, &x)) -+ goto error; -+ - while (count--) { -- *dest++ = data[0]; -- *dest++ = data[1]; -+ if (!gst_byte_writer_put_uint16_le (writer, x)) { -+ goto error; -+ } - } -- data += 2; - } else { -+ GST_LOG_OBJECT (flxdec, "have literal run of size %d at offset %d", -+ count, skip); -+ - if (skip + count > flxdec->hdr.width) { - GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. " - "line too long."); - return FALSE; - } - -- /* literal word run */ - while (count--) { -- *dest++ = *data++; -- *dest++ = *data++; -+ guint16 x; -+ -+ if (!gst_byte_reader_get_uint16_le (reader, &x)) -+ goto error; -+ if (!gst_byte_writer_put_uint16_le (writer, x)) -+ goto error; - } - } - } -@@ -504,13 +618,91 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - } - - return TRUE; -+ -+error: -+ GST_ERROR_OBJECT (flxdec, "Failed to decode FLI packet"); -+ return FALSE; -+} -+ -+static gboolean -+_read_flx_header (GstFlxDec * flxdec, GstByteReader * reader, FlxHeader * flxh) -+{ -+ memset (flxh, 0, sizeof (*flxh)); -+ -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->size)) -+ goto error; -+ if (flxh->size < FlxHeaderSize) { -+ GST_ERROR_OBJECT (flxdec, "Invalid file size in the header"); -+ return FALSE; -+ } -+ -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->type)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->frames)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->width)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->height)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->depth)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->flags)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->speed)) -+ goto error; -+ if (!gst_byte_reader_skip (reader, 2)) /* reserved */ -+ goto error; -+ /* FLC */ -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->created)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->creator)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->updated)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->updater)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->aspect_dx)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->aspect_dy)) -+ goto error; -+ /* EGI */ -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->ext_flags)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->keyframes)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->totalframes)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->req_memory)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->max_regions)) -+ goto error; -+ if (!gst_byte_reader_get_uint16_le (reader, &flxh->transp_num)) -+ goto error; -+ if (!gst_byte_reader_skip (reader, 24)) /* reserved */ -+ goto error; -+ /* FLC */ -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->oframe1)) -+ goto error; -+ if (!gst_byte_reader_get_uint32_le (reader, &flxh->oframe2)) -+ goto error; -+ if (!gst_byte_reader_skip (reader, 40)) /* reserved */ -+ goto error; -+ -+ return TRUE; -+ -+error: -+ GST_ERROR_OBJECT (flxdec, "Error reading file header"); -+ return FALSE; - } - - static GstFlowReturn - gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - { -+ GstByteReader reader; -+ GstBuffer *input; -+ GstMapInfo map_info; - GstCaps *caps; -- guint avail; -+ guint available; - GstFlowReturn res = GST_FLOW_OK; - - GstFlxDec *flxdec; -@@ -521,31 +713,50 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - g_return_val_if_fail (flxdec != NULL, GST_FLOW_ERROR); - - gst_adapter_push (flxdec->adapter, buf); -- avail = gst_adapter_available (flxdec->adapter); -+ available = gst_adapter_available (flxdec->adapter); -+ input = gst_adapter_get_buffer (flxdec->adapter, available); -+ if (!gst_buffer_map (input, &map_info, GST_MAP_READ)) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Failed to map buffer"), (NULL)); -+ goto error; -+ } -+ gst_byte_reader_init (&reader, map_info.data, map_info.size); - - if (flxdec->state == GST_FLXDEC_READ_HEADER) { -- if (avail >= FlxHeaderSize) { -- const guint8 *data = gst_adapter_map (flxdec->adapter, FlxHeaderSize); -+ if (available >= FlxHeaderSize) { -+ GstByteReader header; - GstCaps *templ; - -- memcpy ((gchar *) & flxdec->hdr, data, FlxHeaderSize); -- FLX_HDR_FIX_ENDIANNESS (&(flxdec->hdr)); -- gst_adapter_unmap (flxdec->adapter); -+ if (!gst_byte_reader_get_sub_reader (&reader, &header, FlxHeaderSize)) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Could not read header"), (NULL)); -+ goto unmap_input_error; -+ } - gst_adapter_flush (flxdec->adapter, FlxHeaderSize); -+ available -= FlxHeaderSize; -+ -+ if (!_read_flx_header (flxdec, &header, &flxdec->hdr)) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Failed to parse header"), (NULL)); -+ goto unmap_input_error; -+ } - - flxh = &flxdec->hdr; - - /* check header */ - if (flxh->type != FLX_MAGICHDR_FLI && -- flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) -- goto wrong_type; -+ flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL), -+ ("not a flx file (type %x)", flxh->type)); -+ goto unmap_input_error; -+ } - -- GST_LOG ("size : %d", flxh->size); -- GST_LOG ("frames : %d", flxh->frames); -- GST_LOG ("width : %d", flxh->width); -- GST_LOG ("height : %d", flxh->height); -- GST_LOG ("depth : %d", flxh->depth); -- GST_LOG ("speed : %d", flxh->speed); -+ GST_INFO_OBJECT (flxdec, "size : %d", flxh->size); -+ GST_INFO_OBJECT (flxdec, "frames : %d", flxh->frames); -+ GST_INFO_OBJECT (flxdec, "width : %d", flxh->width); -+ GST_INFO_OBJECT (flxdec, "height : %d", flxh->height); -+ GST_INFO_OBJECT (flxdec, "depth : %d", flxh->depth); -+ GST_INFO_OBJECT (flxdec, "speed : %d", flxh->speed); - - flxdec->next_time = 0; - -@@ -573,18 +784,32 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - gst_pad_set_caps (flxdec->srcpad, caps); - gst_caps_unref (caps); - -- if (flxh->depth <= 8) -- flxdec->converter = -- flx_colorspace_converter_new (flxh->width, flxh->height); -+ /* zero means 8 */ -+ if (flxh->depth == 0) -+ flxh->depth = 8; -+ -+ if (flxh->depth != 8) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, -+ ("%s", "Don't know how to decode non 8 bit depth streams"), (NULL)); -+ goto unmap_input_error; -+ } -+ -+ flxdec->converter = -+ flx_colorspace_converter_new (flxh->width, flxh->height); - - if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) { -- GST_LOG ("(FLC) aspect_dx : %d", flxh->aspect_dx); -- GST_LOG ("(FLC) aspect_dy : %d", flxh->aspect_dy); -- GST_LOG ("(FLC) oframe1 : 0x%08x", flxh->oframe1); -- GST_LOG ("(FLC) oframe2 : 0x%08x", flxh->oframe2); -+ GST_INFO_OBJECT (flxdec, "(FLC) aspect_dx : %d", flxh->aspect_dx); -+ GST_INFO_OBJECT (flxdec, "(FLC) aspect_dy : %d", flxh->aspect_dy); -+ GST_INFO_OBJECT (flxdec, "(FLC) oframe1 : 0x%08x", flxh->oframe1); -+ GST_INFO_OBJECT (flxdec, "(FLC) oframe2 : 0x%08x", flxh->oframe2); - } - - flxdec->size = ((guint) flxh->width * (guint) flxh->height); -+ if (flxdec->size >= G_MAXSIZE / 4) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Cannot allocate required memory"), (NULL)); -+ goto unmap_input_error; -+ } - - /* create delta and output frame */ - flxdec->frame_data = g_malloc (flxdec->size); -@@ -596,55 +821,66 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - GstBuffer *out; - - /* while we have enough data in the adapter */ -- while (avail >= FlxFrameChunkSize && res == GST_FLOW_OK) { -- FlxFrameChunk flxfh; -- guchar *chunk; -- const guint8 *data; -- GstMapInfo map; -- -- chunk = NULL; -- data = gst_adapter_map (flxdec->adapter, FlxFrameChunkSize); -- memcpy (&flxfh, data, FlxFrameChunkSize); -- FLX_FRAME_CHUNK_FIX_ENDIANNESS (&flxfh); -- gst_adapter_unmap (flxdec->adapter); -- -- switch (flxfh.id) { -- case FLX_FRAME_TYPE: -- /* check if we have the complete frame */ -- if (avail < flxfh.size) -- goto need_more_data; -- -- /* flush header */ -- gst_adapter_flush (flxdec->adapter, FlxFrameChunkSize); -- -- chunk = gst_adapter_take (flxdec->adapter, -- flxfh.size - FlxFrameChunkSize); -- FLX_FRAME_TYPE_FIX_ENDIANNESS ((FlxFrameType *) chunk); -- if (((FlxFrameType *) chunk)->chunks == 0) -- break; -+ while (available >= FlxFrameChunkSize && res == GST_FLOW_OK) { -+ guint32 size; -+ guint16 type; - -- /* create 32 bits output frame */ --// res = gst_pad_alloc_buffer_and_set_caps (flxdec->srcpad, --// GST_BUFFER_OFFSET_NONE, --// flxdec->size * 4, GST_PAD_CAPS (flxdec->srcpad), &out); --// if (res != GST_FLOW_OK) --// break; -+ if (!gst_byte_reader_get_uint32_le (&reader, &size)) -+ goto parse_error; -+ if (available < size) -+ goto need_more_data; - -- out = gst_buffer_new_and_alloc (flxdec->size * 4); -+ available -= size; -+ gst_adapter_flush (flxdec->adapter, size); -+ -+ if (!gst_byte_reader_get_uint16_le (&reader, &type)) -+ goto parse_error; -+ -+ switch (type) { -+ case FLX_FRAME_TYPE:{ -+ GstByteReader chunks; -+ GstByteWriter writer; -+ guint16 n_chunks; -+ GstMapInfo map; -+ -+ GST_LOG_OBJECT (flxdec, "Have frame type 0x%02x of size %d", type, -+ size); -+ -+ if (!gst_byte_reader_get_sub_reader (&reader, &chunks, -+ size - FlxFrameChunkSize)) -+ goto parse_error; -+ -+ if (!gst_byte_reader_get_uint16_le (&chunks, &n_chunks)) -+ goto parse_error; -+ GST_LOG_OBJECT (flxdec, "Have %d chunks", n_chunks); -+ -+ if (n_chunks == 0) -+ break; -+ if (!gst_byte_reader_skip (&chunks, 8)) /* reserved */ -+ goto parse_error; -+ -+ gst_byte_writer_init_with_data (&writer, flxdec->frame_data, -+ flxdec->size, TRUE); - - /* decode chunks */ -- if (!flx_decode_chunks (flxdec, -- ((FlxFrameType *) chunk)->chunks, -- chunk + FlxFrameTypeSize, flxdec->frame_data)) { -+ if (!flx_decode_chunks (flxdec, n_chunks, &chunks, &writer)) { - GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, - ("%s", "Could not decode chunk"), NULL); -- return GST_FLOW_ERROR; -+ goto unmap_input_error; - } -+ gst_byte_writer_reset (&writer); - - /* save copy of the current frame for possible delta. */ - memcpy (flxdec->delta_data, flxdec->frame_data, flxdec->size); - -- gst_buffer_map (out, &map, GST_MAP_WRITE); -+ out = gst_buffer_new_and_alloc (flxdec->size * 4); -+ if (!gst_buffer_map (out, &map, GST_MAP_WRITE)) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Could not map output buffer"), NULL); -+ gst_buffer_unref (out); -+ goto unmap_input_error; -+ } -+ - /* convert current frame. */ - flx_colorspace_convert (flxdec->converter, flxdec->frame_data, - map.data); -@@ -655,30 +891,32 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - - res = gst_pad_push (flxdec->srcpad, out); - break; -+ } - default: -- /* check if we have the complete frame */ -- if (avail < flxfh.size) -- goto need_more_data; -- -- gst_adapter_flush (flxdec->adapter, flxfh.size); -+ GST_DEBUG_OBJECT (flxdec, "Unknown frame type 0x%02x, skipping %d", -+ type, size); -+ if (!gst_byte_reader_skip (&reader, size - FlxFrameChunkSize)) -+ goto parse_error; - break; - } -- -- g_free (chunk); -- -- avail = gst_adapter_available (flxdec->adapter); - } - } -+ -+ gst_buffer_unmap (input, &map_info); -+ gst_buffer_unref (input); -+ - need_more_data: - return res; - - /* ERRORS */ --wrong_type: -- { -- GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL), -- ("not a flx file (type %x)", flxh->type)); -- return GST_FLOW_ERROR; -- } -+parse_error: -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Failed to parse stream"), (NULL)); -+unmap_input_error: -+ gst_buffer_unmap (input, &map_info); -+ gst_buffer_unref (input); -+error: -+ return GST_FLOW_ERROR; - } - - static GstStateChangeReturn -diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h -index 3f9a0aa..4fd8dfd 100644 ---- a/gst/flx/gstflxdec.h -+++ b/gst/flx/gstflxdec.h -@@ -23,6 +23,8 @@ - #include <gst/gst.h> - - #include <gst/base/gstadapter.h> -+#include <gst/base/gstbytereader.h> -+#include <gst/base/gstbytewriter.h> - #include "flx_color.h" - - G_BEGIN_DECLS -@@ -45,7 +47,7 @@ struct _GstFlxDec { - - guint8 *delta_data, *frame_data; - GstAdapter *adapter; -- gulong size; -+ gsize size; - GstFlxDecState state; - gint64 frame_time; - gint64 next_time; --- -2.10.2 - diff --git a/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch b/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch deleted file mode 100644 index 1daaa2ae15..0000000000 --- a/gnu/packages/patches/gst-plugins-good-fix-invalid-read.patch +++ /dev/null @@ -1,37 +0,0 @@ -Fixes upstream bug #774897 (flxdec: Unreferences itself one time too many on -invalid files): - -https://bugzilla.gnome.org/show_bug.cgi?id=774897 - -Patch copied from upstream source repository: - -https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=b31c504645a814c59d91d49e4fe218acaf93f4ca - -From b31c504645a814c59d91d49e4fe218acaf93f4ca Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com> -Date: Wed, 23 Nov 2016 11:20:49 +0200 -Subject: [PATCH] flxdec: Don't unref() parent in the chain function - -We don't own the reference here, it is owned by the caller and given to -us for the scope of this function. Leftover mistake from 0.10 porting. - -https://bugzilla.gnome.org/show_bug.cgi?id=774897 ---- - gst/flx/gstflxdec.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c -index e675c99..a237976 100644 ---- a/gst/flx/gstflxdec.c -+++ b/gst/flx/gstflxdec.c -@@ -677,7 +677,6 @@ wrong_type: - { - GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL), - ("not a flx file (type %x)", flxh->type)); -- gst_object_unref (flxdec); - return GST_FLOW_ERROR; - } - } --- -2.10.2 - diff --git a/gnu/packages/patches/gst-plugins-good-fix-signedness.patch b/gnu/packages/patches/gst-plugins-good-fix-signedness.patch deleted file mode 100644 index a3e20e19dd..0000000000 --- a/gnu/packages/patches/gst-plugins-good-fix-signedness.patch +++ /dev/null @@ -1,58 +0,0 @@ -This is a followup fix for upstream bug #774834 (flic decoder: Buffer overflow -in flx_decode_delta_fli): - -https://bugzilla.gnome.org/show_bug.cgi?id=774834#c2 - -Patch copied from upstream source repository: - -https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=1ab2b26193861b124426e2f8eb62b75b59ec5488 - -From 1ab2b26193861b124426e2f8eb62b75b59ec5488 Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Tue, 22 Nov 2016 23:46:00 +1100 -Subject: [PATCH] flxdec: fix some warnings comparing unsigned < 0 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -bf43f44fcfada5ec4a3ce60cb374340486fe9fac was comparing an unsigned -expression to be < 0 which was always false. - -gstflxdec.c: In function ‘flx_decode_brun’: -gstflxdec.c:322:33: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] - if ((glong) row - count < 0) { - ^ -gstflxdec.c:332:33: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] - if ((glong) row - count < 0) { - ^ - -https://bugzilla.gnome.org/show_bug.cgi?id=774834 ---- - gst/flx/gstflxdec.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c -index d51a8e6..e675c99 100644 ---- a/gst/flx/gstflxdec.c -+++ b/gst/flx/gstflxdec.c -@@ -319,7 +319,7 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; -- if ((glong) row - count < 0) { -+ if ((glong) row - (glong) count < 0) { - GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); - return FALSE; - } -@@ -329,7 +329,7 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - *dest++ = *data++; - - } else { -- if ((glong) row - count < 0) { -+ if ((glong) row - (glong) count < 0) { - GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); - return FALSE; - } --- -2.10.2 - diff --git a/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch b/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch deleted file mode 100644 index f77dca2cd6..0000000000 --- a/gnu/packages/patches/gst-plugins-good-flic-bounds-check.patch +++ /dev/null @@ -1,319 +0,0 @@ -Fix CVE-2016-{9634,9635,9636}. - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9634 -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9635 -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9636 - -This fixes upstream bug #774834 (flic decoder: Buffer overflow in -flx_decode_delta_fli): - -https://bugzilla.gnome.org/show_bug.cgi?id=774834 - -Patch copied from upstream source repository: - -https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=2e203a79b7d9af4029307c1a845b3c148d5f5e62 - -From 2e203a79b7d9af4029307c1a845b3c148d5f5e62 Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Tue, 22 Nov 2016 19:05:00 +1100 -Subject: [PATCH] flxdec: add some write bounds checking - -Without checking the bounds of the frame we are writing into, we can -write off the end of the destination buffer. - -https://scarybeastsecurity.blogspot.dk/2016/11/0day-exploit-advancing-exploitation.html - -https://bugzilla.gnome.org/show_bug.cgi?id=774834 ---- - gst/flx/gstflxdec.c | 116 +++++++++++++++++++++++++++++++++++++++++----------- - 1 file changed, 91 insertions(+), 25 deletions(-) - -diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c -index 604be2f..d51a8e6 100644 ---- a/gst/flx/gstflxdec.c -+++ b/gst/flx/gstflxdec.c -@@ -74,9 +74,9 @@ static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstObject * parent, - GstQuery * query); - - static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); --static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); --static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); --static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); -+static gboolean flx_decode_brun (GstFlxDec *, guchar *, guchar *); -+static gboolean flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); -+static gboolean flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); - - #define rndalign(off) ((off) + ((off) & 1)) - -@@ -203,13 +203,14 @@ gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent, - return ret; - } - --static void -+static gboolean - flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, - guchar * dest) - { - FlxFrameChunk *hdr; -+ gboolean ret = TRUE; - -- g_return_if_fail (data != NULL); -+ g_return_val_if_fail (data != NULL, FALSE); - - while (count--) { - hdr = (FlxFrameChunk *) data; -@@ -228,17 +229,17 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, - break; - - case FLX_BRUN: -- flx_decode_brun (flxdec, data, dest); -+ ret = flx_decode_brun (flxdec, data, dest); - data += rndalign (hdr->size) - FlxFrameChunkSize; - break; - - case FLX_LC: -- flx_decode_delta_fli (flxdec, data, dest); -+ ret = flx_decode_delta_fli (flxdec, data, dest); - data += rndalign (hdr->size) - FlxFrameChunkSize; - break; - - case FLX_SS2: -- flx_decode_delta_flc (flxdec, data, dest); -+ ret = flx_decode_delta_flc (flxdec, data, dest); - data += rndalign (hdr->size) - FlxFrameChunkSize; - break; - -@@ -256,7 +257,12 @@ flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, - data += rndalign (hdr->size) - FlxFrameChunkSize; - break; - } -+ -+ if (!ret) -+ break; - } -+ -+ return ret; - } - - -@@ -289,13 +295,13 @@ flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) - } - } - --static void -+static gboolean - flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - { - gulong count, lines, row; - guchar x; - -- g_return_if_fail (flxdec != NULL); -+ g_return_val_if_fail (flxdec != NULL, FALSE); - - lines = flxdec->hdr.height; - while (lines--) { -@@ -313,12 +319,21 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; -+ if ((glong) row - count < 0) { -+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); -+ return FALSE; -+ } - row -= count; - - while (count--) - *dest++ = *data++; - - } else { -+ if ((glong) row - count < 0) { -+ GST_ERROR_OBJECT (flxdec, "Invalid BRUN packet detected."); -+ return FALSE; -+ } -+ - /* replicate run */ - row -= count; - x = *data++; -@@ -328,22 +343,28 @@ flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) - } - } - } -+ -+ return TRUE; - } - --static void -+static gboolean - flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - { - gulong count, packets, lines, start_line; - guchar *start_p, x; - -- g_return_if_fail (flxdec != NULL); -- g_return_if_fail (flxdec->delta_data != NULL); -+ g_return_val_if_fail (flxdec != NULL, FALSE); -+ g_return_val_if_fail (flxdec->delta_data != NULL, FALSE); - - /* use last frame for delta */ - memcpy (dest, flxdec->delta_data, flxdec->size); - - start_line = (data[0] + (data[1] << 8)); - lines = (data[2] + (data[3] << 8)); -+ if (start_line + lines > flxdec->hdr.height) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. too many lines."); -+ return FALSE; -+ } - data += 4; - - /* start position of delta */ -@@ -356,7 +377,8 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - - while (packets--) { - /* skip count */ -- dest += *data++; -+ guchar skip = *data++; -+ dest += skip; - - /* RLE count */ - count = *data++; -@@ -364,12 +386,24 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; -- x = *data++; - -+ if (skip + count > flxdec->hdr.width) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. " -+ "line too long."); -+ return FALSE; -+ } -+ -+ x = *data++; - while (count--) - *dest++ = x; - - } else { -+ if (skip + count > flxdec->hdr.width) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLI packet detected. " -+ "line too long."); -+ return FALSE; -+ } -+ - /* replicate run */ - while (count--) - *dest++ = *data++; -@@ -378,21 +412,27 @@ flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) - start_p += flxdec->hdr.width; - dest = start_p; - } -+ -+ return TRUE; - } - --static void -+static gboolean - flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - { - gulong count, lines, start_l, opcode; - guchar *start_p; - -- g_return_if_fail (flxdec != NULL); -- g_return_if_fail (flxdec->delta_data != NULL); -+ g_return_val_if_fail (flxdec != NULL, FALSE); -+ g_return_val_if_fail (flxdec->delta_data != NULL, FALSE); - - /* use last frame for delta */ - memcpy (dest, flxdec->delta_data, flxdec->size); - - lines = (data[0] + (data[1] << 8)); -+ if (lines > flxdec->hdr.height) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. too many lines."); -+ return FALSE; -+ } - data += 2; - - start_p = dest; -@@ -405,9 +445,15 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { - data += 2; - if ((opcode & 0xc000) == 0xc000) { -- /* skip count */ -- start_l += (0x10000 - opcode); -- dest += flxdec->hdr.width * (0x10000 - opcode); -+ /* line skip count */ -+ gulong skip = (0x10000 - opcode); -+ if (skip > flxdec->hdr.height) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. " -+ "skip line count too big."); -+ return FALSE; -+ } -+ start_l += skip; -+ dest += flxdec->hdr.width * skip; - } else { - /* last pixel */ - dest += flxdec->hdr.width; -@@ -419,7 +465,8 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - /* last opcode is the packet count */ - while (opcode--) { - /* skip count */ -- dest += *data++; -+ guchar skip = *data++; -+ dest += skip; - - /* RLE count */ - count = *data++; -@@ -427,12 +474,25 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - if (count > 0x7f) { - /* replicate word run */ - count = 0x100 - count; -+ -+ if (skip + count > flxdec->hdr.width) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. " -+ "line too long."); -+ return FALSE; -+ } -+ - while (count--) { - *dest++ = data[0]; - *dest++ = data[1]; - } - data += 2; - } else { -+ if (skip + count > flxdec->hdr.width) { -+ GST_ERROR_OBJECT (flxdec, "Invalid FLC packet detected. " -+ "line too long."); -+ return FALSE; -+ } -+ - /* literal word run */ - while (count--) { - *dest++ = *data++; -@@ -442,6 +502,8 @@ flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) - } - lines--; - } -+ -+ return TRUE; - } - - static GstFlowReturn -@@ -571,9 +633,13 @@ gst_flxdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) - out = gst_buffer_new_and_alloc (flxdec->size * 4); - - /* decode chunks */ -- flx_decode_chunks (flxdec, -- ((FlxFrameType *) chunk)->chunks, -- chunk + FlxFrameTypeSize, flxdec->frame_data); -+ if (!flx_decode_chunks (flxdec, -+ ((FlxFrameType *) chunk)->chunks, -+ chunk + FlxFrameTypeSize, flxdec->frame_data)) { -+ GST_ELEMENT_ERROR (flxdec, STREAM, DECODE, -+ ("%s", "Could not decode chunk"), NULL); -+ return GST_FLOW_ERROR; -+ } - - /* save copy of the current frame for possible delta. */ - memcpy (flxdec->delta_data, flxdec->frame_data, flxdec->size); --- -2.10.2 - diff --git a/gnu/packages/patches/httpd-CVE-2016-8740.patch b/gnu/packages/patches/httpd-CVE-2016-8740.patch new file mode 100644 index 0000000000..17ba323ccf --- /dev/null +++ b/gnu/packages/patches/httpd-CVE-2016-8740.patch @@ -0,0 +1,36 @@ +This patch applies against httpd-2.4.23 and shouldn't be needed in later releases +http://openwall.com/lists/oss-security/2016/12/05/17 +Index: modules/http2/h2_stream.c +=================================================================== +--- modules/http2/h2_stream.c (revision 1771866) ++++ modules/http2/h2_stream.c (working copy) +@@ -322,18 +322,18 @@ + HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE); + } + } +- } +- +- if (h2_stream_is_scheduled(stream)) { +- return h2_request_add_trailer(stream->request, stream->pool, +- name, nlen, value, vlen); +- } +- else { +- if (!input_open(stream)) { +- return APR_ECONNRESET; ++ ++ if (h2_stream_is_scheduled(stream)) { ++ return h2_request_add_trailer(stream->request, stream->pool, ++ name, nlen, value, vlen); + } +- return h2_request_add_header(stream->request, stream->pool, +- name, nlen, value, vlen); ++ else { ++ if (!input_open(stream)) { ++ return APR_ECONNRESET; ++ } ++ return h2_request_add_header(stream->request, stream->pool, ++ name, nlen, value, vlen); ++ } + } + } + diff --git a/gnu/packages/patches/icecat-CVE-2016-9064.patch b/gnu/packages/patches/icecat-CVE-2016-9064.patch deleted file mode 100644 index a5393815e0..0000000000 --- a/gnu/packages/patches/icecat-CVE-2016-9064.patch +++ /dev/null @@ -1,996 +0,0 @@ -Copied from -<https://hg.mozilla.org/releases/mozilla-esr45/raw-rev/00c2b7baaa0b> -but with one hunk omitted: the git binary patch for -toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi -which is not present in the IceCat sources. - -# HG changeset patch -# User Andrew Swan <aswan@mozilla.com> -# Date 1474063218 25200 -# Node ID 00c2b7baaa0b4bfb7d5f1aac31c094ea6b255e1f -# Parent 46b07bdbf8b20cf3fdc28104add57ff58a55832b -Bug 1303418 - Don't allow upgrades that change the addon ID. r=mossop, a=lizzard - -MozReview-Commit-ID: JHINo8ShmeI - -diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm ---- a/toolkit/mozapps/extensions/AddonManager.jsm -+++ b/toolkit/mozapps/extensions/AddonManager.jsm -@@ -2956,16 +2956,18 @@ this.AddonManager = { - // The downloaded file seems to be corrupted in some way. - ERROR_CORRUPT_FILE: -3, - // An error occured trying to write to the filesystem. - ERROR_FILE_ACCESS: -4, - // The add-on must be signed and isn't. - ERROR_SIGNEDSTATE_REQUIRED: -5, - // The downloaded add-on had a different type than expected. - ERROR_UNEXPECTED_ADDON_TYPE: -6, -+ // The addon did not have the expected ID -+ ERROR_INCORRECT_ID: -7, - - // These must be kept in sync with AddonUpdateChecker. - // No error was encountered. - UPDATE_STATUS_NO_ERROR: 0, - // The update check timed out - UPDATE_STATUS_TIMEOUT: -1, - // There was an error while downloading the update information. - UPDATE_STATUS_DOWNLOAD_ERROR: -2, -diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm ---- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm -+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm -@@ -5473,16 +5473,37 @@ AddonInstall.prototype = { - // loadManifestFromZipReader performs the certificate verification for us - this.addon = yield loadManifestFromZipReader(zipreader, this.installLocation); - } - catch (e) { - zipreader.close(); - return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, e]); - } - -+ if (this.existingAddon) { -+ // Check various conditions related to upgrades -+ if (this.addon.id != this.existingAddon.id) { -+ zipreader.close(); -+ return Promise.reject([AddonManager.ERROR_INCORRECT_ID, -+ `Refusing to upgrade addon ${this.existingAddon.id} to different ID ${this.addon.id}`]); -+ } -+ -+ if (this.addon.type == "multipackage") { -+ zipreader.close(); -+ return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, -+ `Refusing to upgrade addon ${this.existingAddon.id} to a multi-package xpi`]); -+ } -+ -+ if (this.existingAddon.type == "webextension" && this.addon.type != "webextension") { -+ zipreader.close(); -+ return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, -+ "Webextensions may not be updated to other extension types"]); -+ } -+ } -+ - if (mustSign(this.addon.type)) { - if (this.addon.signedState <= AddonManager.SIGNEDSTATE_MISSING) { - // This add-on isn't properly signed by a signature that chains to the - // trusted root. - let state = this.addon.signedState; - this.addon = null; - zipreader.close(); - -@@ -5510,23 +5531,16 @@ AddonInstall.prototype = { - } else { - zipreader.close(); - return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, - "XPI is incorrectly signed"]); - } - } - } - -- if (this.existingAddon && this.existingAddon.type == "webextension" && -- this.addon.type != "webextension") { -- zipreader.close(); -- return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, -- "WebExtensions may not be upated to other extension types"]); -- } -- - if (this.addon.type == "multipackage") - return this._loadMultipackageManifests(zipreader); - - zipreader.close(); - - this.updateAddonURIs(); - - this.addon._install = this; -@@ -5791,16 +5805,17 @@ AddonInstall.prototype = { - else { - // TODO Should we send some event here (bug 557716)? - this.state = AddonManager.STATE_CHECKING; - new UpdateChecker(this.addon, { - onUpdateFinished: aAddon => this.downloadCompleted(), - }, AddonManager.UPDATE_WHEN_ADDON_INSTALLED); - } - }, ([error, message]) => { -+ this.removeTemporaryFile(); - this.downloadFailed(error, message); - }); - } - else { - if (aRequest instanceof Ci.nsIHttpChannel) - this.downloadFailed(AddonManager.ERROR_NETWORK_FAILURE, - aRequest.responseStatus + " " + - aRequest.responseStatusText); -diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js -@@ -0,0 +1,5 @@ -+ -+function install(data, reason) {} -+function startup(data, reason) {} -+function shutdown(data, reason) {} -+function uninstall(data, reason) {} -diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf -@@ -0,0 +1,16 @@ -+<?xml version="1.0"?> -+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -+ xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -+<Description about="urn:mozilla:install-manifest"> -+ <em:id>updatemulti@tests.mozilla.org</em:id> -+ <em:version>1.0</em:version> -+ <em:updateURL>http://localhost:4444/data/test_update_multi.rdf</em:updateURL> -+ <em:bootstrap>true</em:bootstrap> -+ <em:name>Test Addon 1</em:name> -+<em:targetApplication><Description> -+ <em:id>xpcshell@tests.mozilla.org</em:id> -+ <em:minVersion>1</em:minVersion> -+ <em:maxVersion>1</em:maxVersion> -+</Description></em:targetApplication> -+</Description> -+</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf -@@ -0,0 +1,9 @@ -+<?xml version="1.0"?> -+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -+ xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -+<Description about="urn:mozilla:install-manifest"> -+ <em:id>updatemulti@tests.mozilla.org</em:id> -+ <em:type>32</em:type> -+ <em:version>2.0</em:version> -+</Description> -+</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js -@@ -0,0 +1,5 @@ -+ -+function install(data, reason) {} -+function startup(data, reason) {} -+function shutdown(data, reason) {} -+function uninstall(data, reason) {} -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf -@@ -0,0 +1,16 @@ -+<?xml version="1.0"?> -+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -+ xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -+<Description about="urn:mozilla:install-manifest"> -+ <em:id>addon1@tests.mozilla.org</em:id> -+ <em:version>1.0</em:version> -+ <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -+ <em:bootstrap>true</em:bootstrap> -+ <em:name>Test Addon 1</em:name> -+<em:targetApplication><Description> -+ <em:id>xpcshell@tests.mozilla.org</em:id> -+ <em:minVersion>1</em:minVersion> -+ <em:maxVersion>1</em:maxVersion> -+</Description></em:targetApplication> -+</Description> -+</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js -@@ -0,0 +1,5 @@ -+ -+function install(data, reason) {} -+function startup(data, reason) {} -+function shutdown(data, reason) {} -+function uninstall(data, reason) {} -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf -@@ -0,0 +1,16 @@ -+<?xml version="1.0"?> -+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -+ xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -+<Description about="urn:mozilla:install-manifest"> -+ <em:id>addon1.changed@tests.mozilla.org</em:id> -+ <em:version>2.0</em:version> -+ <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -+ <em:bootstrap>true</em:bootstrap> -+ <em:name>Test Addon 1</em:name> -+<em:targetApplication><Description> -+ <em:id>xpcshell@tests.mozilla.org</em:id> -+ <em:minVersion>1</em:minVersion> -+ <em:maxVersion>1</em:maxVersion> -+</Description></em:targetApplication> -+</Description> -+</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf -+++ /dev/null -@@ -1,24 +0,0 @@ --<?xml version="1.0"?> -- --<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -- xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -- -- <Description about="urn:mozilla:install-manifest"> -- <em:id>addon2@tests.mozilla.org</em:id> -- <em:version>2.0</em:version> -- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -- -- <!-- Front End MetaData --> -- <em:name>Test 2</em:name> -- <em:description>Test Description</em:description> -- -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- </Description> -- </em:targetApplication> -- -- </Description> --</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf -+++ /dev/null -@@ -1,24 +0,0 @@ --<?xml version="1.0"?> -- --<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -- xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -- -- <Description about="urn:mozilla:install-manifest"> -- <em:id>addon2@tests.mozilla.org</em:id> -- <em:version>5.0</em:version> -- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -- -- <!-- Front End MetaData --> -- <em:name>Test 2</em:name> -- <em:description>Test Description</em:description> -- -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- </Description> -- </em:targetApplication> -- -- </Description> --</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js -+++ /dev/null -@@ -1,21 +0,0 @@ --Components.utils.import("resource://gre/modules/Services.jsm"); -- --function install(data, reason) { -- Services.prefs.setIntPref("bootstraptest.installed_version", 3); -- Services.prefs.setIntPref("bootstraptest.install_reason", reason); --} -- --function startup(data, reason) { -- Services.prefs.setIntPref("bootstraptest.active_version", 3); -- Services.prefs.setIntPref("bootstraptest.startup_reason", reason); --} -- --function shutdown(data, reason) { -- Services.prefs.setIntPref("bootstraptest.active_version", 0); -- Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason); --} -- --function uninstall(data, reason) { -- Services.prefs.setIntPref("bootstraptest.installed_version", 0); -- Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason); --} -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf -+++ /dev/null -@@ -1,25 +0,0 @@ --<?xml version="1.0"?> -- --<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -- xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -- -- <Description about="urn:mozilla:install-manifest"> -- <em:id>addon3@tests.mozilla.org</em:id> -- <em:version>3.0</em:version> -- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -- <em:bootstrap>true</em:bootstrap> -- -- <!-- Front End MetaData --> -- <em:name>Test 3</em:name> -- <em:description>Test Description</em:description> -- -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- </Description> -- </em:targetApplication> -- -- </Description> --</RDF> -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js -+++ /dev/null -@@ -1,21 +0,0 @@ --Components.utils.import("resource://gre/modules/Services.jsm"); -- --function install(data, reason) { -- Services.prefs.setIntPref("bootstraptest.installed_version", 4); -- Services.prefs.setIntPref("bootstraptest.install_reason", reason); --} -- --function startup(data, reason) { -- Services.prefs.setIntPref("bootstraptest.active_version", 4); -- Services.prefs.setIntPref("bootstraptest.startup_reason", reason); --} -- --function shutdown(data, reason) { -- Services.prefs.setIntPref("bootstraptest.active_version", 0); -- Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason); --} -- --function uninstall(data, reason) { -- Services.prefs.setIntPref("bootstraptest.installed_version", 0); -- Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason); --} -diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf -deleted file mode 100644 ---- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf -+++ /dev/null -@@ -1,25 +0,0 @@ --<?xml version="1.0"?> -- --<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -- xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -- -- <Description about="urn:mozilla:install-manifest"> -- <em:id>addon4@tests.mozilla.org</em:id> -- <em:version>4.0</em:version> -- <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL> -- <em:bootstrap>true</em:bootstrap> -- -- <!-- Front End MetaData --> -- <em:name>Test 4</em:name> -- <em:description>Test Description</em:description> -- -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- </Description> -- </em:targetApplication> -- -- </Description> --</RDF> -diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf -new file mode 100644 ---- /dev/null -+++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf -@@ -0,0 +1,26 @@ -+<?xml version="1.0" encoding="UTF-8"?> -+ -+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -+ xmlns:em="http://www.mozilla.org/2004/em-rdf#"> -+ -+ <Description about="urn:mozilla:extension:updatemulti@tests.mozilla.org"> -+ <em:updates> -+ <Seq> -+ <li> -+ <Description> -+ <em:version>2.0</em:version> -+ <em:targetApplication> -+ <Description> -+ <em:id>xpcshell@tests.mozilla.org</em:id> -+ <em:minVersion>1</em:minVersion> -+ <em:maxVersion>1</em:maxVersion> -+ <em:updateLink>http://localhost:4444/addons/test_update_multi2.xpi</em:updateLink> -+ </Description> -+ </em:targetApplication> -+ </Description> -+ </li> -+ </Seq> -+ </em:updates> -+ </Description> -+ -+</RDF> -diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf ---- a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf -+++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf -@@ -9,77 +9,17 @@ - <li> - <Description> - <em:version>2.0</em:version> - <em:targetApplication> - <Description> - <em:id>xpcshell@tests.mozilla.org</em:id> - <em:minVersion>1</em:minVersion> - <em:maxVersion>1</em:maxVersion> -- <em:updateLink>http://localhost:4444/addons/test_updateid2_2.xpi</em:updateLink> -- </Description> -- </em:targetApplication> -- </Description> -- </li> -- </Seq> -- </em:updates> -- </Description> -- -- <Description about="urn:mozilla:extension:addon2@tests.mozilla.org"> -- <em:updates> -- <Seq> -- <li> -- <Description> -- <em:version>3.0</em:version> -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- <em:updateLink>http://localhost:4444/addons/test_updateid3_3.xpi</em:updateLink> -- </Description> -- </em:targetApplication> -- </Description> -- </li> -- </Seq> -- </em:updates> -- </Description> -- -- <Description about="urn:mozilla:extension:addon3@tests.mozilla.org"> -- <em:updates> -- <Seq> -- <li> -- <Description> -- <em:version>4.0</em:version> -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- <em:updateLink>http://localhost:4444/addons/test_updateid4_4.xpi</em:updateLink> -- </Description> -- </em:targetApplication> -- </Description> -- </li> -- </Seq> -- </em:updates> -- </Description> -- -- <Description about="urn:mozilla:extension:addon4@tests.mozilla.org"> -- <em:updates> -- <Seq> -- <li> -- <Description> -- <em:version>5.0</em:version> -- <em:targetApplication> -- <Description> -- <em:id>xpcshell@tests.mozilla.org</em:id> -- <em:minVersion>1</em:minVersion> -- <em:maxVersion>1</em:maxVersion> -- <em:updateLink>http://localhost:4444/addons/test_updateid2_5.xpi</em:updateLink> -+ <em:updateLink>http://localhost:4444/addons/test_updateid2.xpi</em:updateLink> - </Description> - </em:targetApplication> - </Description> - </li> - </Seq> - </em:updates> - </Description> - -diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js ---- a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js -+++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js -@@ -2,421 +2,85 @@ - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - - // This verifies that updating an add-on to a new ID works - - // The test extension uses an insecure update url. - Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); - --Components.utils.import("resource://testing-common/httpd.js"); --var testserver; - const profileDir = gProfD.clone(); - profileDir.append("extensions"); - --function resetPrefs() { -- Services.prefs.setIntPref("bootstraptest.active_version", -1); -- Services.prefs.setIntPref("bootstraptest.installed_version", -1); -- Services.prefs.setIntPref("bootstraptest.startup_reason", -1); -- Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1); -- Services.prefs.setIntPref("bootstraptest.install_reason", -1); -- Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1); --} -- --function getActiveVersion() { -- return Services.prefs.getIntPref("bootstraptest.active_version"); --} -- --function getInstalledVersion() { -- return Services.prefs.getIntPref("bootstraptest.installed_version"); --} -- --function run_test() { -- createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); -- -- // Create and configure the HTTP server. -- testserver = new HttpServer(); -- testserver.registerDirectory("/data/", do_get_file("data")); -- testserver.registerDirectory("/addons/", do_get_file("addons")); -- testserver.start(4444); -- -- do_test_pending(); -- run_test_1(); --} -- --function end_test() { -- testserver.stop(do_test_finished); --} -- --function installUpdate(aInstall, aCallback) { -- aInstall.addListener({ -- onInstallEnded: function(aInstall) { -- // give the startup time to run -- do_execute_soon(function() { -- aCallback(aInstall); -- }); -- } -- }); -- -- aInstall.install(); --} -- --// Verify that an update to an add-on with a new ID uninstalls the old add-on --function run_test_1() { -- writeInstallRDFForExtension({ -- id: "addon1@tests.mozilla.org", -- version: "1.0", -- updateURL: "http://localhost:4444/data/test_updateid.rdf", -- targetApplications: [{ -- id: "xpcshell@tests.mozilla.org", -- minVersion: "1", -- maxVersion: "1" -- }], -- name: "Test Addon 1", -- }, profileDir); -- -- startupManager(); -- -- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { -- do_check_neq(a1, null); -- do_check_eq(a1.version, "1.0"); -+function promiseInstallUpdate(install) { -+ return new Promise((resolve, reject) => { -+ install.addListener({ -+ onDownloadFailed: () => { -+ let err = new Error("download error"); -+ err.code = install.error; -+ reject(err); -+ }, -+ onInstallFailed: () => { -+ let err = new Error("install error"); -+ err.code = install.error; -+ reject(err); -+ }, -+ onInstallEnded: resolve, -+ }); - -- a1.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- do_check_eq(install.name, addon.name); -- do_check_eq(install.version, "2.0"); -- do_check_eq(install.state, AddonManager.STATE_AVAILABLE); -- do_check_eq(install.existingAddon, a1); -- -- installUpdate(install, check_test_1); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -- }); --} -- --function check_test_1(install) { -- AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { -- // Existing add-on should have a pending upgrade -- do_check_neq(a1.pendingUpgrade, null); -- do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); -- do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); -- do_check_neq(a1.syncGUID); -- -- let a1SyncGUID = a1.syncGUID; -- -- restartManager(); -- -- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", -- "addon2@tests.mozilla.org"], function([a1, a2]) { -- // Should have uninstalled the old and installed the new -- do_check_eq(a1, null); -- do_check_neq(a2, null); -- do_check_neq(a2.syncGUID, null); -- -- // The Sync GUID should change when the ID changes -- do_check_neq(a1SyncGUID, a2.syncGUID); -- -- a2.uninstall(); -- -- do_execute_soon(run_test_2); -- }); -- })); --} -- --// Test that when the new add-on already exists we just upgrade that --function run_test_2() { -- restartManager(); -- shutdownManager(); -- -- writeInstallRDFForExtension({ -- id: "addon1@tests.mozilla.org", -- version: "1.0", -- updateURL: "http://localhost:4444/data/test_updateid.rdf", -- targetApplications: [{ -- id: "xpcshell@tests.mozilla.org", -- minVersion: "1", -- maxVersion: "1" -- }], -- name: "Test Addon 1", -- }, profileDir); -- writeInstallRDFForExtension({ -- id: "addon2@tests.mozilla.org", -- version: "1.0", -- targetApplications: [{ -- id: "xpcshell@tests.mozilla.org", -- minVersion: "1", -- maxVersion: "1" -- }], -- name: "Test Addon 2", -- }, profileDir); -- -- startupManager(); -- -- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { -- do_check_neq(a1, null); -- do_check_eq(a1.version, "1.0"); -- -- a1.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- installUpdate(install, check_test_2); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -+ install.install(); - }); - } - --function check_test_2(install) { -- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", -- "addon2@tests.mozilla.org"], -- callback_soon(function([a1, a2]) { -- do_check_eq(a1.pendingUpgrade, null); -- // Existing add-on should have a pending upgrade -- do_check_neq(a2.pendingUpgrade, null); -- do_check_eq(a2.pendingUpgrade.id, "addon2@tests.mozilla.org"); -- do_check_eq(a2.pendingUpgrade.install.existingAddon, a2); -- -- restartManager(); -- -- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", -- "addon2@tests.mozilla.org"], function([a1, a2]) { -- // Should have uninstalled the old and installed the new -- do_check_neq(a1, null); -- do_check_neq(a2, null); -- -- a1.uninstall(); -- a2.uninstall(); -- -- do_execute_soon(run_test_3); -- }); -- })); --} -- --// Test that we rollback correctly when removing the old add-on fails --function run_test_3() { -- restartManager(); -- shutdownManager(); -- -- // This test only works on Windows -- if (!("nsIWindowsRegKey" in AM_Ci)) { -- run_test_4(); -- return; -- } -- -- writeInstallRDFForExtension({ -- id: "addon1@tests.mozilla.org", -- version: "1.0", -- updateURL: "http://localhost:4444/data/test_updateid.rdf", -- targetApplications: [{ -- id: "xpcshell@tests.mozilla.org", -- minVersion: "1", -- maxVersion: "1" -- }], -- name: "Test Addon 1", -- }, profileDir); -- -- startupManager(); -+// Create and configure the HTTP server. -+let testserver = createHttpServer(4444); -+testserver.registerDirectory("/data/", do_get_file("data")); -+testserver.registerDirectory("/addons/", do_get_file("addons")); - -- AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { -- do_check_neq(a1, null); -- do_check_eq(a1.version, "1.0"); -- -- a1.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- installUpdate(install, check_test_3); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -- }); --} -- --function check_test_3(install) { -- AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { -- // Existing add-on should have a pending upgrade -- do_check_neq(a1.pendingUpgrade, null); -- do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); -- do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); -- -- // Lock the old add-on open so it can't be uninstalled -- var file = profileDir.clone(); -- file.append("addon1@tests.mozilla.org"); -- if (!file.exists()) -- file.leafName += ".xpi"; -- else -- file.append("install.rdf"); -- -- var fstream = AM_Cc["@mozilla.org/network/file-output-stream;1"]. -- createInstance(AM_Ci.nsIFileOutputStream); -- fstream.init(file, FileUtils.MODE_APPEND | FileUtils.MODE_WRONLY, FileUtils.PERMS_FILE, 0); -- -- restartManager(); -- -- fstream.close(); -- -- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", -- "addon2@tests.mozilla.org"], -- callback_soon(function([a1, a2]) { -- // Should not have installed the new add-on but it should still be -- // pending install -- do_check_neq(a1, null); -- do_check_eq(a2, null); -- -- restartManager(); -- -- AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", -- "addon2@tests.mozilla.org"], function([a1, a2]) { -- // Should have installed the new add-on -- do_check_eq(a1, null); -- do_check_neq(a2, null); -- -- a2.uninstall(); -- -- do_execute_soon(run_test_4); -- }); -- })); -- })); -+function run_test() { -+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); -+ startupManager(); -+ run_next_test(); - } - --// Tests that upgrading to a bootstrapped add-on works but requires a restart --function run_test_4() { -- restartManager(); -- shutdownManager(); -- -- writeInstallRDFForExtension({ -- id: "addon2@tests.mozilla.org", -- version: "2.0", -- updateURL: "http://localhost:4444/data/test_updateid.rdf", -- targetApplications: [{ -- id: "xpcshell@tests.mozilla.org", -- minVersion: "1", -- maxVersion: "1" -- }], -- name: "Test Addon 2", -- }, profileDir); -- -- startupManager(); -- -- resetPrefs(); -- -- AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { -- do_check_neq(a2, null); -- do_check_neq(a2.syncGUID, null); -- do_check_eq(a2.version, "2.0"); -- -- a2.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- installUpdate(install, check_test_4); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -- }); --} -- --function check_test_4() { -- AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", -- "addon3@tests.mozilla.org"], -- callback_soon(function([a2, a3]) { -- // Should still be pending install even though the new add-on is restartless -- do_check_neq(a2, null); -- do_check_eq(a3, null); -- -- do_check_neq(a2.pendingUpgrade, null); -- do_check_eq(a2.pendingUpgrade.id, "addon3@tests.mozilla.org"); -- -- do_check_eq(getInstalledVersion(), -1); -- do_check_eq(getActiveVersion(), -1); -- -- restartManager(); -- -- AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", -- "addon3@tests.mozilla.org"], function([a2, a3]) { -- // Should have updated -- do_check_eq(a2, null); -- do_check_neq(a3, null); -- -- do_check_eq(getInstalledVersion(), 3); -- do_check_eq(getActiveVersion(), 3); -- -- do_execute_soon(run_test_5); -- }); -- })); --} -- --// Tests that upgrading to another bootstrapped add-on works without a restart --function run_test_5() { -- AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { -- do_check_neq(a3, null); -- do_check_eq(a3.version, "3.0"); -+// Verify that an update to an add-on with a new ID fails -+add_task(function* test_update_new_id() { -+ yield promiseInstallAllFiles([do_get_addon("test_updateid1")]); - -- a3.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- installUpdate(install, check_test_5); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -- }); --} -- --function check_test_5() { -- AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", -- "addon4@tests.mozilla.org"], -- callback_soon(function([a3, a4]) { -- // Should have updated -- do_check_eq(a3, null); -- do_check_neq(a4, null); -- -- do_check_eq(getInstalledVersion(), 4); -- do_check_eq(getActiveVersion(), 4); -- -- restartManager(); -- -- AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", -- "addon4@tests.mozilla.org"], function([a3, a4]) { -- // Should still be gone -- do_check_eq(a3, null); -- do_check_neq(a4, null); -- -- do_check_eq(getInstalledVersion(), 4); -- do_check_eq(getActiveVersion(), 4); -- -- run_test_6(); -- }); -- })); --} -+ let addon = yield promiseAddonByID("addon1@tests.mozilla.org"); -+ do_check_neq(addon, null); -+ do_check_eq(addon.version, "1.0"); - --// Tests that upgrading to a non-bootstrapped add-on works but requires a restart --function run_test_6() { -- AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { -- do_check_neq(a4, null); -- do_check_eq(a4.version, "4.0"); -- -- a4.findUpdates({ -- onUpdateAvailable: function(addon, install) { -- installUpdate(install, check_test_6); -- } -- }, AddonManager.UPDATE_WHEN_USER_REQUESTED); -- }); --} -+ let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED); -+ let install = update.updateAvailable; -+ do_check_eq(install.name, addon.name); -+ do_check_eq(install.version, "2.0"); -+ do_check_eq(install.state, AddonManager.STATE_AVAILABLE); -+ do_check_eq(install.existingAddon, addon); - --function check_test_6() { -- AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", -- "addon2@tests.mozilla.org"], -- callback_soon(function([a4, a2]) { -- // Should still be pending install even though the old add-on is restartless -- do_check_neq(a4, null); -- do_check_eq(a2, null); -- -- do_check_neq(a4.pendingUpgrade, null); -- do_check_eq(a4.pendingUpgrade.id, "addon2@tests.mozilla.org"); -- -- do_check_eq(getInstalledVersion(), 4); -- do_check_eq(getActiveVersion(), 4); -+ yield Assert.rejects(promiseInstallUpdate(install), -+ function(err) { return err.code == AddonManager.ERROR_INCORRECT_ID }, -+ "Upgrade to a different ID fails"); - -- restartManager(); -+ addon.uninstall(); -+}); - -- AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", -- "addon2@tests.mozilla.org"], function([a4, a2]) { -- // Should have updated -- do_check_eq(a4, null); -- do_check_neq(a2, null); -+// Verify that an update to a multi-package xpi fails -+add_task(function* test_update_new_id() { -+ yield promiseInstallAllFiles([do_get_addon("test_update_multi1")]); - -- do_check_eq(getInstalledVersion(), 0); -- do_check_eq(getActiveVersion(), 0); -+ let addon = yield promiseAddonByID("updatemulti@tests.mozilla.org"); -+ do_check_neq(addon, null); -+ do_check_eq(addon.version, "1.0"); - -- end_test(); -- }); -- })); --} -+ let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED); -+ let install = update.updateAvailable; -+ do_check_eq(install.name, addon.name); -+ do_check_eq(install.version, "2.0"); -+ do_check_eq(install.state, AddonManager.STATE_AVAILABLE); -+ do_check_eq(install.existingAddon, addon); -+ -+ yield Assert.rejects(promiseInstallUpdate(install), -+ function(err) { return err.code == AddonManager.ERROR_UNEXPECTED_ADDON_TYPE }, -+ "Upgrade to a multipackage xpi fails"); -+ -+ addon.uninstall(); -+}); - diff --git a/gnu/packages/patches/inkscape-drop-wait-for-targets.patch b/gnu/packages/patches/inkscape-drop-wait-for-targets.patch deleted file mode 100644 index 3dbe6641e2..0000000000 --- a/gnu/packages/patches/inkscape-drop-wait-for-targets.patch +++ /dev/null @@ -1,68 +0,0 @@ -Copied from Fedora. - -http://pkgs.fedoraproject.org/cgit/rpms/inkscape.git/plain/inkscape-0.91-drop-wait-for-targets.patch?id=eb5340800b563d6b05aa5f11a2f24f2cc0d8c80e - -=== modified file 'src/ui/clipboard.cpp' ---- src/ui/clipboard.cpp 2016-04-02 15:15:43 +0000 -+++ src/ui/clipboard.cpp 2016-04-07 16:30:32 +0000 -@@ -146,8 +146,6 @@ - void _setClipboardColor(guint32); - void _userWarn(SPDesktop *, char const *); - -- void _inkscape_wait_for_targets(std::list<Glib::ustring> &); -- - // private properites - SPDocument *_clipboardSPDoc; ///< Document that stores the clipboard until someone requests it - Inkscape::XML::Node *_defs; ///< Reference to the clipboard document's defs node -@@ -1302,9 +1300,7 @@ - */ - Glib::ustring ClipboardManagerImpl::_getBestTarget() - { -- // GTKmm's wait_for_targets() is broken, see the comment in _inkscape_wait_for_targets() -- std::list<Glib::ustring> targets; // = _clipboard->wait_for_targets(); -- _inkscape_wait_for_targets(targets); -+ std::list<Glib::ustring> targets = _clipboard->wait_for_targets(); - - // clipboard target debugging snippet - /* -@@ -1456,39 +1452,6 @@ - desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, msg); - } - -- --// GTKMM's clipboard::wait_for_targets is buggy and might return bogus, see --// --// https://bugs.launchpad.net/inkscape/+bug/296778 --// http://mail.gnome.org/archives/gtk-devel-list/2009-June/msg00062.html --// --// for details. Until this has been fixed upstream we will use our own implementation --// of this method, as copied from /gtkmm-2.16.0/gtk/gtkmm/clipboard.cc. --void ClipboardManagerImpl::_inkscape_wait_for_targets(std::list<Glib::ustring> &listTargets) --{ -- //Get a newly-allocated array of atoms: -- GdkAtom* targets = NULL; -- gint n_targets = 0; -- gboolean test = gtk_clipboard_wait_for_targets( gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), &targets, &n_targets ); -- if (!test || (targets == NULL)) { -- return; -- } -- -- //Add the targets to the C++ container: -- for (int i = 0; i < n_targets; i++) -- { -- //Convert the atom to a string: -- gchar* const atom_name = gdk_atom_name(targets[i]); -- -- Glib::ustring target; -- if (atom_name) { -- target = Glib::ScopedPtr<char>(atom_name).get(); //This frees the gchar*. -- } -- -- listTargets.push_back(target); -- } --} -- - /* ####################################### - ClipboardManager class - ####################################### */ - diff --git a/gnu/packages/patches/kdbusaddons-kinit-file-name.patch b/gnu/packages/patches/kdbusaddons-kinit-file-name.patch new file mode 100644 index 0000000000..ffed88e043 --- /dev/null +++ b/gnu/packages/patches/kdbusaddons-kinit-file-name.patch @@ -0,0 +1,15 @@ +Add placeholder for kinit's store file name. + +diff --git a/src/kdeinitinterface.cpp b/src/kdeinitinterface.cpp +index 22fa5e5..3d40937 100644 +--- a/src/kdeinitinterface.cpp ++++ b/src/kdeinitinterface.cpp +@@ -52,7 +52,7 @@ void KDEInitInterface::ensureKdeinitRunning() + // If not found in system paths, search other paths + if (srv.isEmpty()) { + const QStringList searchPaths = QStringList() +- << QCoreApplication::applicationDirPath() // then look where our application binary is located ++ << QString::fromUtf8("@SUBSTITUTEME@/bin") // using QStringLiteral would be more efficient, but breaks guix store reference detection. + << QLibraryInfo::location(QLibraryInfo::BinariesPath); // look where exec path is (can be set in qt.conf) + srv = QStandardPaths::findExecutable(QStringLiteral("kdeinit5"), searchPaths); + if (srv.isEmpty()) { diff --git a/gnu/packages/patches/khal-disable-failing-tests.patch b/gnu/packages/patches/khal-disable-failing-tests.patch new file mode 100644 index 0000000000..e2c65df8ce --- /dev/null +++ b/gnu/packages/patches/khal-disable-failing-tests.patch @@ -0,0 +1,33 @@ +Disable some tests that are known to fail: + +https://github.com/pimutils/khal/issues/546 +https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=844081 + +diff --git a/tests/khalendar_test.py b/tests/khalendar_test.py +index fd8dcc6..17732bf 100644 +--- a/tests/khalendar_test.py ++++ b/tests/khalendar_test.py +@@ -65,6 +65,7 @@ class TestCalendar(object): + else: + mtimes[cal] = mtime + ++ @pytest.mark.xfail + def test_db_needs_update(self, coll_vdirs): + coll, vdirs = coll_vdirs + +@@ -321,6 +322,7 @@ class TestDbCreation(object): + CalendarCollection(calendars, dbpath=dbpath, locale=aux.locale) + + ++@pytest.mark.xfail + def test_default_calendar(coll_vdirs): + """test if an update to the vdir is detected by the CalendarCollection""" + coll, vdirs = coll_vdirs +@@ -341,6 +343,7 @@ def test_default_calendar(coll_vdirs): + assert len(list(coll.get_events_on(today))) == 0 + + ++@pytest.mark.xfail + def test_only_update_old_event(coll_vdirs, monkeypatch): + coll, vdirs = coll_vdirs + diff --git a/gnu/packages/patches/libepoxy-gl-null-checks.patch b/gnu/packages/patches/libepoxy-gl-null-checks.patch new file mode 100644 index 0000000000..bdc4b05989 --- /dev/null +++ b/gnu/packages/patches/libepoxy-gl-null-checks.patch @@ -0,0 +1,54 @@ +This patch from <https://bugzilla.redhat.com/show_bug.cgi?id=1395366> adds NULL +checks to avoid crashes when GL support is missing, as is the case when running +Xvfb. + +Upstream issue: <https://github.com/anholt/libepoxy/issues/72>. + +diff -ur libepoxy-1.3.1/src/dispatch_common.c libepoxy-1.3.1/src/dispatch_common.c +--- libepoxy-1.3.1/src/dispatch_common.c 2015-07-15 19:46:36.000000000 -0400 ++++ libepoxy-1.3.1/src/dispatch_common.c 2016-11-16 09:03:52.809066247 -0500 +@@ -348,6 +348,8 @@ + epoxy_extension_in_string(const char *extension_list, const char *ext) + { + const char *ptr = extension_list; ++ if (! ptr) return false; ++ if (! ext) return false; + int len = strlen(ext); + + /* Make sure that don't just find an extension with our name as a prefix. */ +@@ -380,6 +382,7 @@ + + for (i = 0; i < num_extensions; i++) { + const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i); ++ if (! gl_ext) return false; + if (strcmp(ext, gl_ext) == 0) + return true; + } +diff -ur libepoxy-1.3.1/src/dispatch_egl.c libepoxy-1.3.1/src/dispatch_egl.c +--- libepoxy-1.3.1/src/dispatch_egl.c 2015-07-15 19:46:36.000000000 -0400 ++++ libepoxy-1.3.1/src/dispatch_egl.c 2016-11-16 08:40:34.069358709 -0500 +@@ -46,6 +46,7 @@ + int ret; + + version_string = eglQueryString(dpy, EGL_VERSION); ++ if (! version_string) return 0; + ret = sscanf(version_string, "%d.%d", &major, &minor); + assert(ret == 2); + return major * 10 + minor; +diff -ur libepoxy-1.3.1/src/dispatch_glx.c libepoxy-1.3.1/src/dispatch_glx.c +--- libepoxy-1.3.1/src/dispatch_glx.c 2015-07-15 19:46:36.000000000 -0400 ++++ libepoxy-1.3.1/src/dispatch_glx.c 2016-11-16 08:41:03.065730370 -0500 +@@ -57,11 +57,13 @@ + int ret; + + version_string = glXQueryServerString(dpy, screen, GLX_VERSION); ++ if (! version_string) return 0; + ret = sscanf(version_string, "%d.%d", &server_major, &server_minor); + assert(ret == 2); + server = server_major * 10 + server_minor; + + version_string = glXGetClientString(dpy, GLX_VERSION); ++ if (! version_string) return 0; + ret = sscanf(version_string, "%d.%d", &client_major, &client_minor); + assert(ret == 2); + client = client_major * 10 + client_minor; diff --git a/gnu/packages/patches/libpng-CVE-2016-10087.patch b/gnu/packages/patches/libpng-CVE-2016-10087.patch new file mode 100644 index 0000000000..8093b3e448 --- /dev/null +++ b/gnu/packages/patches/libpng-CVE-2016-10087.patch @@ -0,0 +1,37 @@ +Fix CVE-2016-10087, a null pointer dereference in png_set_text_2(): + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10087 +http://seclists.org/oss-sec/2016/q4/777 + +Patch adapted from upstream source repository: + +https://sourceforge.net/p/libpng/code/ci/812768d7a9c973452222d454634496b25ed415eb/ + +From 812768d7a9c973452222d454634496b25ed415eb Mon Sep 17 00:00:00 2001 +From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net> +Date: Thu, 29 Dec 2016 07:51:33 -0600 +Subject: [PATCH] [libpng16] Fixed a potential null pointer dereference in + png_set_text_2() + +(bug report and patch by Patrick Keshishian). +--- + ANNOUNCE | 2 ++ + CHANGES | 2 ++ + png.c | 1 + + 3 files changed, 5 insertions(+) + +diff --git a/png.c b/png.c +index 8afc28fc2..2e05de159 100644 +--- a/png.c ++++ b/png.c +@@ -477,6 +477,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, + png_free(png_ptr, info_ptr->text); + info_ptr->text = NULL; + info_ptr->num_text = 0; ++ info_ptr->max_text = 0; + } + } + #endif +-- +2.11.0 + diff --git a/gnu/packages/patches/libupnp-CVE-2016-8863.patch b/gnu/packages/patches/libupnp-CVE-2016-8863.patch new file mode 100644 index 0000000000..9978b39487 --- /dev/null +++ b/gnu/packages/patches/libupnp-CVE-2016-8863.patch @@ -0,0 +1,72 @@ +Fix CVE-2016-8863: + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8863 +https://sourceforge.net/p/pupnp/bugs/133/ + +Patch copied from upstream source repository: + +https://sourceforge.net/p/pupnp/code/ci/9c099c2923ab4d98530ab5204af1738be5bddba7/ + +From 9c099c2923ab4d98530ab5204af1738be5bddba7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <ukleinek@debian.org> +Date: Thu, 8 Dec 2016 17:11:53 +0100 +Subject: [PATCH] Fix out-of-bound access in create_url_list() (CVE-2016-8863) + +If there is an invalid URL in URLS->buf after a valid one, uri_parse is +called with out pointing after the allocated memory. As uri_parse writes +to *out before returning an error the loop in create_url_list must be +stopped early to prevent an out-of-bound access + +Bug: https://sourceforge.net/p/pupnp/bugs/133/ +Bug-CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8863 +Bug-Debian: https://bugs.debian.org/842093 +Bug-Redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1388771 +(cherry picked from commit a0f6e719bc03c4d2fe6a4a42ef6b8761446f520b) +--- + upnp/src/gena/gena_device.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +diff --git a/upnp/src/gena/gena_device.c b/upnp/src/gena/gena_device.c +index fb04a29..245c56b 100644 +--- a/upnp/src/gena/gena_device.c ++++ b/upnp/src/gena/gena_device.c +@@ -1113,7 +1113,7 @@ static int create_url_list( + /*! [out] . */ + URL_list *out) + { +- size_t URLcount = 0; ++ size_t URLcount = 0, URLcount2 = 0; + size_t i; + int return_code = 0; + uri_type temp; +@@ -1155,16 +1155,23 @@ static int create_url_list( + } + memcpy( out->URLs, URLS->buff, URLS->size ); + out->URLs[URLS->size] = 0; +- URLcount = 0; + for( i = 0; i < URLS->size; i++ ) { + if( ( URLS->buff[i] == '<' ) && ( i + 1 < URLS->size ) ) { + if( ( ( return_code = + parse_uri( &out->URLs[i + 1], URLS->size - i + 1, +- &out->parsedURLs[URLcount] ) ) == ++ &out->parsedURLs[URLcount2] ) ) == + HTTP_SUCCESS ) +- && ( out->parsedURLs[URLcount].hostport.text.size != ++ && ( out->parsedURLs[URLcount2].hostport.text.size != + 0 ) ) { +- URLcount++; ++ URLcount2++; ++ if (URLcount2 >= URLcount) ++ /* ++ * break early here in case there is a bogus URL that ++ * was skipped above. This prevents to access ++ * out->parsedURLs[URLcount] which is beyond the ++ * allocation. ++ */ ++ break; + } else { + if( return_code == UPNP_E_OUTOF_MEMORY ) { + free( out->URLs ); +-- +2.11.0 + diff --git a/gnu/packages/patches/libxml2-CVE-2016-4658.patch b/gnu/packages/patches/libxml2-CVE-2016-4658.patch new file mode 100644 index 0000000000..a4e1f31fae --- /dev/null +++ b/gnu/packages/patches/libxml2-CVE-2016-4658.patch @@ -0,0 +1,257 @@ +Fix CVE-2016-4658: + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4658 + +Patch copied from upstream source repository: + +https://git.gnome.org/browse/libxml2/commit/?id=c1d1f7121194036608bf555f08d3062a36fd344b + +From c1d1f7121194036608bf555f08d3062a36fd344b Mon Sep 17 00:00:00 2001 +From: Nick Wellnhofer <wellnhofer@aevum.de> +Date: Tue, 28 Jun 2016 18:34:52 +0200 +Subject: [PATCH] Disallow namespace nodes in XPointer ranges + +Namespace nodes must be copied to avoid use-after-free errors. +But they don't necessarily have a physical representation in a +document, so simply disallow them in XPointer ranges. + +Found with afl-fuzz. + +Fixes CVE-2016-4658. +--- + xpointer.c | 149 +++++++++++++++++++++++-------------------------------------- + 1 file changed, 56 insertions(+), 93 deletions(-) + +diff --git a/xpointer.c b/xpointer.c +index a7b03fbd..694d120e 100644 +--- a/xpointer.c ++++ b/xpointer.c +@@ -320,6 +320,45 @@ xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) { + } + + /** ++ * xmlXPtrNewRangeInternal: ++ * @start: the starting node ++ * @startindex: the start index ++ * @end: the ending point ++ * @endindex: the ending index ++ * ++ * Internal function to create a new xmlXPathObjectPtr of type range ++ * ++ * Returns the newly created object. ++ */ ++static xmlXPathObjectPtr ++xmlXPtrNewRangeInternal(xmlNodePtr start, int startindex, ++ xmlNodePtr end, int endindex) { ++ xmlXPathObjectPtr ret; ++ ++ /* ++ * Namespace nodes must be copied (see xmlXPathNodeSetDupNs). ++ * Disallow them for now. ++ */ ++ if ((start != NULL) && (start->type == XML_NAMESPACE_DECL)) ++ return(NULL); ++ if ((end != NULL) && (end->type == XML_NAMESPACE_DECL)) ++ return(NULL); ++ ++ ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); ++ if (ret == NULL) { ++ xmlXPtrErrMemory("allocating range"); ++ return(NULL); ++ } ++ memset(ret, 0, sizeof(xmlXPathObject)); ++ ret->type = XPATH_RANGE; ++ ret->user = start; ++ ret->index = startindex; ++ ret->user2 = end; ++ ret->index2 = endindex; ++ return(ret); ++} ++ ++/** + * xmlXPtrNewRange: + * @start: the starting node + * @startindex: the start index +@@ -344,17 +383,7 @@ xmlXPtrNewRange(xmlNodePtr start, int startindex, + if (endindex < 0) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start; +- ret->index = startindex; +- ret->user2 = end; +- ret->index2 = endindex; ++ ret = xmlXPtrNewRangeInternal(start, startindex, end, endindex); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +@@ -381,17 +410,8 @@ xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { + if (end->type != XPATH_POINT) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start->user; +- ret->index = start->index; +- ret->user2 = end->user; +- ret->index2 = end->index; ++ ret = xmlXPtrNewRangeInternal(start->user, start->index, end->user, ++ end->index); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +@@ -416,17 +436,7 @@ xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { + if (start->type != XPATH_POINT) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start->user; +- ret->index = start->index; +- ret->user2 = end; +- ret->index2 = -1; ++ ret = xmlXPtrNewRangeInternal(start->user, start->index, end, -1); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +@@ -453,17 +463,7 @@ xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { + if (end->type != XPATH_POINT) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start; +- ret->index = -1; +- ret->user2 = end->user; +- ret->index2 = end->index; ++ ret = xmlXPtrNewRangeInternal(start, -1, end->user, end->index); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +@@ -486,17 +486,7 @@ xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { + if (end == NULL) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start; +- ret->index = -1; +- ret->user2 = end; +- ret->index2 = -1; ++ ret = xmlXPtrNewRangeInternal(start, -1, end, -1); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +@@ -516,17 +506,7 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { + if (start == NULL) + return(NULL); + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start; +- ret->index = -1; +- ret->user2 = NULL; +- ret->index2 = -1; ++ ret = xmlXPtrNewRangeInternal(start, -1, NULL, -1); + return(ret); + } + +@@ -541,6 +521,8 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { + */ + xmlXPathObjectPtr + xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { ++ xmlNodePtr endNode; ++ int endIndex; + xmlXPathObjectPtr ret; + + if (start == NULL) +@@ -549,7 +531,12 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { + return(NULL); + switch (end->type) { + case XPATH_POINT: ++ endNode = end->user; ++ endIndex = end->index; ++ break; + case XPATH_RANGE: ++ endNode = end->user2; ++ endIndex = end->index2; + break; + case XPATH_NODESET: + /* +@@ -557,39 +544,15 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { + */ + if (end->nodesetval->nodeNr <= 0) + return(NULL); ++ endNode = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; ++ endIndex = -1; + break; + default: + /* TODO */ + return(NULL); + } + +- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); +- if (ret == NULL) { +- xmlXPtrErrMemory("allocating range"); +- return(NULL); +- } +- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); +- ret->type = XPATH_RANGE; +- ret->user = start; +- ret->index = -1; +- switch (end->type) { +- case XPATH_POINT: +- ret->user2 = end->user; +- ret->index2 = end->index; +- break; +- case XPATH_RANGE: +- ret->user2 = end->user2; +- ret->index2 = end->index2; +- break; +- case XPATH_NODESET: { +- ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; +- ret->index2 = -1; +- break; +- } +- default: +- STRANGE +- return(NULL); +- } ++ ret = xmlXPtrNewRangeInternal(start, -1, endNode, endIndex); + xmlXPtrRangeCheckOrder(ret); + return(ret); + } +-- +2.11.0 + diff --git a/gnu/packages/patches/libxml2-CVE-2016-5131.patch b/gnu/packages/patches/libxml2-CVE-2016-5131.patch new file mode 100644 index 0000000000..38938c8e3e --- /dev/null +++ b/gnu/packages/patches/libxml2-CVE-2016-5131.patch @@ -0,0 +1,218 @@ +Fix CVE-2016-5131: + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5131 + +Patches copied from upstream source repository (the test suite fails +without the 2nd patch): + +https://git.gnome.org/browse/libxml2/commit/?id=9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e +https://git.gnome.org/browse/libxml2/commit/?id=a005199330b86dada19d162cae15ef9bdcb6baa8 + +From 9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e Mon Sep 17 00:00:00 2001 +From: Nick Wellnhofer <wellnhofer@aevum.de> +Date: Tue, 28 Jun 2016 14:22:23 +0200 +Subject: [PATCH] Fix XPointer paths beginning with range-to + +The old code would invoke the broken xmlXPtrRangeToFunction. range-to +isn't really a function but a special kind of location step. Remove +this function and always handle range-to in the XPath code. + +The old xmlXPtrRangeToFunction could also be abused to trigger a +use-after-free error with the potential for remote code execution. + +Found with afl-fuzz. + +Fixes CVE-2016-5131. +--- + result/XPath/xptr/vidbase | 13 ++++++++ + test/XPath/xptr/vidbase | 1 + + xpath.c | 7 ++++- + xpointer.c | 76 ++++------------------------------------------- + 4 files changed, 26 insertions(+), 71 deletions(-) + +diff --git a/result/XPath/xptr/vidbase b/result/XPath/xptr/vidbase +index 8b9e92d6..f19193e7 100644 +--- a/result/XPath/xptr/vidbase ++++ b/result/XPath/xptr/vidbase +@@ -17,3 +17,16 @@ Object is a Location Set: + To node + ELEMENT p + ++ ++======================== ++Expression: xpointer(range-to(id('chapter2'))) ++Object is a Location Set: ++1 : Object is a range : ++ From node ++ / ++ To node ++ ELEMENT chapter ++ ATTRIBUTE id ++ TEXT ++ content=chapter2 ++ +diff --git a/test/XPath/xptr/vidbase b/test/XPath/xptr/vidbase +index b1463830..884b1065 100644 +--- a/test/XPath/xptr/vidbase ++++ b/test/XPath/xptr/vidbase +@@ -1,2 +1,3 @@ + xpointer(id('chapter1')/p) + xpointer(id('chapter1')/p[1]/range-to(following-sibling::p[2])) ++xpointer(range-to(id('chapter2'))) +diff --git a/xpath.c b/xpath.c +index d992841e..5a01b1b3 100644 +--- a/xpath.c ++++ b/xpath.c +@@ -10691,13 +10691,18 @@ xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { + lc = 1; + break; + } else if ((NXT(len) == '(')) { +- /* Note Type or Function */ ++ /* Node Type or Function */ + if (xmlXPathIsNodeType(name)) { + #ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: Type search\n"); + #endif + lc = 1; ++#ifdef LIBXML_XPTR_ENABLED ++ } else if (ctxt->xptr && ++ xmlStrEqual(name, BAD_CAST "range-to")) { ++ lc = 1; ++#endif + } else { + #ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, +diff --git a/xpointer.c b/xpointer.c +index 676c5105..d74174a3 100644 +--- a/xpointer.c ++++ b/xpointer.c +@@ -1332,8 +1332,6 @@ xmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) { + ret->here = here; + ret->origin = origin; + +- xmlXPathRegisterFunc(ret, (xmlChar *)"range-to", +- xmlXPtrRangeToFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"range", + xmlXPtrRangeFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside", +@@ -2243,76 +2241,14 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { + * @nargs: the number of args + * + * Implement the range-to() XPointer function ++ * ++ * Obsolete. range-to is not a real function but a special type of location ++ * step which is handled in xpath.c. + */ + void +-xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { +- xmlXPathObjectPtr range; +- const xmlChar *cur; +- xmlXPathObjectPtr res, obj; +- xmlXPathObjectPtr tmp; +- xmlLocationSetPtr newset = NULL; +- xmlNodeSetPtr oldset; +- int i; +- +- if (ctxt == NULL) return; +- CHECK_ARITY(1); +- /* +- * Save the expression pointer since we will have to evaluate +- * it multiple times. Initialize the new set. +- */ +- CHECK_TYPE(XPATH_NODESET); +- obj = valuePop(ctxt); +- oldset = obj->nodesetval; +- ctxt->context->node = NULL; +- +- cur = ctxt->cur; +- newset = xmlXPtrLocationSetCreate(NULL); +- +- for (i = 0; i < oldset->nodeNr; i++) { +- ctxt->cur = cur; +- +- /* +- * Run the evaluation with a node list made of a single item +- * in the nodeset. +- */ +- ctxt->context->node = oldset->nodeTab[i]; +- tmp = xmlXPathNewNodeSet(ctxt->context->node); +- valuePush(ctxt, tmp); +- +- xmlXPathEvalExpr(ctxt); +- CHECK_ERROR; +- +- /* +- * The result of the evaluation need to be tested to +- * decided whether the filter succeeded or not +- */ +- res = valuePop(ctxt); +- range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res); +- if (range != NULL) { +- xmlXPtrLocationSetAdd(newset, range); +- } +- +- /* +- * Cleanup +- */ +- if (res != NULL) +- xmlXPathFreeObject(res); +- if (ctxt->value == tmp) { +- res = valuePop(ctxt); +- xmlXPathFreeObject(res); +- } +- +- ctxt->context->node = NULL; +- } +- +- /* +- * The result is used as the new evaluation set. +- */ +- xmlXPathFreeObject(obj); +- ctxt->context->node = NULL; +- ctxt->context->contextSize = -1; +- ctxt->context->proximityPosition = -1; +- valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); ++xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, ++ int nargs ATTRIBUTE_UNUSED) { ++ XP_ERROR(XPATH_EXPR_ERROR); + } + + /** +-- +2.11.0 + +From a005199330b86dada19d162cae15ef9bdcb6baa8 Mon Sep 17 00:00:00 2001 +From: Nick Wellnhofer <wellnhofer@aevum.de> +Date: Tue, 28 Jun 2016 14:19:58 +0200 +Subject: [PATCH] Fix comparison with root node in xmlXPathCmpNodes + +This change has already been made in xmlXPathCmpNodesExt but not in +xmlXPathCmpNodes. +--- + xpath.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/xpath.c b/xpath.c +index 751665b8..d992841e 100644 +--- a/xpath.c ++++ b/xpath.c +@@ -3342,13 +3342,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { + * compute depth to root + */ + for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { +- if (cur == node1) ++ if (cur->parent == node1) + return(1); + depth2++; + } + root = cur; + for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { +- if (cur == node2) ++ if (cur->parent == node2) + return(-1); + depth1++; + } +-- +2.11.0 + diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch index 60cf8e0430..3089f962f7 100644 --- a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch +++ b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch @@ -3,30 +3,17 @@ From: Tom Callaway <spot@fedoraproject.org> Date: Fri, 7 Sep 2012 11:39:29 -0400 Subject: apply fix for CVE-2012-4409 (thanks to Raphael Geissert) ---- - mcrypt-CVE-2012-4409.patch | 12 ++++++++++++ - mcrypt.spec | 10 +++++++++- - 2 files changed, 21 insertions(+), 1 deletion(-) - create mode 100644 mcrypt-CVE-2012-4409.patch - -diff --git a/mcrypt-CVE-2012-4409.patch b/mcrypt-CVE-2012-4409.patch -new file mode 100644 -index 0000000..747f428 ---- /dev/null -+++ b/mcrypt-CVE-2012-4409.patch -@@ -0,0 +1,12 @@ -+diff -up mcrypt-2.6.8/src/extra.c.CVE-2012-4409 mcrypt-2.6.8/src/extra.c -+--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409 2012-09-07 11:00:55.906870746 -0400 -++++ mcrypt-2.6.8/src/extra.c 2012-09-07 11:00:27.967858365 -0400 -+@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char -+ if (m_getbit(0, sflag) != 0) { /* if the first bit is set */ -+ *salt_size = m_setbit(0, sflag, 0); -+ if (*salt_size > 0) { -++ if (*salt_size > sizeof(tmp_buf)) -++ err_quit(_("Salt is too long\n")); -+ fread(tmp_buf, 1, *salt_size, -+ fstream); -+ memmove(salt, tmp_buf, *salt_size); +--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409 2012-09-07 11:00:55.906870746 -0400 ++++ mcrypt-2.6.8/src/extra.c 2012-09-07 11:00:27.967858365 -0400 +@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char + if (m_getbit(0, sflag) != 0) { /* if the first bit is set */ + *salt_size = m_setbit(0, sflag, 0); + if (*salt_size > 0) { ++ if (*salt_size > sizeof(tmp_buf)) ++ err_quit(_("Salt is too long\n")); + fread(tmp_buf, 1, *salt_size, + fstream); + memmove(salt, tmp_buf, *salt_size); -- cgit v0.12 diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch index d931dd174b..dfbf048583 100644 --- a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch +++ b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch @@ -3,109 +3,97 @@ From: Tom Callaway <spot@fedoraproject.org> Date: Tue, 30 Oct 2012 15:39:24 -0400 Subject: apply workaround to CVE-2012-4527 ---- - mcrypt-CVE-2012-4527-80-width-patch | 91 +++++++++++++++++++++++++++++++++++++ - mcrypt.spec | 10 +++- - 2 files changed, 100 insertions(+), 1 deletion(-) - create mode 100644 mcrypt-CVE-2012-4527-80-width-patch - -diff --git a/mcrypt-CVE-2012-4527-80-width-patch b/mcrypt-CVE-2012-4527-80-width-patch -new file mode 100644 -index 0000000..0eb94d8 ---- /dev/null -+++ b/mcrypt-CVE-2012-4527-80-width-patch -@@ -0,0 +1,91 @@ -+--- mcrypt-2.6.8.orig/src/mcrypt.c -++++ mcrypt-2.6.8/src/mcrypt.c -+@@ -41,6 +41,8 @@ -+ # include <time.h> -+ #endif -+ -++#define WIDTH 80 -++ -+ static char rcsid[] = -+ "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $"; -+ -+@@ -482,7 +484,7 @@ -+ #ifdef HAVE_STAT -+ if (stream_flag == FALSE) { -+ if (is_normal_file(file[i]) == FALSE) { -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("%s: %s is not a regular file. Skipping...\n"), -+ program_name, file[i]); -+@@ -501,7 +503,7 @@ -+ dinfile = file[i]; -+ if ((isatty(fileno((FILE *) (stdin))) == 1) -+ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("%s: Encrypted data will not be read from a terminal.\n"), -+ program_name); -+@@ -520,7 +522,7 @@ -+ einfile = file[i]; -+ if ((isatty(fileno((FILE *) (stdout))) == 1) -+ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("%s: Encrypted data will not be written to a terminal.\n"), -+ program_name); -+@@ -544,7 +546,7 @@ -+ strcpy(outfile, einfile); -+ /* if file has already the .nc ignore it */ -+ if (strstr(outfile, ".nc") != NULL) { -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("%s: file %s has the .nc suffix... skipping...\n"), -+ program_name, outfile); -+@@ -590,10 +592,10 @@ -+ -+ if (x == 0) { -+ if (stream_flag == FALSE) { -+- sprintf(tmperr, _("File %s was decrypted.\n"), dinfile); -++ snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile); -+ err_warn(tmperr); -+ } else { -+- sprintf(tmperr, _("Stdin was decrypted.\n")); -++ snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n")); -+ err_warn(tmperr); -+ } -+ #ifdef HAVE_STAT -+@@ -610,7 +612,7 @@ -+ -+ } else { -+ if (stream_flag == FALSE) { -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("File %s was NOT decrypted successfully.\n"), -+ dinfile); -+@@ -636,10 +638,10 @@ -+ -+ if (x == 0) { -+ if (stream_flag == FALSE) { -+- sprintf(tmperr, _("File %s was encrypted.\n"), einfile); -++ snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile); -+ err_warn(tmperr); -+ } else { -+- sprintf(tmperr, _("Stdin was encrypted.\n")); -++ snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n")); -+ err_warn(tmperr); -+ } -+ #ifdef HAVE_STAT -+@@ -655,7 +657,7 @@ -+ -+ } else { -+ if (stream_flag == FALSE) { -+- sprintf(tmperr, -++ snprintf(tmperr, WIDTH, -+ _ -+ ("File %s was NOT encrypted successfully.\n"), -+ einfile); --- -cgit v0.12 +--- mcrypt-2.6.8.orig/src/mcrypt.c ++++ mcrypt-2.6.8/src/mcrypt.c +@@ -41,6 +41,8 @@ + # include <time.h> + #endif + ++#define WIDTH 80 ++ + static char rcsid[] = + "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $"; + +@@ -482,7 +484,7 @@ + #ifdef HAVE_STAT + if (stream_flag == FALSE) { + if (is_normal_file(file[i]) == FALSE) { +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("%s: %s is not a regular file. Skipping...\n"), + program_name, file[i]); +@@ -501,7 +503,7 @@ + dinfile = file[i]; + if ((isatty(fileno((FILE *) (stdin))) == 1) + && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("%s: Encrypted data will not be read from a terminal.\n"), + program_name); +@@ -520,7 +522,7 @@ + einfile = file[i]; + if ((isatty(fileno((FILE *) (stdout))) == 1) + && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("%s: Encrypted data will not be written to a terminal.\n"), + program_name); +@@ -544,7 +546,7 @@ + strcpy(outfile, einfile); + /* if file has already the .nc ignore it */ + if (strstr(outfile, ".nc") != NULL) { +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("%s: file %s has the .nc suffix... skipping...\n"), + program_name, outfile); +@@ -590,10 +592,10 @@ + + if (x == 0) { + if (stream_flag == FALSE) { +- sprintf(tmperr, _("File %s was decrypted.\n"), dinfile); ++ snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile); + err_warn(tmperr); + } else { +- sprintf(tmperr, _("Stdin was decrypted.\n")); ++ snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n")); + err_warn(tmperr); + } + #ifdef HAVE_STAT +@@ -610,7 +612,7 @@ + + } else { + if (stream_flag == FALSE) { +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("File %s was NOT decrypted successfully.\n"), + dinfile); +@@ -636,10 +638,10 @@ + + if (x == 0) { + if (stream_flag == FALSE) { +- sprintf(tmperr, _("File %s was encrypted.\n"), einfile); ++ snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile); + err_warn(tmperr); + } else { +- sprintf(tmperr, _("Stdin was encrypted.\n")); ++ snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n")); + err_warn(tmperr); + } + #ifdef HAVE_STAT +@@ -655,7 +657,7 @@ + + } else { + if (stream_flag == FALSE) { +- sprintf(tmperr, ++ snprintf(tmperr, WIDTH, + _ + ("File %s was NOT encrypted successfully.\n"), + einfile); +- +git v0.12 diff --git a/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch b/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch new file mode 100644 index 0000000000..e8f841c4fd --- /dev/null +++ b/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch @@ -0,0 +1,218 @@ +This patch includes + + * mingw-w64-headers/include/winnt.h: compile fixes for1 gcc-4.9.3 + * mingw-w64-headers/crt/math.h: Likewise + * mingw-w64-headers/crt/float.h (FLT_EPSILON,DBL_EPSILON,LDBL_EPSILON): Add + symbols. + * mingw-w64-headers/crt/stat.h (S_ISLNK,S_ISSOCK,S_ISUID,S_ISGID,S_ISLINK): + Add symbols. + (lstat): Add function. + * mingw-w64-headers/crt/_mingw_stat64.h: Likewise + * mingw-w64-headers/crt/stdlib.h (realpath): Add function. + +Needed for building with gcc-4.9.3 and using with cross-libtool-2.4.6. + +Upstream status: not yet presented upstream. + +index 9c5cf87..74a8541 100644 +--- a/mingw-w64-crt/misc/dirname.c ++++ b/mingw-w64-crt/misc/dirname.c +@@ -29,6 +29,12 @@ + #define __cdecl /* this may not be defined. */ + #endif + ++char *__cdecl ++realpath(const char *name, char *resolved) ++{ ++ return resolved ? strcpy (resolved, name) : strdup (name); ++} ++ + char * __cdecl + dirname(char *path) + { +diff --git a/mingw-w64-headers/crt/_mingw_stat64.h b/mingw-w64-headers/crt/_mingw_stat64.h +index 17e754c..7d2339b 100644 +--- a/mingw-w64-headers/crt/_mingw_stat64.h ++++ b/mingw-w64-headers/crt/_mingw_stat64.h +@@ -2,13 +2,17 @@ + + #ifdef _USE_32BIT_TIME_T + #define _fstat32 _fstat ++#define _lstat32 _lstat + #define _stat32 _stat + #define _wstat32 _wstat + #define _fstat32i64 _fstati64 ++#define _lstat32i64 _lstati64 + #define _stat32i64 _stati64 + #define _wstat32i64 _wstati64 + #else + #define _fstat _fstat64i32 ++#define _lstat _lstat64i32 ++#define _lstati64 _lstat64 + #define _fstati64 _fstat64 + #define _stat _stat64i32 + #define _stati64 _stat64 +diff --git a/mingw-w64-headers/crt/float.h b/mingw-w64-headers/crt/float.h +index 5874f4e..bdf4ead 100644 +--- a/mingw-w64-headers/crt/float.h ++++ b/mingw-w64-headers/crt/float.h +@@ -22,6 +22,15 @@ + #if (__GNUC__ < 4) + #error Corrupt install of gcc-s internal headers, or search order was changed. + #else ++ ++ /* From gcc-4.9.3 float.h. */ ++ #undef FLT_EPSILON ++ #undef DBL_EPSILON ++ #undef LDBL_EPSILON ++ #define FLT_EPSILON __FLT_EPSILON__ ++ #define DBL_EPSILON __DBL_EPSILON__ ++ #define LDBL_EPSILON __LDBL_EPSILON__ ++ + /* #include_next <float_ginclude.h> */ + + /* Number of decimal digits, q, such that any floating-point number with q +diff --git a/mingw-w64-headers/crt/math.h b/mingw-w64-headers/crt/math.h +index 1e970f4..99a332f 100644 +--- a/mingw-w64-headers/crt/math.h ++++ b/mingw-w64-headers/crt/math.h +@@ -216,6 +216,7 @@ extern "C" { + #endif + } + ++#if 0 + __CRT_INLINE long double __cdecl fabsl (long double x) + { + #ifdef __arm__ +@@ -226,6 +227,7 @@ extern "C" { + return res; + #endif + } ++#endif + + __CRT_INLINE double __cdecl fabs (double x) + { +@@ -905,7 +907,7 @@ __mingw_choose_expr ( \ + /* 7.12.7.3 */ + extern double __cdecl hypot (double, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005; /* in libmoldname.a */ + extern float __cdecl hypotf (float x, float y); +-#ifndef __CRT__NO_INLINE ++#if 0 //ndef __CRT__NO_INLINE + __CRT_INLINE float __cdecl hypotf (float x, float y) { return (float) hypot ((double)x, (double)y);} + #endif + extern long double __cdecl hypotl (long double, long double); +diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h +index dfc5ae4..6f0fee3 100644 +--- a/mingw-w64-headers/crt/stdlib.h ++++ b/mingw-w64-headers/crt/stdlib.h +@@ -8,6 +8,7 @@ + + #include <crtdefs.h> + #include <limits.h> ++#include <string.h> + + #if defined (__USE_MINGW_ANSI_STDIO) && ((__USE_MINGW_ANSI_STDIO + 0) != 0) && !defined (__USE_MINGW_STRTOX) + #define __USE_MINGW_STRTOX 1 +@@ -676,6 +677,8 @@ unsigned long __cdecl _lrotr(unsigned long,int); + + #endif /* !__NO_ISOCEXT */ + ++char *__cdecl realpath (const char *name, char *resolved); ++ + #ifdef __cplusplus + } + #endif +diff --git a/mingw-w64-headers/crt/sys/stat.h b/mingw-w64-headers/crt/sys/stat.h +index ed60219..d88b4f1 100644 +--- a/mingw-w64-headers/crt/sys/stat.h ++++ b/mingw-w64-headers/crt/sys/stat.h +@@ -58,16 +58,21 @@ extern "C" { + #include <_mingw_stat64.h> + + #define _S_IFMT 0xF000 ++#define _S_IFLNK 0xA000 ++#define _S_IFSOCK 0xC000 + #define _S_IFDIR 0x4000 + #define _S_IFCHR 0x2000 + #define _S_IFIFO 0x1000 + #define _S_IFREG 0x8000 ++#define _S_ISUID 0x0400 ++#define _S_ISGID 0x0200 + #define _S_IREAD 0x0100 + #define _S_IWRITE 0x0080 + #define _S_IEXEC 0x0040 + + _CRTIMP int __cdecl _fstat32(int _FileDes,struct _stat32 *_Stat); + _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat); ++ static inline int __cdecl _lstat32(const char *_Name,struct _stat32 *_Stat) {return _stat32(_Name, _Stat);} + _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat); + _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat); + int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat); +@@ -97,6 +102,9 @@ extern "C" { + _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat); + _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat); + int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat); ++ static inline int __cdecl _lstat64(const char *_Name,struct _stat64 *_Stat) {return _stat64(_Name, _Stat);} ++ static inline int __cdecl _lstat32i64(const char *_Name,struct _stat32i64 *_Stat) {return _stat32i64(_Name, _Stat);} ++ static inline int __cdecl _lstat64i32(const char *_Name,struct _stat64i32 *_Stat) {return _stat64i32(_Name, _Stat);} + #ifndef __CRT__NO_INLINE + __CRT_INLINE int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat) + { +@@ -132,6 +140,8 @@ extern "C" { + #ifndef NO_OLDNAMES + #define _S_IFBLK 0x3000 /* Block: Is this ever set under w32? */ + ++#define S_IFLNK _S_IFLNK ++#define S_IFSOCK _S_IFSOCK + #define S_IFMT _S_IFMT + #define S_IFDIR _S_IFDIR + #define S_IFCHR _S_IFCHR +@@ -162,6 +172,11 @@ extern "C" { + #define S_IXOTH (S_IXGRP >> 3) + #define S_IRWXO (S_IRWXG >> 3) + ++#define S_ISUID _S_ISUID ++#define S_ISGID _S_ISGID ++ ++#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) ++#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) + #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) + #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) + #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +@@ -174,6 +189,7 @@ extern "C" { + int __cdecl stat(const char *_Filename,struct stat *_Stat); + int __cdecl fstat(int _Desc,struct stat *_Stat); + int __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat); ++static inline int __cdecl lstat(const char *_Filename,struct stat *_Stat){return stat(_Filename, _Stat);} + + #ifndef __CRT__NO_INLINE + #ifdef _USE_32BIT_TIME_T +@@ -262,9 +278,11 @@ __CRT_INLINE int __cdecl + + #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64) + #ifdef _USE_32BIT_TIME_T ++#define lstat _lstat32i64 + #define stat _stat32i64 + #define fstat _fstat32i64 + #else ++#define lstat _lstat64 + #define stat _stat64 + #define fstat _fstat64 + #endif +diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h +index 52af29b..8626396 100644 +--- a/mingw-w64-headers/include/winnt.h ++++ b/mingw-w64-headers/include/winnt.h +@@ -6895,7 +6895,12 @@ __buildmemorybarrier() + DWORD Reg : 3; + DWORD R : 1; + DWORD L : 1; ++/* C is used as a const specifier */ ++#define save_C C ++#undef C + DWORD C : 1; ++#define C save_C ++#undef save_C + DWORD StackAdjust : 10; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; diff --git a/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch b/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch new file mode 100644 index 0000000000..87be6142f4 --- /dev/null +++ b/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch @@ -0,0 +1,16 @@ +Without this patch, the incorrect exception is caught when 'git' is not in +PATH. See https://github.com/ewels/MultiQC/pull/377. + +diff --git a/multiqc/utils/config.py b/multiqc/utils/config.py +index 01fa554..4a11793 100755 +--- a/multiqc/utils/config.py ++++ b/multiqc/utils/config.py +@@ -28,7 +28,7 @@ try: + git_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'], stderr=subprocess.STDOUT) + git_hash_short = git_hash[:7] + version = '{} ({})'.format(version, git_hash_short) +-except subprocess.CalledProcessError: ++except (subprocess.CalledProcessError, FileNotFoundError): + pass + os.chdir(cwd) + diff --git a/gnu/packages/patches/mupdf-CVE-2016-6265.patch b/gnu/packages/patches/mupdf-CVE-2016-6265.patch deleted file mode 100644 index 58f5c3726c..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-6265.patch +++ /dev/null @@ -1,30 +0,0 @@ -Fix CVE-2016-6265 (use after free in pdf_load_xref()). - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6265 -https://security-tracker.debian.org/tracker/CVE-2016-6265 - -Patch copied from upstream source repository: - -http://git.ghostscript.com/?p=mupdf.git;h=fa1936405b6a84e5c9bb440912c23d532772f958 - -diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c -index 576c315..3222599 100644 ---- a/source/pdf/pdf-xref.c -+++ b/source/pdf/pdf-xref.c -@@ -1184,8 +1184,14 @@ pdf_load_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf) - fz_throw(ctx, FZ_ERROR_GENERIC, "object offset out of range: %d (%d 0 R)", (int)entry->ofs, i); - } - if (entry->type == 'o') -- if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(ctx, doc, entry->ofs)->type != 'n') -- fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to an objstm that does not exist: %d (%d 0 R)", (int)entry->ofs, i); -+ { -+ /* Read this into a local variable here, because pdf_get_xref_entry -+ * may solidify the xref, hence invalidating "entry", meaning we -+ * need a stashed value for the throw. */ -+ fz_off_t ofs = entry->ofs; -+ if (ofs <= 0 || ofs >= xref_len || pdf_get_xref_entry(ctx, doc, ofs)->type != 'n') -+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to an objstm that does not exist: %d (%d 0 R)", (int)ofs, i); -+ } - } - } - diff --git a/gnu/packages/patches/mupdf-CVE-2016-6525.patch b/gnu/packages/patches/mupdf-CVE-2016-6525.patch deleted file mode 100644 index 370af5ade6..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-6525.patch +++ /dev/null @@ -1,21 +0,0 @@ -Fix CVE-2016-6525 (heap overflow in pdf_load_mesh_params()). - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6525 -https://security-tracker.debian.org/tracker/CVE-2016-6525 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mupdf.git;h=39b0f07dd960f34e7e6bf230ffc3d87c41ef0f2e - -diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c -index 7815b3c..6e25efa 100644 ---- a/source/pdf/pdf-shade.c -+++ b/source/pdf/pdf-shade.c -@@ -206,7 +206,7 @@ pdf_load_mesh_params(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_ob - obj = pdf_dict_get(ctx, dict, PDF_NAME_Decode); - if (pdf_array_len(ctx, obj) >= 6) - { -- n = (pdf_array_len(ctx, obj) - 4) / 2; -+ n = fz_mini(FZ_MAX_COLORS, (pdf_array_len(ctx, obj) - 4) / 2); - shade->u.m.x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0)); - shade->u.m.x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1)); - shade->u.m.y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2)); diff --git a/gnu/packages/patches/mupdf-CVE-2016-7504.patch b/gnu/packages/patches/mupdf-CVE-2016-7504.patch deleted file mode 100644 index 4bbb4411c0..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-7504.patch +++ /dev/null @@ -1,99 +0,0 @@ -Fix CVE-2016-7504: -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7504 -http://bugs.ghostscript.com/show_bug.cgi?id=697142 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=5c337af4b3df80cf967e4f9f6a21522de84b392a - -From 5c337af4b3df80cf967e4f9f6a21522de84b392a Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Wed, 21 Sep 2016 16:01:08 +0200 -Subject: [PATCH] Fix bug 697142: Stale string pointer stored in regexp object. - -Make sure to make a copy of the source pattern string. -A case we missed when adding short and memory strings to the runtime. -The code assumed all strings passed to it were either literal or interned. ---- - jsgc.c | 4 +++- - jsi.h | 1 + - jsregexp.c | 2 +- - jsrun.c | 8 ++++++++ - jsvalue.h | 2 +- - 5 files changed, 14 insertions(+), 3 deletions(-) - -diff --git a/jsgc.c b/jsgc.c -index 9bd6482..4f7e7dc 100644 ---- a/thirdparty/mujs/jsgc.c -+++ b/thirdparty/mujs/jsgc.c -@@ -44,8 +44,10 @@ static void jsG_freeobject(js_State *J, js_Object *obj) - { - if (obj->head) - jsG_freeproperty(J, obj->head); -- if (obj->type == JS_CREGEXP) -+ if (obj->type == JS_CREGEXP) { -+ js_free(J, obj->u.r.source); - js_regfree(obj->u.r.prog); -+ } - if (obj->type == JS_CITERATOR) - jsG_freeiterator(J, obj->u.iter.head); - if (obj->type == JS_CUSERDATA && obj->u.user.finalize) -diff --git a/jsi.h b/jsi.h -index 7d9f7c7..e855045 100644 ---- a/thirdparty/mujs/jsi.h -+++ b/thirdparty/mujs/jsi.h -@@ -79,6 +79,7 @@ typedef unsigned short js_Instruction; - - /* String interning */ - -+char *js_strdup(js_State *J, const char *s); - const char *js_intern(js_State *J, const char *s); - void jsS_dumpstrings(js_State *J); - void jsS_freestrings(js_State *J); -diff --git a/jsregexp.c b/jsregexp.c -index 2a056b7..a2d5156 100644 ---- a/thirdparty/mujs/jsregexp.c -+++ b/thirdparty/mujs/jsregexp.c -@@ -21,7 +21,7 @@ void js_newregexp(js_State *J, const char *pattern, int flags) - js_syntaxerror(J, "regular expression: %s", error); - - obj->u.r.prog = prog; -- obj->u.r.source = pattern; -+ obj->u.r.source = js_strdup(J, pattern); - obj->u.r.flags = flags; - obj->u.r.last = 0; - js_pushobject(J, obj); -diff --git a/jsrun.c b/jsrun.c -index 2648c4c..ee80845 100644 ---- a/thirdparty/mujs/jsrun.c -+++ b/thirdparty/mujs/jsrun.c -@@ -45,6 +45,14 @@ void *js_realloc(js_State *J, void *ptr, int size) - return ptr; - } - -+char *js_strdup(js_State *J, const char *s) -+{ -+ int n = strlen(s) + 1; -+ char *p = js_malloc(J, n); -+ memcpy(p, s, n); -+ return p; -+} -+ - void js_free(js_State *J, void *ptr) - { - J->alloc(J->actx, ptr, 0); -diff --git a/jsvalue.h b/jsvalue.h -index 6cfbd89..8fb5016 100644 ---- a/thirdparty/mujs/jsvalue.h -+++ b/thirdparty/mujs/jsvalue.h -@@ -71,7 +71,7 @@ struct js_String - struct js_Regexp - { - void *prog; -- const char *source; -+ char *source; - unsigned short flags; - unsigned short last; - }; --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-7505.patch b/gnu/packages/patches/mupdf-CVE-2016-7505.patch deleted file mode 100644 index 15e4f374d6..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-7505.patch +++ /dev/null @@ -1,32 +0,0 @@ -Fix CVE-2016-7505: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7505 -http://bugs.ghostscript.com/show_bug.cgi?id=697140 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=8c805b4eb19cf2af689c860b77e6111d2ee439d5 - -From 8c805b4eb19cf2af689c860b77e6111d2ee439d5 Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Wed, 21 Sep 2016 15:21:04 +0200 -Subject: [PATCH] Fix bug 697140: Overflow check in ascii division in strtod. - ---- - jsdtoa.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/jsdtoa.c b/jsdtoa.c -index 2e52368..920c1a7 100644 ---- a/thirdparty/mujs/jsdtoa.c -+++ b/thirdparty/mujs/jsdtoa.c -@@ -735,6 +735,7 @@ xx: - n -= c<<b; - *p++ = c + '0'; - (*na)++; -+ if (*na >= Ndig) break; /* abort if overflowing */ - } - *p = 0; - } --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-7506.patch b/gnu/packages/patches/mupdf-CVE-2016-7506.patch deleted file mode 100644 index 733249acaa..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-7506.patch +++ /dev/null @@ -1,42 +0,0 @@ -Fix CVE-2016-7506: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7506 -http://bugs.ghostscript.com/show_bug.cgi?id=697141 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=5000749f5afe3b956fc916e407309de840997f4a - -From 5000749f5afe3b956fc916e407309de840997f4a Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Wed, 21 Sep 2016 16:02:11 +0200 -Subject: [PATCH] Fix bug 697141: buffer overrun in regexp string substitution. - -A '$' escape at the end of the string would read past the zero terminator -when looking for the escaped character. ---- - jsstring.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/jsstring.c b/jsstring.c -index 66f6a89..0209a8e 100644 ---- a/thirdparty/mujs/jsstring.c -+++ b/thirdparty/mujs/jsstring.c -@@ -421,6 +421,7 @@ loop: - while (*r) { - if (*r == '$') { - switch (*(++r)) { -+ case 0: --r; /* end of string; back up and fall through */ - case '$': js_putc(J, &sb, '$'); break; - case '`': js_putm(J, &sb, source, s); break; - case '\'': js_puts(J, &sb, s + n); break; -@@ -516,6 +517,7 @@ static void Sp_replace_string(js_State *J) - while (*r) { - if (*r == '$') { - switch (*(++r)) { -+ case 0: --r; /* end of string; back up and fall through */ - case '$': js_putc(J, &sb, '$'); break; - case '&': js_putm(J, &sb, s, s + n); break; - case '`': js_putm(J, &sb, source, s); break; --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-7563.patch b/gnu/packages/patches/mupdf-CVE-2016-7563.patch deleted file mode 100644 index 288c9ab2df..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-7563.patch +++ /dev/null @@ -1,37 +0,0 @@ -Fix CVE-2016-7563: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7563 -http://bugs.ghostscript.com/show_bug.cgi?id=697136 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=f8234d830e17fc5e8fe09eb76d86dad3f6233c59 - -From f8234d830e17fc5e8fe09eb76d86dad3f6233c59 Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Tue, 20 Sep 2016 17:11:32 +0200 -Subject: [PATCH] Fix bug 697136. - -We were unconditionally reading the next character if we encountered -a '*' in a multi-line comment; possibly reading past the end of -the input. ---- - jslex.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/jslex.c b/jslex.c -index 7b80800..cbd0eeb 100644 ---- a/thirdparty/mujs/jslex.c -+++ b/thirdparty/mujs/jslex.c -@@ -225,7 +225,8 @@ static int lexcomment(js_State *J) - if (jsY_accept(J, '/')) - return 0; - } -- jsY_next(J); -+ else -+ jsY_next(J); - } - return -1; - } --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-7564.patch b/gnu/packages/patches/mupdf-CVE-2016-7564.patch deleted file mode 100644 index c2ce33d1df..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-7564.patch +++ /dev/null @@ -1,34 +0,0 @@ -Fix CVE-2016-7564: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7564 -http://bugs.ghostscript.com/show_bug.cgi?id=697137 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=a3a4fe840b80706c706e86160352af5936f292d8 - -From a3a4fe840b80706c706e86160352af5936f292d8 Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Tue, 20 Sep 2016 17:19:06 +0200 -Subject: [PATCH] Fix bug 697137: off by one in string length calculation. - -We were not allocating space for the terminating zero byte. ---- - jsfunction.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/jsfunction.c b/jsfunction.c -index 8b5b18e..28f7aa7 100644 ---- a/thirdparty/mujs/jsfunction.c -+++ b/thirdparty/mujs/jsfunction.c -@@ -61,7 +61,7 @@ static void Fp_toString(js_State *J) - n += strlen(F->name); - for (i = 0; i < F->numparams; ++i) - n += strlen(F->vartab[i]) + 1; -- s = js_malloc(J, n); -+ s = js_malloc(J, n + 1); - strcpy(s, "function "); - strcat(s, F->name); - strcat(s, "("); --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-8674.patch b/gnu/packages/patches/mupdf-CVE-2016-8674.patch deleted file mode 100644 index 2a35619761..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-8674.patch +++ /dev/null @@ -1,165 +0,0 @@ -Fix CVE-2016-8674 (use-after-free in pdf_to_num()). - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8674 -https://security-tracker.debian.org/tracker/CVE-2016-8674 - -Patch adapted from upstream source repository: -http://git.ghostscript.com/?p=mupdf.git;h=1e03c06456d997435019fb3526fa2d4be7dbc6ec - -diff --git a/include/mupdf/pdf/document.h b/include/mupdf/pdf/document.h -index f8ef0cd..e8345b7 100644 ---- a/include/mupdf/pdf/document.h -+++ b/include/mupdf/pdf/document.h -@@ -258,6 +258,10 @@ struct pdf_document_s - fz_font **type3_fonts; - - pdf_resource_tables *resources; -+ -+ int orphans_max; -+ int orphans_count; -+ pdf_obj **orphans; - }; - - /* -diff --git a/include/mupdf/pdf/object.h b/include/mupdf/pdf/object.h -index 346a2f1..02d4119 100644 ---- a/include/mupdf/pdf/object.h -+++ b/include/mupdf/pdf/object.h -@@ -109,6 +109,7 @@ pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key); - pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev); - void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val); - void pdf_dict_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val); -+void pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val, pdf_obj **old_val); - void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val); - void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val); - void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val); -diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c -index f2e4551..a0d0d8e 100644 ---- a/source/pdf/pdf-object.c -+++ b/source/pdf/pdf-object.c -@@ -1240,9 +1240,13 @@ pdf_dict_geta(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *abbrev) - return pdf_dict_get(ctx, obj, abbrev); - } - --void --pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) -+static void -+pdf_dict_get_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val, pdf_obj **old_val) - { -+ -+ if (old_val) -+ *old_val = NULL; -+ - RESOLVE(obj); - if (obj >= PDF_OBJ__LIMIT) - { -@@ -1282,7 +1286,10 @@ pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) - { - pdf_obj *d = DICT(obj)->items[i].v; - DICT(obj)->items[i].v = pdf_keep_obj(ctx, val); -- pdf_drop_obj(ctx, d); -+ if (old_val) -+ *old_val = d; -+ else -+ pdf_drop_obj(ctx, d); - } - } - else -@@ -1305,10 +1312,27 @@ pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) - } - - void -+pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) -+{ -+ pdf_dict_get_put(ctx, obj, key, val, NULL); -+} -+ -+void - pdf_dict_put_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val) - { - fz_try(ctx) -- pdf_dict_put(ctx, obj, key, val); -+ pdf_dict_get_put(ctx, obj, key, val, NULL); -+ fz_always(ctx) -+ pdf_drop_obj(ctx, val); -+ fz_catch(ctx) -+ fz_rethrow(ctx); -+} -+ -+void -+pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val, pdf_obj **old_val) -+{ -+ fz_try(ctx) -+ pdf_dict_get_put(ctx, obj, key, val, old_val); - fz_always(ctx) - pdf_drop_obj(ctx, val); - fz_catch(ctx) -diff --git a/source/pdf/pdf-repair.c b/source/pdf/pdf-repair.c -index fdd4648..212c8b7 100644 ---- a/source/pdf/pdf-repair.c -+++ b/source/pdf/pdf-repair.c -@@ -259,6 +259,27 @@ pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen) - } - } - -+static void -+orphan_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj) -+{ -+ if (doc->orphans_count == doc->orphans_max) -+ { -+ int new_max = (doc->orphans_max ? doc->orphans_max*2 : 32); -+ -+ fz_try(ctx) -+ { -+ doc->orphans = fz_resize_array(ctx, doc->orphans, new_max, sizeof(*doc->orphans)); -+ doc->orphans_max = new_max; -+ } -+ fz_catch(ctx) -+ { -+ pdf_drop_obj(ctx, obj); -+ fz_rethrow(ctx); -+ } -+ } -+ doc->orphans[doc->orphans_count++] = obj; -+} -+ - void - pdf_repair_xref(fz_context *ctx, pdf_document *doc) - { -@@ -520,12 +541,13 @@ pdf_repair_xref(fz_context *ctx, pdf_document *doc) - /* correct stream length for unencrypted documents */ - if (!encrypt && list[i].stm_len >= 0) - { -+ pdf_obj *old_obj = NULL; - dict = pdf_load_object(ctx, doc, list[i].num, list[i].gen); - - length = pdf_new_int(ctx, doc, list[i].stm_len); -- pdf_dict_put(ctx, dict, PDF_NAME_Length, length); -- pdf_drop_obj(ctx, length); -- -+ pdf_dict_get_put_drop(ctx, dict, PDF_NAME_Length, length, &old_obj); -+ if (old_obj) -+ orphan_object(ctx, doc, old_obj); - pdf_drop_obj(ctx, dict); - } - } -diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c -index 3de1cd2..6682741 100644 ---- a/source/pdf/pdf-xref.c -+++ b/source/pdf/pdf-xref.c -@@ -1626,6 +1626,12 @@ pdf_close_document(fz_context *ctx, pdf_document *doc) - - pdf_drop_resource_tables(ctx, doc); - -+ for (i = 0; i < doc->orphans_count; i++) -+ { -+ pdf_drop_obj(ctx, doc->orphans[i]); -+ } -+ fz_free(ctx, doc->orphans); -+ - fz_free(ctx, doc); - } - --- -2.10.1 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-9017.patch b/gnu/packages/patches/mupdf-CVE-2016-9017.patch deleted file mode 100644 index 1e2b7c3258..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-9017.patch +++ /dev/null @@ -1,46 +0,0 @@ -Fix CVE-2016-9017: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9107 -http://bugs.ghostscript.com/show_bug.cgi?id=697171 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=a5c747f1d40e8d6659a37a8d25f13fb5acf8e767 - -From a5c747f1d40e8d6659a37a8d25f13fb5acf8e767 Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Tue, 25 Oct 2016 14:08:27 +0200 -Subject: [PATCH] Fix 697171: missed an operand in the bytecode debugger dump. - ---- - jscompile.h | 2 +- - jsdump.c | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/jscompile.h b/jscompile.h -index 802cc9e..3054d13 100644 ---- a/thirdparty/mujs/jscompile.h -+++ b/thirdparty/mujs/jscompile.h -@@ -21,7 +21,7 @@ enum js_OpCode - - OP_NEWARRAY, - OP_NEWOBJECT, -- OP_NEWREGEXP, -+ OP_NEWREGEXP, /* -S,opts- <regexp> */ - - OP_UNDEF, - OP_NULL, -diff --git a/jsdump.c b/jsdump.c -index 1c51c29..37ad88c 100644 ---- a/thirdparty/mujs/jsdump.c -+++ b/thirdparty/mujs/jsdump.c -@@ -750,6 +750,7 @@ void jsC_dumpfunction(js_State *J, js_Function *F) - case OP_INITVAR: - case OP_DEFVAR: - case OP_GETVAR: -+ case OP_HASVAR: - case OP_SETVAR: - case OP_DELVAR: - case OP_GETPROP_S: --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-CVE-2016-9136.patch b/gnu/packages/patches/mupdf-CVE-2016-9136.patch deleted file mode 100644 index 1f68839a52..0000000000 --- a/gnu/packages/patches/mupdf-CVE-2016-9136.patch +++ /dev/null @@ -1,32 +0,0 @@ -Fix CVE-2016-9136: - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-9136 -http://bugs.ghostscript.com/show_bug.cgi?id=697244 - -Patch copied from upstream source repository: -http://git.ghostscript.com/?p=mujs.git;a=commitdiff;h=a0ceaf5050faf419401fe1b83acfa950ec8a8a89 -From a0ceaf5050faf419401fe1b83acfa950ec8a8a89 Mon Sep 17 00:00:00 2001 -From: Tor Andersson <tor.andersson@artifex.com> -Date: Mon, 31 Oct 2016 13:05:37 +0100 -Subject: [PATCH] Fix 697244: Check for incomplete escape sequence at end of - input. - ---- - jslex.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/jslex.c b/jslex.c -index cbd0eeb..aaafdac 100644 ---- a/thirdparty/mujs/jslex.c -+++ b/thirdparty/mujs/jslex.c -@@ -377,6 +377,7 @@ static int lexescape(js_State *J) - return 0; - - switch (J->lexchar) { -+ case 0: jsY_error(J, "unterminated escape sequence"); - case 'u': - jsY_next(J); - if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 12; jsY_next(J); } --- -2.10.2 - diff --git a/gnu/packages/patches/mupdf-build-with-openjpeg-2.1.patch b/gnu/packages/patches/mupdf-build-with-openjpeg-2.1.patch index cd8136b701..d97c1cb348 100644 --- a/gnu/packages/patches/mupdf-build-with-openjpeg-2.1.patch +++ b/gnu/packages/patches/mupdf-build-with-openjpeg-2.1.patch @@ -27,12 +27,3 @@ index 6b92e5c..72dea50 100644 #include <openjpeg.h> static void fz_opj_error_callback(const char *msg, void *client_data) -@@ -117,7 +109,7 @@ fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *defcs - opj_stream_set_read_function(stream, fz_opj_stream_read); - opj_stream_set_skip_function(stream, fz_opj_stream_skip); - opj_stream_set_seek_function(stream, fz_opj_stream_seek); -- opj_stream_set_user_data(stream, &sb); -+ opj_stream_set_user_data(stream, &sb, NULL); - /* Set the length to avoid an assert */ - opj_stream_set_user_data_length(stream, size); - diff --git a/gnu/packages/patches/nasm-no-ps-pdf.patch b/gnu/packages/patches/nasm-no-ps-pdf.patch deleted file mode 100644 index b03b57a6ed..0000000000 --- a/gnu/packages/patches/nasm-no-ps-pdf.patch +++ /dev/null @@ -1,20 +0,0 @@ -Avoid building PS and PDF docs, which do not build bit-reproducible. NASM -already installs doc in info and html. - ---- nasm-2.12.01/doc/Makefile.in.orig 2016-06-21 18:02:59.483484829 +0200 -+++ nasm-2.12.01/doc/Makefile.in 2016-06-21 18:03:46.700151410 +0200 -@@ -27,7 +27,7 @@ - PS2PDF = @PS2PDF@ # Part of GhostScript - - SRCS = nasmdoc.src inslist.src changes.src --OUT = info html nasmdoc.txt nasmdoc.ps nasmdoc.pdf -+OUT = info html nasmdoc.txt - - # exports - export srcdir -@@ -100,4 +100,4 @@ - $(INSTALL_DATA) info/* $(INSTALLROOT)$(infodir) - mkdir -p $(INSTALLROOT)$(docdir)/html - $(INSTALL_DATA) html/* $(INSTALLROOT)$(docdir)/html -- $(INSTALL_DATA) nasmdoc.ps nasmdoc.pdf nasmdoc.txt $(INSTALLROOT)$(docdir) -+ $(INSTALL_DATA) nasmdoc.txt $(INSTALLROOT)$(docdir) diff --git a/gnu/packages/patches/netcdf-config-date.patch b/gnu/packages/patches/netcdf-config-date.patch deleted file mode 100644 index 5054612e95..0000000000 --- a/gnu/packages/patches/netcdf-config-date.patch +++ /dev/null @@ -1,47 +0,0 @@ -Honor SOURCE_DATE_EPOCH when exporting configuration date. -Autoconf-level patch submitted upstream on Fri Apr 15 23:07:42 UTC 2016 - ---- a/configure -+++ b/configure -@@ -2866,7 +2866,17 @@ - - - # Configuration Date -- CONFIG_DATE="`date`" -+ CONFIG_DATE="`date -u`" -+if test -n "$SOURCE_DATE_EPOCH"; then -+ CONFIG_DATE=`date -u -d "@$SOURCE_DATE_EPOCH" 2>/dev/null \ -+ || date -u -r "$SOURCE_DATE_EPOCH" 2>/dev/null` -+ if test -z "$CONFIG_DATE"; then -+ as_fn_error $? "malformed SOURCE_DATE_EPOCH" "$LINENO" 5 -+ fi -+fi -+cat >>confdefs.h <<_ACEOF -+#define CONFIG_DATE "$CONFIG_DATE" -+_ACEOF - - # Find out about the host we're building on. - ac_aux_dir= ---- a/libdispatch/derror.c -+++ b/libdispatch/derror.c -@@ -13,7 +13,7 @@ - #endif - - /* Tell the user the version of netCDF. */ --static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $"; -+static const char nc_libvers[] = PACKAGE_VERSION " of "CONFIG_DATE" $"; - - /** - \defgroup lib_version Library Version ---- a/config.h.in -+++ b/config.h.in -@@ -393,6 +393,9 @@ - /* Define to the version of this package. */ - #undef PACKAGE_VERSION - -+/* Define to the configuration date */ -+#undef CONFIG_DATE -+ - /* The size of `double', as computed by sizeof. */ - #undef SIZEOF_DOUBLE - diff --git a/gnu/packages/patches/netcdf-date-time.patch b/gnu/packages/patches/netcdf-date-time.patch new file mode 100644 index 0000000000..a4e7925aa1 --- /dev/null +++ b/gnu/packages/patches/netcdf-date-time.patch @@ -0,0 +1,11 @@ +--- a/libdispatch/derror.c ++++ b/libdispatch/derror.c +@@ -13,7 +13,7 @@ + #endif + + /* Tell the user the version of netCDF. */ +-static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $"; ++static const char nc_libvers[] = PACKAGE_VERSION" $"; + + /** + \defgroup lib_version Library Version diff --git a/gnu/packages/patches/netcdf-tst_h_par.patch b/gnu/packages/patches/netcdf-tst_h_par.patch new file mode 100644 index 0000000000..ac14a4c0a2 --- /dev/null +++ b/gnu/packages/patches/netcdf-tst_h_par.patch @@ -0,0 +1,21 @@ +From a83702834938b23cc2e843589aa223e2024a7e6f Mon Sep 17 00:00:00 2001 +From: Orion Poplawski <orion@cora.nwra.com> +Date: Tue, 29 Nov 2016 11:48:01 -0700 +Subject: [PATCH] Add missing #include "err_macros.h" to tst_h_par.c + +--- + h5_test/tst_h_par.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/h5_test/tst_h_par.c b/h5_test/tst_h_par.c +index c3da7f4..a419d55 100644 +--- a/h5_test/tst_h_par.c ++++ b/h5_test/tst_h_par.c +@@ -11,6 +11,7 @@ + $Id: tst_h_par.c,v 1.15 2010/05/25 13:53:04 ed Exp $ + */ + #include <nc_tests.h> ++#include "err_macros.h" + #include <hdf5.h> + + /* Defining USE_MPE causes the MPE trace library to be used (and you diff --git a/gnu/packages/patches/ocaml-Add-a-.file-directive.patch b/gnu/packages/patches/ocaml-Add-a-.file-directive.patch new file mode 100644 index 0000000000..07842e9c32 --- /dev/null +++ b/gnu/packages/patches/ocaml-Add-a-.file-directive.patch @@ -0,0 +1,96 @@ +From: Stephane Glondu <steph@glondu.net> +Date: Sun, 16 Aug 2015 20:59:14 +0200 +Subject: Add a .file directive to generated .s files + +When no .file directive is given, the toolchain records the filename +of the .o file, which is sometimes random, making generated objects +non-deterministic. + +We use Location.input_name for adding .file directives to assembly +files. Note: when the file is preprocessed, this reference holds the +name of the temporary file. Hence, files compiled with -pp are still +not deterministic. + +Bug-Debian: https://bugs.debian.org/795784 +Bug-Debian: https://bugs.debian.org/796336 +--- + asmcomp/amd64/emit.mlp | 1 + + asmcomp/arm/emit.mlp | 1 + + asmcomp/arm64/emit.mlp | 1 + + asmcomp/i386/emit.mlp | 1 + + asmcomp/power/emit.mlp | 1 + + asmcomp/sparc/emit.mlp | 1 + + 6 files changed, 6 insertions(+) + +diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp +index d56d0f5..4d7aa30 100644 +--- a/asmcomp/amd64/emit.mlp ++++ b/asmcomp/amd64/emit.mlp +@@ -794,6 +794,7 @@ let data l = + let begin_assembly() = + reset_debug_info(); (* PR#5603 *) + float_constants := []; ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + if !Clflags.dlcode then begin + (* from amd64.S; could emit these constants on demand *) + if macosx then +diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp +index 4948fb2..6f30fba 100644 +--- a/asmcomp/arm/emit.mlp ++++ b/asmcomp/arm/emit.mlp +@@ -892,6 +892,7 @@ let data l = + + let begin_assembly() = + reset_debug_info(); ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + ` .syntax unified\n`; + begin match !arch with + | ARMv4 -> ` .arch armv4t\n` +diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp +index 750c2b2..5afbb8a 100644 +--- a/asmcomp/arm64/emit.mlp ++++ b/asmcomp/arm64/emit.mlp +@@ -942,6 +942,7 @@ let data l = + + let begin_assembly() = + reset_debug_info(); ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + let lbl_begin = Compilenv.make_symbol (Some "data_begin") in + ` .data\n`; + ` .globl {emit_symbol lbl_begin}\n`; +diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp +index 98df5f9..531150f 100644 +--- a/asmcomp/i386/emit.mlp ++++ b/asmcomp/i386/emit.mlp +@@ -986,6 +986,7 @@ let data l = + let begin_assembly() = + reset_debug_info(); (* PR#5603 *) + float_constants := []; ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + let lbl_begin = Compilenv.make_symbol (Some "data_begin") in + ` .data\n`; + ` .globl {emit_symbol lbl_begin}\n`; +diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp +index 4344085..343132b 100644 +--- a/asmcomp/power/emit.mlp ++++ b/asmcomp/power/emit.mlp +@@ -887,6 +887,7 @@ let data l = + let begin_assembly() = + defined_functions := StringSet.empty; + external_functions := StringSet.empty; ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + (* Emit the beginning of the segments *) + let lbl_begin = Compilenv.make_symbol (Some "data_begin") in + emit_string data_space; +diff --git a/asmcomp/sparc/emit.mlp b/asmcomp/sparc/emit.mlp +index 877a3d5..7b041e9 100644 +--- a/asmcomp/sparc/emit.mlp ++++ b/asmcomp/sparc/emit.mlp +@@ -727,6 +727,7 @@ let data l = + (* Beginning / end of an assembly file *) + + let begin_assembly() = ++ ` .file \"{emit_string (String.escaped !Location.input_name)}\"\n`; + let lbl_begin = Compilenv.make_symbol (Some "data_begin") in + ` .data\n`; + ` .global {emit_symbol lbl_begin}\n`; diff --git a/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch b/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch new file mode 100644 index 0000000000..2056b42356 --- /dev/null +++ b/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch @@ -0,0 +1,125 @@ +From 26cac62fe0154cf65c06faaee10805531e9dade8 Mon Sep 17 00:00:00 2001 +From: Julien Lepiller <julien@lepiller.eu> +Date: Wed, 14 Dec 2016 14:14:59 +0100 +Subject: [PATCH] fix camlp4 in another directory + +--- + Makefile | 11 ++++++----- + configure | 13 ++++++++++++- + myocamlbuild.ml | 2 +- + 3 files changed, 19 insertions(+), 7 deletions(-) + +diff --git a/Makefile b/Makefile +index 4a8ce17..d94a6d5 100644 +--- a/Makefile ++++ b/Makefile +@@ -25,7 +25,7 @@ PATH_BUILD=$(PATH_BASE)/_build + PATH_OCAMLDOC=$(PATH_BASE)/ocamldoc + PATH_SRC=$(PATH_BASE)/src + PATH_TESTS=$(PATH_BASE)/tests +-PATH_INSTALL=$(PATH_OCAML_PREFIX)/lib/ocaml/bisect ++PATH_INSTALL=$(PREFIX)/lib/ocaml/bisect + + + # DEFINITIONS +@@ -33,7 +33,8 @@ PATH_INSTALL=$(PATH_OCAML_PREFIX)/lib/ocaml/bisect + PROJECT_NAME=bisect + OCAMLBUILD=$(PATH_OCAML_PREFIX)/bin/ocamlbuild + OCAMLBUILD_ENV=WARNINGS=$(WARNINGS) PATH_OCAML_PREFIX=$(PATH_OCAML_PREFIX) +-OCAMLBUILD_FLAGS=-classic-display -no-links ++CAMLP4_INCLUDE=$(shell test -z $(CAMLP4_LIBDIR) || echo "-cflags -I,$(CAMLP4_LIBDIR)") ++OCAMLBUILD_FLAGS=-classic-display -no-links $(CAMLP4_INCLUDE) + MODULES_ODOCL=$(PROJECT_NAME).odocl + MODULES_MLPACK=$(PROJECT_NAME).mlpack + MODULES_MLPACK_PP=$(PROJECT_NAME)_pp.mlpack +@@ -80,11 +81,11 @@ veryclean: clean + rm -f $(PATH_OCAMLDOC)/*.html $(PATH_OCAMLDOC)/*.css + + install: FORCE +- cp $(PATH_BUILD)/src/report/report.byte $(PATH_OCAML_PREFIX)/bin/bisect-report; \ ++ cp $(PATH_BUILD)/src/report/report.byte $(PREFIX)/bin/bisect-report; \ + if [ "$(PPX)" = "TRUE" ]; then \ +- cp $(PATH_BUILD)/src/syntax/bisect_ppx.byte $(PATH_OCAML_PREFIX)/bin; \ ++ cp $(PATH_BUILD)/src/syntax/bisect_ppx.byte $(PREFIX)/bin; \ + fi; \ +- (test -x $(PATH_OCAML_PREFIX)/bin/ocamlopt && cp $(PATH_BUILD)/src/report/report.native $(PATH_OCAML_PREFIX)/bin/bisect-report.opt || true); \ ++ (test -x $(PATH_OCAML_PREFIX)/bin/ocamlopt && cp $(PATH_BUILD)/src/report/report.native $(PREFIX)/bin/bisect-report.opt || true); \ + if [ -x "$(PATH_OCAMLFIND)" ]; then \ + $(PATH_OCAMLFIND) query $(PROJECT_NAME) && $(PATH_OCAMLFIND) remove $(PROJECT_NAME) || true; \ + $(PATH_OCAMLFIND) install $(PROJECT_NAME) META -optional \ +diff --git a/configure b/configure +index bb7ebf4..61a3095 100755 +--- a/configure ++++ b/configure +@@ -21,7 +21,9 @@ + # default values + ocamlbuild=`which ocamlbuild || echo '/usr/local/bin/ocamlbuild'` + bin_path=`dirname $ocamlbuild` ++prefix='' + ocaml_prefix=`dirname $bin_path` ++camlp4_prefix=`dirname $(dirname $(which camlp4of))` + ocamlfind=`which ocamlfind 2> /dev/null || echo ''` + native_dynlink='TRUE' + devel='FALSE' +@@ -32,8 +34,12 @@ ppx='FALSE' + while [ $# -gt 0 ] + do + case "$1" in ++ -prefix) ++ prefix="$2"; shift;; + -ocaml-prefix) + ocaml_prefix="$2"; shift;; ++ -camlp4-prefix) ++ camlp4_prefix="$2"; shift;; + -ocamlfind) + ocamlfind="$2"; shift;; + -no-native-dynlink) +@@ -45,7 +51,7 @@ do + -ppx) + ppx='TRUE';; + *) +- echo "usage: $0 [-ocaml-prefix <path>] [-ocamlfind <path>] [-no-native-dynlink] [-devel]"; ++ echo "usage: $0 [-prefix <path>] [-ocaml-prefix <path>] [-ocamlfind <path>] [-no-native-dynlink] [-devel]"; + exit 1;; + esac + shift +@@ -57,6 +63,9 @@ if [ "$no_camlp4" = "TRUE" -a "$ppx" = "FALSE" ]; then + exit 1 + fi + ++# prefix default value ++test -z $prefix && prefix=$ocaml_prefix ++ + # make options + make_quiet=`make -f - <<EOF + default: gnumake +@@ -67,11 +76,13 @@ EOF` + # file creation + echo "# timestamp: `date`" > Makefile.config + echo "PATH_OCAML_PREFIX=$ocaml_prefix" >> Makefile.config ++echo "PATH_CAMLP4_PREFIX=$camlp4_prefix" >> Makefile.config + echo "PATH_OCAMLFIND=$ocamlfind" >> Makefile.config + echo "NATIVE_DYNLINK=$native_dynlink" >> Makefile.config + echo "WARNINGS=$devel" >> Makefile.config + echo "NO_CAMLP4=$no_camlp4" >> Makefile.config + echo "PPX=$ppx" >> Makefile.config + echo "MAKE_QUIET=$make_quiet" >> Makefile.config ++echo "PREFIX=$prefix" >> Makefile.config + echo "" >> Makefile.config + echo 'Makefile.config successfully created' +diff --git a/myocamlbuild.ml b/myocamlbuild.ml +index 8aa25fd..09a7d48 100644 +--- a/myocamlbuild.ml ++++ b/myocamlbuild.ml +@@ -70,7 +70,7 @@ let () = + | After_rules -> + let camlp4of = + try +- let path_bin = Filename.concat (Sys.getenv "PATH_OCAML_PREFIX") "bin" in ++ let path_bin = Filename.concat (Sys.getenv "PATH_CAMLP4_PREFIX") "bin" in + Filename.concat path_bin "camlp4of" + with _ -> "camlp4of" in + flag ["ocaml"; "compile"; "pp_camlp4of"] (S[A"-pp"; A camlp4of]); +-- +2.7.4 + diff --git a/gnu/packages/patches/ocaml-bitstring-fix-configure.patch b/gnu/packages/patches/ocaml-bitstring-fix-configure.patch new file mode 100644 index 0000000000..c358bf3d6b --- /dev/null +++ b/gnu/packages/patches/ocaml-bitstring-fix-configure.patch @@ -0,0 +1,53 @@ +From 0aaddfceeea3e89df196ab1846da54d09713a512 Mon Sep 17 00:00:00 2001 +From: Julien Lepiller <julien@lepiller.eu> +Date: Thu, 15 Dec 2016 21:17:31 +0100 +Subject: [PATCH] fix configure + +--- + Makefile.in | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/Makefile.in b/Makefile.in +index d040f4c..85e0b38 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -32,6 +32,7 @@ BISECT_REPORT = @BISECT_REPORT@ + BYTESWAP_H = @BYTESWAP_H@ + + OCAMLLIB = @OCAMLLIB@ ++BISECTLIB = $(shell if test -z $${BISECTLIB}; then echo $(OCAMLLIB); else echo $${BISECTLIB}; fi) + top_srcdir = @top_srcdir@ + + pkg_cil = @OCAML_PKG_cil@ +@@ -47,9 +48,9 @@ OCAMLOPTPACKAGES = $(OCAMLCPACKAGES) + OCAMLOPTLIBS = -linkpkg + + ifneq ($(enable_coverage),no) +-OCAMLCFLAGS += -I +bisect -pp 'camlp4o $(OCAMLLIB)/bisect/instrument.cma' ++OCAMLCFLAGS += -I +bisect -pp 'camlp4o $(BISECTLIB)/bisect/instrument.cma' + OCAMLCLIBS += -I +bisect bisect.cma +-OCAMLOPTFLAGS += -I +bisect -pp 'camlp4o $(OCAMLLIB)/bisect/instrument.cma' ++OCAMLOPTFLAGS += -I +bisect -pp 'camlp4o $(BISECTLIB)/bisect/instrument.cma' + OCAMLOPTLIBS += -I +bisect bisect.cmxa + endif + +@@ -110,7 +111,7 @@ bitstring_persistent.cmi: bitstring_persistent.mli + -I +camlp4 -pp camlp4of -c $< + + pa_bitstring.cmo: pa_bitstring.ml bitstring.cma bitstring_persistent.cma +- $(OCAMLFIND) ocamlc bitstring.cma -I +camlp4 dynlink.cma camlp4lib.cma \ ++ $(OCAMLFIND) ocamlc $(OCAMLCFLAGS) bitstring.cma -I +camlp4 dynlink.cma camlp4lib.cma \ + -pp camlp4of -c $< -o $@ + + bitstring-objinfo: bitstring_objinfo.cmo bitstring.cma bitstring_persistent.cma +@@ -133,7 +134,7 @@ byteswap.h: byteswap.in.h + ifeq ($(enable_coverage),no) + PP = -pp 'camlp4o bitstring.cma bitstring_persistent.cma pa_bitstring.cmo' + else +-PP = -pp 'camlp4o $(OCAMLLIB)/bisect/bisect.cma bitstring.cma bitstring_persistent.cma pa_bitstring.cmo' ++PP = -pp 'camlp4o $(BISECTLIB)/bisect/bisect.cma bitstring.cma bitstring_persistent.cma pa_bitstring.cmo' + endif + + check: test +-- +2.11.0 diff --git a/gnu/packages/patches/onionshare-fix-install-paths.patch b/gnu/packages/patches/onionshare-fix-install-paths.patch deleted file mode 100644 index 721b89f04b..0000000000 --- a/gnu/packages/patches/onionshare-fix-install-paths.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 7afdd3366711a0c508bfb9323af8f4268ab77c9b Mon Sep 17 00:00:00 2001 -From: Efraim Flashner <efraim@flashner.co.il> -Date: Thu, 21 Jul 2016 13:22:45 +0300 -Subject: [PATCH] patch - ---- - setup.py | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -diff --git a/setup.py b/setup.py -index 8ae56fe..8b245c9 100644 ---- a/setup.py -+++ b/setup.py -@@ -91,15 +91,15 @@ setup( - include_package_data=True, - scripts=['install/scripts/onionshare', 'install/scripts/onionshare-gui'], - data_files=[ -- (os.path.join(sys.prefix, 'share/applications'), ['install/onionshare.desktop']), -- (os.path.join(sys.prefix, 'share/appdata'), ['install/onionshare.appdata.xml']), -- (os.path.join(sys.prefix, 'share/pixmaps'), ['install/onionshare80.xpm']), -- (os.path.join(sys.prefix, 'share/onionshare'), [ -+ ('share/applications', ['install/onionshare.desktop']), -+ ('share/appdata', ['install/onionshare.appdata.xml']), -+ ('share/pixmaps', ['install/onionshare80.xpm']), -+ ('share/onionshare', [ - 'resources/version.txt', - 'resources/wordlist.txt' - ]), -- (os.path.join(sys.prefix, 'share/onionshare/images'), images), -- (os.path.join(sys.prefix, 'share/onionshare/locale'), locale), -- (os.path.join(sys.prefix, 'share/onionshare/html'), html) -+ ('share/onionshare/images', images), -+ ('share/onionshare/locale', locale), -+ ('share/onionshare/html', html) - ] - ) --- -2.9.1 - diff --git a/gnu/packages/patches/openjpeg-CVE-2015-6581.patch b/gnu/packages/patches/openjpeg-CVE-2015-6581.patch deleted file mode 100644 index 7ce03501f4..0000000000 --- a/gnu/packages/patches/openjpeg-CVE-2015-6581.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0fa5a17c98c4b8f9ee2286f4f0a50cf52a5fccb0 Mon Sep 17 00:00:00 2001 -From: Matthieu Darbois <mayeut@users.noreply.github.com> -Date: Tue, 19 May 2015 21:57:27 +0000 -Subject: [PATCH] [trunk] Correct potential double free on malloc failure in - opj_j2k_copy_default_tcp_and_create_tcp (fixes issue 492) - ---- - src/lib/openjp2/j2k.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/src/lib/openjp2/j2k.c b/src/lib/openjp2/j2k.c -index 8c62a39..cbdd368 100644 ---- a/src/lib/openjp2/j2k.c -+++ b/src/lib/openjp2/j2k.c -@@ -7365,6 +7365,12 @@ static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2 - l_tcp->cod = 0; - l_tcp->ppt = 0; - l_tcp->ppt_data = 00; -+ /* Remove memory not owned by this tile in case of early error return. */ -+ l_tcp->m_mct_decoding_matrix = 00; -+ l_tcp->m_nb_max_mct_records = 0; -+ l_tcp->m_mct_records = 00; -+ l_tcp->m_nb_max_mcc_records = 0; -+ l_tcp->m_mcc_records = 00; - /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/ - l_tcp->tccps = l_current_tccp; - -@@ -7402,6 +7408,8 @@ static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2 - - ++l_src_mct_rec; - ++l_dest_mct_rec; -+ /* Update with each pass to free exactly what has been allocated on early return. */ -+ l_tcp->m_nb_max_mct_records += 1; - } - - /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/ -@@ -7411,6 +7419,7 @@ static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2 - return OPJ_FALSE; - } - memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size); -+ l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records; - - /* Copy the mcc record data from dflt_tile_cp to the current tile*/ - l_src_mcc_rec = l_default_tcp->m_mcc_records; --- -2.5.0 - diff --git a/gnu/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch b/gnu/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch new file mode 100644 index 0000000000..3f637fa88b --- /dev/null +++ b/gnu/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch @@ -0,0 +1,245 @@ +From cadff5fb6e73398de26a92e96d3d7cac893af255 Mon Sep 17 00:00:00 2001 +From: szukw000 <szukw000@arcor.de> +Date: Fri, 9 Dec 2016 08:29:55 +0100 +Subject: [PATCH] These changes repair bugs of #871 and #872 + +email from http://openwall.com/lists/oss-security/2016/12/09/4 +patch is against openjpeg-2.1.2, applies cleanly to 2.1.1. + +--- + src/bin/jp2/converttif.c | 107 +++++++++++++++++++++++++++++++---------------- + 1 file changed, 70 insertions(+), 37 deletions(-) + +diff --git a/src/bin/jp2/converttif.c b/src/bin/jp2/converttif.c +index 143d3be..c690f8b 100644 +--- a/src/bin/jp2/converttif.c ++++ b/src/bin/jp2/converttif.c +@@ -553,20 +553,18 @@ static void tif_32sto16u(const OPJ_INT32* pSrc, OPJ_UINT16* pDst, OPJ_SIZE_T len + + int imagetotif(opj_image_t * image, const char *outfile) + { +- int width, height; +- int bps,adjust, sgnd; +- int tiPhoto; ++ uint32 width, height, bps, tiPhoto; ++ int adjust, sgnd; + TIFF *tif; + tdata_t buf; +- tsize_t strip_size; ++ tmsize_t strip_size, rowStride; + OPJ_UINT32 i, numcomps; +- OPJ_SIZE_T rowStride; + OPJ_INT32* buffer32s = NULL; + OPJ_INT32 const* planes[4]; + convert_32s_PXCX cvtPxToCx = NULL; + convert_32sXXx_C1R cvt32sToTif = NULL; + +- bps = (int)image->comps[0].prec; ++ bps = (uint32)image->comps[0].prec; + planes[0] = image->comps[0].data; + + numcomps = image->numcomps; +@@ -674,13 +672,13 @@ int imagetotif(opj_image_t * image, const char *outfile) + break; + } + sgnd = (int)image->comps[0].sgnd; +- adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; +- width = (int)image->comps[0].w; +- height = (int)image->comps[0].h; ++ adjust = sgnd ? (int)(1 << (image->comps[0].prec - 1)) : 0; ++ width = (uint32)image->comps[0].w; ++ height = (uint32)image->comps[0].h; + + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); +- TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps); ++ TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, (uint32)numcomps); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); +@@ -688,8 +686,8 @@ int imagetotif(opj_image_t * image, const char *outfile) + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); + + strip_size = TIFFStripSize(tif); +- rowStride = ((OPJ_SIZE_T)width * numcomps * (OPJ_SIZE_T)bps + 7U) / 8U; +- if (rowStride != (OPJ_SIZE_T)strip_size) { ++ rowStride = (width * numcomps * bps + 7U) / 8U; ++ if (rowStride != strip_size) { + fprintf(stderr, "Invalid TIFF strip size\n"); + TIFFClose(tif); + return 1; +@@ -699,7 +697,7 @@ int imagetotif(opj_image_t * image, const char *outfile) + TIFFClose(tif); + return 1; + } +- buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)width * numcomps * sizeof(OPJ_INT32)); ++ buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(width * numcomps * sizeof(OPJ_INT32))); + if (buffer32s == NULL) { + _TIFFfree(buf); + TIFFClose(tif); +@@ -1211,20 +1209,19 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + TIFF *tif; + tdata_t buf; + tstrip_t strip; +- tsize_t strip_size; ++ tmsize_t strip_size; + int j, currentPlane, numcomps = 0, w, h; + OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN; + opj_image_cmptparm_t cmptparm[4]; /* RGBA */ + opj_image_t *image = NULL; + int has_alpha = 0; +- unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; +- unsigned int tiWidth, tiHeight; ++ uint32 tiBps, tiPhoto, tiSf, tiSpp, tiPC, tiWidth, tiHeight; + OPJ_BOOL is_cinema = OPJ_IS_CINEMA(parameters->rsiz); + convert_XXx32s_C1R cvtTifTo32s = NULL; + convert_32s_CXPX cvtCxToPx = NULL; + OPJ_INT32* buffer32s = NULL; + OPJ_INT32* planes[4]; +- OPJ_SIZE_T rowStride; ++ tmsize_t rowStride; + + tif = TIFFOpen(filename, "r"); + +@@ -1243,22 +1240,35 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); + TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); + TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); +- w= (int)tiWidth; +- h= (int)tiHeight; +- +- if(tiBps > 16U) { +- fprintf(stderr,"tiftoimage: Bits=%d, Only 1 to 16 bits implemented\n",tiBps); +- fprintf(stderr,"\tAborting\n"); ++ ++ if(tiSpp == 0 || tiSpp > 4) { /* should be 1 ... 4 */ ++ fprintf(stderr,"tiftoimage: Bad value for samples per pixel == %hu.\n" ++ "\tAborting.\n", tiSpp); ++ TIFFClose(tif); ++ return NULL; ++ } ++ if(tiBps > 16U || tiBps == 0) { ++ fprintf(stderr,"tiftoimage: Bad values for Bits == %d.\n" ++ "\tMax. 16 Bits are allowed here.\n\tAborting.\n",tiBps); + TIFFClose(tif); + return NULL; + } + if(tiPhoto != PHOTOMETRIC_MINISBLACK && tiPhoto != PHOTOMETRIC_RGB) { +- fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A) and GRAY(A) has been implemented\n",(int) tiPhoto); ++ fprintf(stderr,"tiftoimage: Bad color format %d.\n" ++ "\tOnly RGB(A) and GRAY(A) has been implemented\n",(int) tiPhoto); + fprintf(stderr,"\tAborting\n"); + TIFFClose(tif); + return NULL; + } +- ++ if(tiWidth == 0 || tiHeight == 0) { ++ fprintf(stderr,"tiftoimage: Bad values for width(%u) " ++ "and/or height(%u)\n\tAborting.\n",tiWidth,tiHeight); ++ TIFFClose(tif); ++ return NULL; ++ } ++ w= (int)tiWidth; ++ h= (int)tiHeight; ++ + switch (tiBps) { + case 1: + case 2: +@@ -1312,7 +1322,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + + TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, + &extrasamples, &sampleinfo); +- ++ + if(extrasamples >= 1) + { + switch(sampleinfo[0]) +@@ -1333,7 +1343,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + else /* extrasamples == 0 */ + if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; + } +- ++ + /* initialize image components */ + memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); + +@@ -1346,7 +1356,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + } else { + is_cinema = 0U; + } +- ++ + if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */ + { + numcomps = 3 + has_alpha; +@@ -1384,10 +1394,24 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + image->x0 = (OPJ_UINT32)parameters->image_offset_x0; + image->y0 = (OPJ_UINT32)parameters->image_offset_y0; + image->x1 = !image->x0 ? (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1 : +- image->x0 + (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1; ++ image->x0 + (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1; ++ if(image->x1 <= image->x0) { ++ fprintf(stderr,"tiftoimage: Bad value for image->x1(%d) vs. " ++ "image->x0(%d)\n\tAborting.\n",image->x1,image->x0); ++ TIFFClose(tif); ++ opj_image_destroy(image); ++ return NULL; ++ } + image->y1 = !image->y0 ? (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1 : +- image->y0 + (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1; +- ++ image->y0 + (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1; ++ if(image->y1 <= image->y0) { ++ fprintf(stderr,"tiftoimage: Bad value for image->y1(%d) vs. " ++ "image->y0(%d)\n\tAborting.\n",image->y1,image->y0); ++ TIFFClose(tif); ++ opj_image_destroy(image); ++ return NULL; ++ } ++ + for(j = 0; j < numcomps; j++) + { + planes[j] = image->comps[j].data; +@@ -1395,15 +1419,15 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + image->comps[numcomps - 1].alpha = (OPJ_UINT16)(1 - (numcomps & 1)); + + strip_size = TIFFStripSize(tif); +- ++ + buf = _TIFFmalloc(strip_size); + if (buf == NULL) { + TIFFClose(tif); + opj_image_destroy(image); + return NULL; + } +- rowStride = ((OPJ_SIZE_T)w * tiSpp * tiBps + 7U) / 8U; +- buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)w * tiSpp * sizeof(OPJ_INT32)); ++ rowStride = (w * tiSpp * tiBps + 7U) / 8U; ++ buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(w * tiSpp * sizeof(OPJ_INT32))); + if (buffer32s == NULL) { + _TIFFfree(buf); + TIFFClose(tif); +@@ -1421,11 +1445,20 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) + for(; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) + { + const OPJ_UINT8 *dat8; +- OPJ_SIZE_T ssize; ++ tmsize_t ssize; + +- ssize = (OPJ_SIZE_T)TIFFReadEncodedStrip(tif, strip, buf, strip_size); ++ ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); ++ if(ssize < 1 || ssize > strip_size) { ++ fprintf(stderr,"tiftoimage: Bad value for ssize(%ld) " ++ "vs. strip_size(%ld).\n\tAborting.\n",ssize,strip_size); ++ _TIFFfree(buf); ++ _TIFFfree(buffer32s); ++ TIFFClose(tif); ++ opj_image_destroy(image); ++ return NULL; ++ } + dat8 = (const OPJ_UINT8*)buf; +- ++ + while (ssize >= rowStride) { + cvtTifTo32s(dat8, buffer32s, (OPJ_SIZE_T)w * tiSpp); + cvtCxToPx(buffer32s, planes, (OPJ_SIZE_T)w); diff --git a/gnu/packages/patches/openssh-memory-exhaustion.patch b/gnu/packages/patches/openssh-memory-exhaustion.patch deleted file mode 100644 index 91fe294ca4..0000000000 --- a/gnu/packages/patches/openssh-memory-exhaustion.patch +++ /dev/null @@ -1,39 +0,0 @@ -Fix a memory exhaustion bug in the key exchange, whereby an unauthenticated user -could potentially consume 38400 MB of memory on the server: - -http://seclists.org/oss-sec/2016/q4/185 - -Patch adapted from upstream source repository: - -https://github.com/openssh/openssh-portable/commit/ec165c392ca54317dbe3064a8c200de6531e89ad - -From ec165c392ca54317dbe3064a8c200de6531e89ad Mon Sep 17 00:00:00 2001 -From: "markus@openbsd.org" <markus@openbsd.org> -Date: Mon, 10 Oct 2016 19:28:48 +0000 -Subject: [PATCH] upstream commit - -Unregister the KEXINIT handler after message has been -received. Otherwise an unauthenticated peer can repeat the KEXINIT and cause -allocation of up to 128MB -- until the connection is closed. Reported by -shilei-c at 360.cn - -Upstream-ID: 43649ae12a27ef94290db16d1a98294588b75c05 ---- - kex.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/kex.c b/kex.c -index 3f97f8c..6a94bc5 100644 ---- a/kex.c -+++ b/kex.c -@@ -481,6 +481,7 @@ kex_input_kexinit(int type, u_int32_t seq, void *ctxt) - if (kex == NULL) - return SSH_ERR_INVALID_ARGUMENT; - -+ ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, NULL); - ptr = sshpkt_ptr(ssh, &dlen); - if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0) - return r; --- -2.10.1 - diff --git a/gnu/packages/patches/python-2.7-site-prefixes.patch b/gnu/packages/patches/python-2.7-site-prefixes.patch new file mode 100644 index 0000000000..9e3066508f --- /dev/null +++ b/gnu/packages/patches/python-2.7-site-prefixes.patch @@ -0,0 +1,26 @@ +Add all /gnu/store/ prefixes found in PYTHONPATH to the prefixes where +site-packages (and .pth files) are searched. + +*** Python-2.7.11/Lib/site.py.orig 2016-10-17 23:27:23.746149690 +0200 +--- Python-2.7.11/Lib/site.py 2016-10-17 23:44:51.930871644 +0200 +*************** +*** 65,70 **** +--- 65,82 ---- + + # Prefixes for site-packages; add additional prefixes like /usr/local here + PREFIXES = [sys.prefix, sys.exec_prefix] ++ # Guix: Add all /gnu/store-paths in PYTHONPATH--these are all ++ # "prefixes". This is required to search .pth files in all python ++ # packages contained in /gnu/store which is required to make ++ # .pth-defined namespace packages work. ++ # This is necessary if the packages are not merged into a single ++ # `site-packages` directory (like when using `guix environment`) but ++ # listed in PYTHONPATH (like when running `guix build`). ++ for p in sys.path: ++ if p.startswith('/gnu/store/'): ++ PREFIXES.append(p[:p.find('/', 44)]) # find first pathsep after hash ++ del p ++ + # Enable per user site-packages directory + # set it to False to disable the feature or True to force the feature + ENABLE_USER_SITE = None diff --git a/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch b/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch deleted file mode 100644 index 288a58b06f..0000000000 --- a/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/dendropy/test/test_phylogenetic_distance_matrix.py b/dendropy/test/test_phylogenetic_distance_matrix.py -index 10c05f5..a18ba52 100644 ---- a/dendropy/test/test_phylogenetic_distance_matrix.py -+++ b/dendropy/test/test_phylogenetic_distance_matrix.py -@@ -793,7 +793,7 @@ class PdmUpgmaTree(PdmTreeChecker, unittest.TestCase): - expected_tree=expected_tree) - - class NodeToNodeDistancesTest(unittest.TestCase): -- -+ @unittest.expectedFailure - def test_distances(self): - ## get distances from ape - # library(ape) -@@ -825,6 +825,7 @@ class NodeToNodeDistancesTest(unittest.TestCase): - e = reference_table[nd1.label, nd2.label] - self.assertAlmostEqual(d, e) - -+ @unittest.expectedFailure - def test_mrca(self): - test_runs = [ - "hiv1.newick", diff --git a/gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch b/gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch new file mode 100644 index 0000000000..3570b94e9b --- /dev/null +++ b/gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch @@ -0,0 +1,97 @@ +Fix CVE-2013-7459: + +https://github.com/dlitz/pycrypto/issues/176 +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-7459 + +Copied from Debian: + +https://anonscm.debian.org/cgit/collab-maint/python-crypto.git/commit/?id=0de2243837ed369a086f15c50cca2be85bdfab9d + +Debian adapts this upstream commit: + +https://github.com/dlitz/pycrypto/commit/8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 + +From 8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 Mon Sep 17 00:00:00 2001 +From: Legrandin <helderijs@gmail.com> +Date: Sun, 22 Dec 2013 22:24:46 +0100 +Subject: [PATCH] Throw exception when IV is used with ECB or CTR + +The IV parameter is currently ignored when initializing +a cipher in ECB or CTR mode. + +For CTR mode, it is confusing: it takes some time to see +that a different parameter is needed (the counter). + +For ECB mode, it is outright dangerous. + +This patch forces an exception to be raised. +--- + lib/Crypto/SelfTest/Cipher/common.py | 31 +++++++++++++++++++++++-------- + src/block_template.c | 11 +++++++++++ + 2 files changed, 34 insertions(+), 8 deletions(-) + +--- a/lib/Crypto/SelfTest/Cipher/common.py ++++ b/lib/Crypto/SelfTest/Cipher/common.py +@@ -239,19 +239,34 @@ class RoundtripTest(unittest.TestCase): + return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,) + + def runTest(self): +- for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP): ++ ++ ## ECB mode ++ mode = self.module.MODE_ECB ++ encryption_cipher = self.module.new(a2b_hex(self.key), mode) ++ ciphertext = encryption_cipher.encrypt(self.plaintext) ++ decryption_cipher = self.module.new(a2b_hex(self.key), mode) ++ decrypted_plaintext = decryption_cipher.decrypt(ciphertext) ++ self.assertEqual(self.plaintext, decrypted_plaintext) ++ ++ ## OPENPGP mode ++ mode = self.module.MODE_OPENPGP ++ encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) ++ eiv_ciphertext = encryption_cipher.encrypt(self.plaintext) ++ eiv = eiv_ciphertext[:self.module.block_size+2] ++ ciphertext = eiv_ciphertext[self.module.block_size+2:] ++ decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) ++ decrypted_plaintext = decryption_cipher.decrypt(ciphertext) ++ self.assertEqual(self.plaintext, decrypted_plaintext) ++ ++ ## All other non-AEAD modes (but CTR) ++ for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB): + encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) + ciphertext = encryption_cipher.encrypt(self.plaintext) +- +- if mode != self.module.MODE_OPENPGP: +- decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) +- else: +- eiv = ciphertext[:self.module.block_size+2] +- ciphertext = ciphertext[self.module.block_size+2:] +- decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) ++ decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) + decrypted_plaintext = decryption_cipher.decrypt(ciphertext) + self.assertEqual(self.plaintext, decrypted_plaintext) + ++ + class PGPTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) +--- a/src/block_template.c ++++ b/src/block_template.c +@@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, P + "Key cannot be the null string"); + return NULL; + } ++ if (IVlen != 0 && mode == MODE_ECB) ++ { ++ PyErr_Format(PyExc_ValueError, "ECB mode does not use IV"); ++ return NULL; ++ } ++ if (IVlen != 0 && mode == MODE_CTR) ++ { ++ PyErr_Format(PyExc_ValueError, ++ "CTR mode needs counter parameter, not IV"); ++ return NULL; ++ } + if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR) + { + PyErr_Format(PyExc_ValueError, diff --git a/gnu/packages/patches/python-rarfile-fix-tests.patch b/gnu/packages/patches/python-rarfile-fix-tests.patch deleted file mode 100644 index 8ae8894009..0000000000 --- a/gnu/packages/patches/python-rarfile-fix-tests.patch +++ /dev/null @@ -1,14 +0,0 @@ -There is no test.sh, but there are test1.sh and test2.sh. - -diff --git a/test/Makefile b/test/Makefile -index 027bc5f..5383db3 100644 ---- a/test/Makefile -+++ b/test/Makefile -@@ -1,5 +1,6 @@ - test: -- ./test.sh -+ ./test1.sh -+ ./test2.sh - - clean: - rm -rf __pycache__ diff --git a/gnu/packages/patches/qemu-CVE-2016-8576.patch b/gnu/packages/patches/qemu-CVE-2016-8576.patch deleted file mode 100644 index 5031b59d81..0000000000 --- a/gnu/packages/patches/qemu-CVE-2016-8576.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 20009bdaf95d10bf748fa69b104672d3cfaceddf Mon Sep 17 00:00:00 2001 -From: Gerd Hoffmann <kraxel@redhat.com> -Date: Fri, 7 Oct 2016 10:15:29 +0200 -Subject: [PATCH] xhci: limit the number of link trbs we are willing to process - -Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> ---- - hw/usb/hcd-xhci.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c -index 726435c..ee4fa48 100644 ---- a/hw/usb/hcd-xhci.c -+++ b/hw/usb/hcd-xhci.c -@@ -54,6 +54,8 @@ - * to the specs when it gets them */ - #define ER_FULL_HACK - -+#define TRB_LINK_LIMIT 4 -+ - #define LEN_CAP 0x40 - #define LEN_OPER (0x400 + 0x10 * MAXPORTS) - #define LEN_RUNTIME ((MAXINTRS + 1) * 0x20) -@@ -1000,6 +1002,7 @@ static TRBType xhci_ring_fetch(XHCIState *xhci, XHCIRing *ring, XHCITRB *trb, - dma_addr_t *addr) - { - PCIDevice *pci_dev = PCI_DEVICE(xhci); -+ uint32_t link_cnt = 0; - - while (1) { - TRBType type; -@@ -1026,6 +1029,9 @@ static TRBType xhci_ring_fetch(XHCIState *xhci, XHCIRing *ring, XHCITRB *trb, - ring->dequeue += TRB_SIZE; - return type; - } else { -+ if (++link_cnt > TRB_LINK_LIMIT) { -+ return 0; -+ } - ring->dequeue = xhci_mask64(trb->parameter); - if (trb->control & TRB_LK_TC) { - ring->ccs = !ring->ccs; -@@ -1043,6 +1049,7 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring) - bool ccs = ring->ccs; - /* hack to bundle together the two/three TDs that make a setup transfer */ - bool control_td_set = 0; -+ uint32_t link_cnt = 0; - - while (1) { - TRBType type; -@@ -1058,6 +1065,9 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring) - type = TRB_TYPE(trb); - - if (type == TR_LINK) { -+ if (++link_cnt > TRB_LINK_LIMIT) { -+ return -length; -+ } - dequeue = xhci_mask64(trb.parameter); - if (trb.control & TRB_LK_TC) { - ccs = !ccs; --- -1.8.3.1 - diff --git a/gnu/packages/patches/qemu-CVE-2016-8577.patch b/gnu/packages/patches/qemu-CVE-2016-8577.patch deleted file mode 100644 index c4132d2fb1..0000000000 --- a/gnu/packages/patches/qemu-CVE-2016-8577.patch +++ /dev/null @@ -1,36 +0,0 @@ -Subject: [Qemu-devel] [PATCH] 9pfs: fix potential host memory leak in v9fs_read -From: Li Qiang <liq3ea@gmail.com> - -In 9pfs read dispatch function, it doesn't free two QEMUIOVector -object thus causing potential memory leak. This patch avoid this. - -Signed-off-by: Li Qiang <liq3ea@gmail.com> ---- - hw/9pfs/9p.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c -index 119ee58..543a791 100644 ---- a/hw/9pfs/9p.c -+++ b/hw/9pfs/9p.c -@@ -1826,14 +1826,15 @@ static void v9fs_read(void *opaque) - if (len < 0) { - /* IO error return the error */ - err = len; -- goto out; -+ goto out_free_iovec; - } - } while (count < max_count && len > 0); - err = pdu_marshal(pdu, offset, "d", count); - if (err < 0) { -- goto out; -+ goto out_free_iovec; - } - err += offset + count; -+out_free_iovec: - qemu_iovec_destroy(&qiov); - qemu_iovec_destroy(&qiov_full); - } else if (fidp->fid_type == P9_FID_XATTR) { --- -1.8.3.1 - diff --git a/gnu/packages/patches/qemu-CVE-2016-8578.patch b/gnu/packages/patches/qemu-CVE-2016-8578.patch deleted file mode 100644 index 92ba365727..0000000000 --- a/gnu/packages/patches/qemu-CVE-2016-8578.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Li Qiang <liq3ea@gmail.com> - -In 9pfs function v9fs_iov_vunmarshal, it will not allocate space -for empty string. This will cause several NULL pointer dereference -issues. this patch fix this issue. - -Signed-off-by: Li Qiang <liq3ea@gmail.com> ---- - fsdev/9p-iov-marshal.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/fsdev/9p-iov-marshal.c b/fsdev/9p-iov-marshal.c -index 663cad5..1d16f8d 100644 ---- a/fsdev/9p-iov-marshal.c -+++ b/fsdev/9p-iov-marshal.c -@@ -125,7 +125,7 @@ ssize_t v9fs_iov_vunmarshal(struct iovec *out_sg, int out_num, size_t offset, - str->data = g_malloc(str->size + 1); - copied = v9fs_unpack(str->data, out_sg, out_num, offset, - str->size); -- if (copied > 0) { -+ if (copied >= 0) { - str->data[str->size] = 0; - } else { - v9fs_string_free(str); --- -1.8.3.1 - diff --git a/gnu/packages/patches/readline-7.0-mingw.patch b/gnu/packages/patches/readline-7.0-mingw.patch new file mode 100644 index 0000000000..1dc491d556 --- /dev/null +++ b/gnu/packages/patches/readline-7.0-mingw.patch @@ -0,0 +1,28 @@ +Configure checks for chown; add missing shields in code. + +Upstream status: not yet presented upstream. + +--- readline-7.0/histfile.c.orig 2016-12-06 20:04:10.058901731 +0100 ++++ readline-7.0/histfile.c 2016-12-06 20:05:09.220083801 +0100 +@@ -610,8 +610,10 @@ + user is running this, it's a no-op. If the shell is running after sudo + with a shared history file, we don't want to leave the history file + owned by root. */ ++#if HAVE_CHOWN + if (rv == 0 && exists) + r = chown (filename, finfo.st_uid, finfo.st_gid); ++#endif + + xfree (filename); + FREE (tempname); +@@ -757,8 +759,10 @@ + user is running this, it's a no-op. If the shell is running after sudo + with a shared history file, we don't want to leave the history file + owned by root. */ ++#if HAVE_CHOWN + if (rv == 0 && exists) + mode = chown (histname, finfo.st_uid, finfo.st_gid); ++#endif + + FREE (histname); + FREE (tempname); diff --git a/gnu/packages/patches/ruby-symlinkfix.patch b/gnu/packages/patches/ruby-symlinkfix.patch deleted file mode 100644 index 16beecc97a..0000000000 --- a/gnu/packages/patches/ruby-symlinkfix.patch +++ /dev/null @@ -1,53 +0,0 @@ -Fix symlinks to '..' to fix rubygems improperly expanding symlinked -paths. Without this fix, some gems fail to install. This patch is applied in -rubygems 2.5.2, but ruby version 2.3.1 bundles an older version of rubygems -(2.5.1). - ---- a/lib/rubygems/package.rb -+++ b/lib/rubygems/package.rb -@@ -383,7 +383,7 @@ def extract_tar_gz io, destination_dir, pattern = "*" # :nodoc: - FileUtils.chmod entry.header.mode, destination - end if entry.file? - -- File.symlink(install_location(entry.header.linkname, destination_dir), destination) if entry.symlink? -+ File.symlink(entry.header.linkname, destination) if entry.symlink? - - verbose destination - end -diff --git a/test/rubygems/test_gem_package.rb b/test/rubygems/test_gem_package.rb -index 7848bc2..f287bd3 100644 ---- a/test/rubygems/test_gem_package.rb -+++ b/test/rubygems/test_gem_package.rb -@@ -428,19 +428,25 @@ def test_extract_tar_gz_absolute - "#{@destination} is not allowed", e.message) - end - -- def test_extract_tar_gz_symlink_absolute -+ def test_extract_tar_gz_symlink_relative_path -+ skip 'symlink not supported' if Gem.win_platform? -+ - package = Gem::Package.new @gem - - tgz_io = util_tar_gz do |tar| -- tar.add_symlink 'code.rb', '/absolute.rb', 0644 -+ tar.add_file 'relative.rb', 0644 do |io| io.write 'hi' end -+ tar.mkdir 'lib', 0755 -+ tar.add_symlink 'lib/foo.rb', '../relative.rb', 0644 - end - -- e = assert_raises Gem::Package::PathError do -- package.extract_tar_gz tgz_io, @destination -- end -+ package.extract_tar_gz tgz_io, @destination - -- assert_equal("installing into parent path /absolute.rb of " + -- "#{@destination} is not allowed", e.message) -+ extracted = File.join @destination, 'lib/foo.rb' -+ assert_path_exists extracted -+ assert_equal '../relative.rb', -+ File.readlink(extracted) -+ assert_equal 'hi', -+ File.read(extracted) - end - - def test_extract_tar_gz_directory diff --git a/gnu/packages/patches/seq24-rename-mutex.patch b/gnu/packages/patches/seq24-rename-mutex.patch new file mode 100644 index 0000000000..ddc5910119 --- /dev/null +++ b/gnu/packages/patches/seq24-rename-mutex.patch @@ -0,0 +1,124 @@ +The custom mutex definition in Seq24 clashes with the mutex defined in gtkmm. +This patch renames the custom definition. + +See https://bugs.launchpad.net/seq24/+bug/1647614 for upstream bug report. + +diff --git a/src/midibus.h b/src/midibus.h +index 2cdf8e8..1bb02bd 100644 +--- a/src/midibus.h ++++ b/src/midibus.h +@@ -90,7 +90,7 @@ class midibus + + + /* locking */ +- mutex m_mutex; ++ seq24mutex m_mutex; + + /* mutex */ + void lock(); +@@ -208,7 +208,7 @@ class mastermidibus + sequence *m_seq; + + /* locking */ +- mutex m_mutex; ++ seq24mutex m_mutex; + + /* mutex */ + void lock(); +diff --git a/src/midibus_portmidi.h b/src/midibus_portmidi.h +index 0119e9c..8c6a27a 100644 +--- a/src/midibus_portmidi.h ++++ b/src/midibus_portmidi.h +@@ -65,7 +65,7 @@ class midibus + long m_lasttick; + + /* locking */ +- mutex m_mutex; ++ seq24mutex m_mutex; + + /* mutex */ + void lock(); +@@ -164,7 +164,7 @@ class mastermidibus + sequence *m_seq; + + /* locking */ +- mutex m_mutex; ++ seq24mutex m_mutex; + + /* mutex */ + void lock(); +diff --git a/src/mutex.cpp b/src/mutex.cpp +index b3f23fd..914114f 100644 +--- a/src/mutex.cpp ++++ b/src/mutex.cpp +@@ -20,23 +20,23 @@ + + #include "mutex.h" + +-const pthread_mutex_t mutex::recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; ++const pthread_mutex_t seq24mutex::recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; + const pthread_cond_t condition_var::cond = PTHREAD_COND_INITIALIZER; + +-mutex::mutex( ) ++seq24mutex::seq24mutex( ) + { + m_mutex_lock = recmutex; + } + + void +-mutex::lock( ) ++seq24mutex::lock( ) + { + pthread_mutex_lock( &m_mutex_lock ); + } + + + void +-mutex::unlock( ) ++seq24mutex::unlock( ) + { + pthread_mutex_unlock( &m_mutex_lock ); + } +diff --git a/src/mutex.h b/src/mutex.h +index 399f8a3..4f1b867 100644 +--- a/src/mutex.h ++++ b/src/mutex.h +@@ -24,7 +24,7 @@ + + #include <pthread.h> + +-class mutex { ++class seq24mutex { + + private: + +@@ -37,14 +37,14 @@ protected: + + public: + +- mutex(); ++ seq24mutex(); + + void lock(); + void unlock(); + + }; + +-class condition_var : public mutex { ++class condition_var : public seq24mutex { + + private: + +diff --git a/src/sequence.h b/src/sequence.h +index 2943946..9da8700 100644 +--- a/src/sequence.h ++++ b/src/sequence.h +@@ -153,7 +153,7 @@ class sequence + long m_rec_vol; + + /* locking */ +- mutex m_mutex; ++ seq24mutex m_mutex; + + /* used to idenfity which events are ours in the out queue */ + //unsigned char m_tag; diff --git a/gnu/packages/patches/slock-CVE-2016-6866.patch b/gnu/packages/patches/slock-CVE-2016-6866.patch deleted file mode 100644 index 2f94b8c1a9..0000000000 --- a/gnu/packages/patches/slock-CVE-2016-6866.patch +++ /dev/null @@ -1,51 +0,0 @@ -Fix CVE-2016-6866. - -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6866 -https://security-tracker.debian.org/tracker/CVE-2016-6866 - -Copied from upstream source repository: -http://git.suckless.org/slock/commit/?id=d8bec0f6fdc8a246d78cb488a0068954b46fcb29 - -From d8bec0f6fdc8a246d78cb488a0068954b46fcb29 Mon Sep 17 00:00:00 2001 -From: Markus Teich <markus.teich@stusta.mhn.de> -Date: Tue, 30 Aug 2016 22:59:06 +0000 -Subject: fix CVE-2016-6866 - ---- -diff --git a/slock.c b/slock.c -index 847b328..8ed59ca 100644 ---- a/slock.c -+++ b/slock.c -@@ -123,7 +123,7 @@ readpw(Display *dpy) - readpw(Display *dpy, const char *pws) - #endif - { -- char buf[32], passwd[256]; -+ char buf[32], passwd[256], *encrypted; - int num, screen; - unsigned int len, color; - KeySym ksym; -@@ -159,7 +159,11 @@ readpw(Display *dpy, const char *pws) - #ifdef HAVE_BSD_AUTH - running = !auth_userokay(getlogin(), NULL, "auth-slock", passwd); - #else -- running = !!strcmp(crypt(passwd, pws), pws); -+ errno = 0; -+ if (!(encrypted = crypt(passwd, pws))) -+ fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ else -+ running = !!strcmp(encrypted, pws); - #endif - if (running) { - XBell(dpy, 100); -@@ -312,6 +316,8 @@ main(int argc, char **argv) { - - #ifndef HAVE_BSD_AUTH - pws = getpw(); -+ if (strlen(pws) < 2) -+ die("slock: failed to get user password hash.\n"); - #endif - - if (!(dpy = XOpenDisplay(NULL))) --- -cgit v0.9.0.3-65-g4555 diff --git a/gnu/packages/patches/tcsh-fix-out-of-bounds-read.patch b/gnu/packages/patches/tcsh-fix-out-of-bounds-read.patch new file mode 100644 index 0000000000..48c294f78e --- /dev/null +++ b/gnu/packages/patches/tcsh-fix-out-of-bounds-read.patch @@ -0,0 +1,31 @@ +Fix out-of-bounds read in c_substitute(): + +http://seclists.org/oss-sec/2016/q4/612 + +Patch copied from upstream source repository: + +https://github.com/tcsh-org/tcsh/commit/6a542dc4fb2ba26518a47e9b3a9bcd6a91b94596 + +From 6a542dc4fb2ba26518a47e9b3a9bcd6a91b94596 Mon Sep 17 00:00:00 2001 +From: christos <christos> +Date: Fri, 2 Dec 2016 16:59:28 +0000 +Subject: [PATCH] Fix out of bounds read (Brooks Davis) (reproduce by starting + tcsh and hitting tab at the prompt) + +--- + ed.chared.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ed.chared.c b/ed.chared.c +index 1277e53..310393e 100644 +--- ed.chared.c ++++ ed.chared.c +@@ -750,7 +750,7 @@ c_substitute(void) + /* + * If we found a history character, go expand it. + */ +- if (HIST != '\0' && *p == HIST) ++ if (p >= InputBuf && HIST != '\0' && *p == HIST) + nr_exp = c_excl(p); + else + nr_exp = 0; diff --git a/gnu/packages/patches/unrtf-CVE-2016-10091.patch b/gnu/packages/patches/unrtf-CVE-2016-10091.patch new file mode 100644 index 0000000000..badd1b8ed6 --- /dev/null +++ b/gnu/packages/patches/unrtf-CVE-2016-10091.patch @@ -0,0 +1,189 @@ +Fix CVE-2016-10091 (stack-based buffer overflows in cmd_* functions): + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10091 +https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=849705 +http://seclists.org/oss-sec/2016/q4/787 + +Patch adapted from Debian: + +https://anonscm.debian.org/cgit/collab-maint/unrtf.git/commit/?h=jessie&id=7500a48fb0fbad3ab963fb17560b2f90a8a485c8 + +The Debian patch adapts this upstream commit so that it can be applied +to the 0.21.9 release tarball: + +http://hg.savannah.gnu.org/hgweb/unrtf/rev/3b16893a6406 + +From 7dd568ed8a6a5acb6c04f2b40f457d63a00435f3 Mon Sep 17 00:00:00 2001 +From: Willi Mann <willi@debian.org> +Date: Sat, 31 Dec 2016 20:31:38 +0100 +Subject: [PATCH] Add patch from upstream to fix CVE-2016-10091 (buffer + overflow in various cmd_ functions) + +diff --git a/src/attr.c b/src/attr.c +index 02b5c81..e2951ea 100644 +--- a/src/attr.c ++++ b/src/attr.c +@@ -746,7 +746,7 @@ char * + assemble_string(char *string, int nr) + { + +- char *s, tmp[12];/* Number of characters that can be in int type (including '\0') - AF */ ++ char *s, tmp[20]; + int i = 0, j = 0; + + if (string == NULL) +@@ -762,7 +762,7 @@ assemble_string(char *string, int nr) + } + + if (string[i] != '\0') { +- sprintf(tmp, "%d", nr); ++ snprintf(tmp, 20, "%d", nr); + strcpy(&s[j], tmp); + j = j + strlen(tmp); + } +diff --git a/src/convert.c b/src/convert.c +index c76d7d6..8eacdcb 100644 +--- a/src/convert.c ++++ b/src/convert.c +@@ -472,7 +472,7 @@ static const int fcharsetparmtocp(int parm) + } + + // Translate code page to encoding name hopefully suitable as iconv input +-static char *cptoencoding(parm) ++static char *cptoencoding(int parm) + { + // Note that CP0 is supposed to mean current system default, which does + // not make any sense as a stored value, we don't handle it. +@@ -964,7 +964,7 @@ cmd_cf (Word *w, int align, char has_param, int num) + } + else + { +- sprintf(str,"#%02x%02x%02x", ++ snprintf(str, 40, "#%02x%02x%02x", + color_table[num].r, + color_table[num].g, + color_table[num].b); +@@ -993,7 +993,7 @@ cmd_cb (Word *w, int align, char has_param, int num) + } + else + { +- sprintf(str,"#%02x%02x%02x", ++ snprintf(str, 40, "#%02x%02x%02x", + color_table[num].r, + color_table[num].g, + color_table[num].b); +@@ -1018,7 +1018,7 @@ cmd_fs (Word *w, int align, char has_param, int points) { + /* Note, fs20 means 10pt */ + points /= 2; + +- sprintf(str,"%d",points); ++ snprintf(str, 20, "%d", points); + attr_push(ATTR_FONTSIZE,str); + + return FALSE; +@@ -1166,7 +1166,7 @@ cmd_f (Word *w, int align, char has_param, int num) + { + // TOBEDONE: WHAT'S THIS ??? + name = my_malloc(12); +- sprintf(name, "%d", num); ++ snprintf(name, 12, "%d", num); + } + + /* we are going to output entities, so should not output font */ +@@ -1218,7 +1218,7 @@ cmd_highlight (Word *w, int align, char has_param, int num) + } + else + { +- sprintf(str,"#%02x%02x%02x", ++ snprintf(str, 40, "#%02x%02x%02x", + color_table[num].r, + color_table[num].g, + color_table[num].b); +@@ -1373,9 +1373,9 @@ cmd_ftech (Word *w, int align, char has_param, int param) { + + static int + cmd_expand (Word *w, int align, char has_param, int param) { +- char str[10]; ++ char str[20]; + if (has_param) { +- sprintf(str, "%d", param/4); ++ snprintf(str, 20, "%d", param / 4); + if (!param) + attr_pop(ATTR_EXPAND); + else +@@ -1394,7 +1394,7 @@ cmd_expand (Word *w, int align, char has_param, int param) { + + static int + cmd_emboss (Word *w, int align, char has_param, int param) { +- char str[10]; ++ char str[20]; + if (has_param && !param) + #ifdef SUPPORT_UNNESTED + attr_find_pop(ATTR_EMBOSS); +@@ -1403,7 +1403,7 @@ cmd_emboss (Word *w, int align, char has_param, int param) { + #endif + else + { +- sprintf(str, "%d", param); ++ snprintf(str, 20, "%d", param); + attr_push(ATTR_EMBOSS, str); + } + return FALSE; +@@ -1419,12 +1419,12 @@ cmd_emboss (Word *w, int align, char has_param, int param) { + + static int + cmd_engrave (Word *w, int align, char has_param, int param) { +- char str[10]; ++ char str[20]; + if (has_param && !param) + attr_pop(ATTR_ENGRAVE); + else + { +- sprintf(str, "%d", param); ++ snprintf(str, 20, "%d", param); + attr_push(ATTR_ENGRAVE, str); + } + return FALSE; +@@ -1976,7 +1976,7 @@ static int cmd_u (Word *w, int align, char has_param, int param) { + + short done=0; + long unicode_number = (long) param; /* On 16bit architectures int is too small to store unicode characters. - AF */ +- char tmp[12]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */ ++ char tmp[20]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */ + const char *alias; + #define DEBUG 0 + #if DEBUG +@@ -2006,7 +2006,7 @@ static int cmd_u (Word *w, int align, char has_param, int param) { + /* RTF spec: Unicode values beyond 32767 are represented by negative numbers */ + unicode_number += 65536; + } +- sprintf(tmp, "%ld", unicode_number); ++ snprintf(tmp, 20, "%ld", unicode_number); + + if (safe_printf(1, op->unisymbol_print, tmp)) fprintf(stderr, TOO_MANY_ARGS, "unisymbol_print"); + done++; +diff --git a/src/output.c b/src/output.c +index 86d8b5c..4cdbfa6 100644 +--- a/src/output.c ++++ b/src/output.c +@@ -320,7 +320,7 @@ op_begin_std_fontsize (OutputPersonality *op, int size) + if (!found_std_expr) { + if (op->fontsize_begin) { + char expr[16]; +- sprintf (expr, "%d", size); ++ snprintf(expr, 16, "%d", size); + if (safe_printf (1, op->fontsize_begin, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_begin"); + } else { + /* If we cannot write out a change for the exact +@@ -440,7 +440,7 @@ op_end_std_fontsize (OutputPersonality *op, int size) + if (!found_std_expr) { + if (op->fontsize_end) { + char expr[16]; +- sprintf (expr, "%d", size); ++ snprintf(expr, 16, "%d", size); + if (safe_printf(1, op->fontsize_end, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_end"); + } else { + /* If we cannot write out a change for the exact +- +.11.0 + diff --git a/gnu/packages/patches/vtk-mesa-10.patch b/gnu/packages/patches/vtk-mesa-10.patch deleted file mode 100644 index bc60af68c4..0000000000 --- a/gnu/packages/patches/vtk-mesa-10.patch +++ /dev/null @@ -1,36 +0,0 @@ -Fix build against new mesa. See: - - https://bugs.freedesktop.org/show_bug.cgi?id=83631 - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765938 - -Description: fixes FTBFS against new libjpeg-turbo -Author: Ondřej Surý <ondrej@debian.org> -Bug-Debian: https://bugs.debian.org/765938 -Reviewed-By: Anton Gladky <gladk@debian.org> -Last-Update: 2014-10-22 - -Index: vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkOpenGL.h -=================================================================== ---- vtk6-6.1.0+dfsg2.orig/Rendering/OpenGL/vtkOpenGL.h -+++ vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkOpenGL.h -@@ -20,6 +20,7 @@ - - // To prevent gl.h to include glext.h provided by the system - #define GL_GLEXT_LEGACY -+#define GLX_GLEXT_LEGACY - #if defined(__APPLE__) && (defined(VTK_USE_CARBON) || defined(VTK_USE_COCOA)) - # include <OpenGL/gl.h> // Include OpenGL API. - #else -Index: vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx -=================================================================== ---- vtk6-6.1.0+dfsg2.orig/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx -+++ vtk6-6.1.0+dfsg2/Rendering/OpenGL/vtkXOpenGLRenderWindow.cxx -@@ -27,7 +27,7 @@ - - // define GLX_GLXEXT_LEGACY to prevent glx.h to include glxext.h provided by - // the system --//#define GLX_GLXEXT_LEGACY -+#define GLX_GLXEXT_LEGACY - #include "GL/glx.h" - - #include "vtkgl.h" diff --git a/gnu/packages/pciutils.scm b/gnu/packages/pciutils.scm index 553e3f8cac..8422a5c574 100644 --- a/gnu/packages/pciutils.scm +++ b/gnu/packages/pciutils.scm @@ -30,7 +30,7 @@ (define-public pciutils (package (name "pciutils") - (version "3.5.1") + (version "3.5.2") (source (origin (method url-fetch) (uri (string-append @@ -38,7 +38,7 @@ version ".tar.xz")) (sha256 (base32 - "0byl2f897w5lhs4bvr6p7qwcz9bllj2zyfv7nywbcbsnb9ha9wrb")))) + "1z2y4f3cyvm7a0dyan0n6jpb3p9pvh35lrim0058slj0kwd1969s")))) (build-system gnu-build-system) (arguments '(#:phases diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm index 39f4d021de..3f329c5426 100644 --- a/gnu/packages/pdf.scm +++ b/gnu/packages/pdf.scm @@ -479,7 +479,7 @@ extracting content or merging files.") (define-public mupdf (package (name "mupdf") - (version "1.9a") + (version "1.10a") (source (origin (method url-fetch) @@ -487,18 +487,8 @@ extracting content or merging files.") name "-" version "-source.tar.gz")) (sha256 (base32 - "1k64pdapyj8a336jw3j61fhn0rp4q6az7d0dqp9r5n3d9rgwa5c0")) - (patches (search-patches "mupdf-build-with-openjpeg-2.1.patch" - "mupdf-CVE-2016-6265.patch" - "mupdf-CVE-2016-6525.patch" - "mupdf-CVE-2016-7504.patch" - "mupdf-CVE-2016-7505.patch" - "mupdf-CVE-2016-7506.patch" - "mupdf-CVE-2016-7563.patch" - "mupdf-CVE-2016-7564.patch" - "mupdf-CVE-2016-8674.patch" - "mupdf-CVE-2016-9017.patch" - "mupdf-CVE-2016-9136.patch")) + "0dm8wcs8i29aibzkqkrn8kcnk4q0kd1v66pg48h5c3qqp4v1zk5a")) + (patches (search-patches "mupdf-build-with-openjpeg-2.1.patch")) (modules '((guix build utils))) (snippet ;; Delete all the bundled libraries except for mujs, which is @@ -638,11 +628,6 @@ using a stylus.") (base32 "0rz2pg04wnzjjm2f5a8ik9v8s54mv4xrjhv5liqjijqv6awh12gl")))) (build-system python-build-system) - (arguments - ;; Prevent creation of the egg. Without this flag, various artifacts - ;; from the build inputs end up in the final python3 output. It also - ;; works around https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 . - `(#:configure-flags '("--single-version-externally-managed" "--root=/"))) (propagated-inputs `(("python-pillow" ,python-pillow))) (home-page "http://www.reportlab.com") @@ -650,14 +635,10 @@ using a stylus.") (description "This is the ReportLab PDF Toolkit. It allows rapid creation of rich PDF documents, and also creation of charts in a variety of bitmap and vector formats.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-reportlab)))))) + (license license:bsd-3))) (define-public python2-reportlab - (package - (inherit (package-with-python2 - (strip-python2-variant python-reportlab))) - (native-inputs `(("python2-pip" ,python2-pip))))) + (package-with-python2 python-reportlab)) (define-public impressive (package @@ -873,8 +854,6 @@ python-pypdf2 instead.") (inputs ;; pdfposter 0.6.0 still uses the old pyPdf `(("python2-pypdf" ,python2-pypdf))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (home-page "https://pythonhosted.org/pdftools.pdfposter/") (synopsis "Scale and tile PDF images/pages to print on multiple pages") (description "@command{pdfposter} can be used to create a large poster by diff --git a/gnu/packages/perl-web.scm b/gnu/packages/perl-web.scm new file mode 100644 index 0000000000..9c92a95dad --- /dev/null +++ b/gnu/packages/perl-web.scm @@ -0,0 +1,47 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages perl-web) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (gnu packages) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system perl)) + +(define-public perl-mojolicious + (package + (name "perl-mojolicious") + (version "7.10") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/S/SR/SRI/Mojolicious-" + version ".tar.gz")) + (sha256 + (base32 + "0811f3wajgf71y02dr2khqnaswjh582pcvhv93k101qpg61syihn")))) + (build-system perl-build-system) + (home-page "http://mojolicious.org/") + (synopsis "Real-time web framework") + (description "Back in the early days of the web, many people learned Perl +because of a wonderful Perl library called @code{CGI}. It was simple enough +to get started without knowing much about the language and powerful enough to +keep you going, learning by doing was much fun. While most of the techniques +used are outdated now, the idea behind it is not. Mojolicious is a new +endeavor to implement this idea using modern technologies.") + (license license:artistic2.0))) diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm index e9f3dca15a..8f103ec6d7 100644 --- a/gnu/packages/perl.scm +++ b/gnu/packages/perl.scm @@ -34,7 +34,8 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) - #:use-module (guix build-system perl)) + #:use-module (guix build-system perl) + #:use-module (gnu packages perl-web)) ;;; ;;; Please: Try to add new module packages in alphabetic order. @@ -266,6 +267,33 @@ manipulate, read, and write Zip archive files.") list manipulation routines.") (license (package-license perl)))) +(define-public perl-autovivification + (package + (name "perl-autovivification") + (version "0.16") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/V/VP/VPIT/" + "autovivification-" version ".tar.gz")) + (sha256 + (base32 + "1422kw9fknv7rbjkgdfflg1q3mb69d3yryszp38dn0bgzkqhwkc1")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/autovivification") + (synopsis "Lexically disable autovivification") + (description "When an undefined variable is dereferenced, it gets silently +upgraded to an array or hash reference (depending of the type of the +dereferencing). This behaviour is called autovivification and usually does +what you mean but it may be unnatural or surprising because your variables get +populated behind your back. This is especially true when several levels of +dereferencing are involved, in which case all levels are vivified up to the +last, or when it happens in intuitively read-only constructs like +@code{exists}. The pragma provided by this package lets you disable +autovivification for some constructs and optionally throws a warning or an +error when it would have happened.") + (license (package-license perl)))) + (define-public perl-base (package (name "perl-base") @@ -380,6 +408,88 @@ library can nevertheless be used stand-alone, without Perl.") special objects: true and false.") (license (package-license perl)))) +(define-public perl-business-isbn-data + (package + (name "perl-business-isbn-data") + (version "20140910.003") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BD/BDFOY/" + "Business-ISBN-Data-" version ".tar.gz")) + (sha256 + (base32 + "1jc5jrjwkr6pqga7998zkgw0yrxgb5n1y7lzgddawxibkf608mn7")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Business-ISBN-Data") + (synopsis "Data files for Business::ISBN") + (description "This package provides a data pack for @code{Business::ISBN}. +These data are generated from the RangeMessage.xml file provided by the ISBN +Agency.") + (license (package-license perl)))) + +(define-public perl-business-isbn + (package + (name "perl-business-isbn") + (version "3.003") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BD/BDFOY/" + "Business-ISBN-" version ".tar.gz")) + (sha256 + (base32 + "1i2bxzqkki257rqbswa4ryj1grmwa5s47wrxln2ff5mha1ry31gm")))) + (build-system perl-build-system) + (propagated-inputs + `(("perl-business-isbn-data" ,perl-business-isbn-data) + ("perl-mojolicious" ,perl-mojolicious))) + (home-page "http://search.cpan.org/dist/Business-ISBN") + (synopsis "Work with International Standard Book Numbers") + (description "This modules provides tools to deal with International +Standard Book Numbers, including ISBN-10 and ISBN-13.") + (license artistic2.0))) + +(define-public perl-business-issn + (package + (name "perl-business-issn") + (version "0.91") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BD/BDFOY/" + "Business-ISSN-" version ".tar.gz")) + (sha256 + (base32 + "1dfnm7h7lbqj356700ldlmgbr51v6hyjn1qig2bb4ysl1wn1jnzi")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Business-ISSN") + (synopsis "Work with International Standard Serial Numbers") + (description "This modules provides tools to deal with International +Standard Serial Numbers.") + (license (package-license perl)))) + +(define-public perl-business-ismn + (package + (name "perl-business-ismn") + (version "1.13") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BD/BDFOY/" + "Business-ISMN-" version ".tar.gz")) + (sha256 + (base32 + "0cm1v75axg4gp6cnbyavmnqqjscsxh7nc60vcbw34rqivvf9idc9")))) + (build-system perl-build-system) + (native-inputs + `(("perl-tie-cycle" ,perl-tie-cycle))) + (home-page "http://search.cpan.org/dist/Business-ISMN") + (synopsis "Work with International Standard Music Numbers") + (description "This modules provides tools to deal with International +Standard Music Numbers.") + (license (package-license perl)))) + (define-public perl-cache-cache (package (name "perl-cache-cache") @@ -516,6 +626,25 @@ cases where the clan modules are not classes derived from each other, and thus the Carp.pm module doesn't help.") (license (package-license perl)))) +(define-public perl-cddb-get + (package + (name "perl-cddb-get") + (version "2.28") + (source (origin + (method url-fetch) + (uri (string-append + "mirror://cpan/authors/id/F/FO/FONKIE/CDDB_get-" + version ".tar.gz")) + (sha256 + (base32 + "1jfrwvfasylcafbvb0jjm94ad4v6k99a7rf5i4qwzhg4m0gvmk5x")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/CDDB_get") + (synopsis "Read the CDDB entry for an audio CD in your drive") + (description "This module can retrieve information from the CDDB.") + ;; Either GPLv2 or the "Artistic" license. + (license (list gpl2 artistic2.0)))) + (define-public perl-class-accessor (package (name "perl-class-accessor") @@ -836,7 +965,7 @@ write accessor methods for your objects that perform standard tasks.") (define-public perl-class-method-modifiers (package (name "perl-class-method-modifiers") - (version "2.11") + (version "2.12") (source (origin (method url-fetch) @@ -844,7 +973,7 @@ write accessor methods for your objects that perform standard tasks.") "Class-Method-Modifiers-" version ".tar.gz")) (sha256 (base32 - "14nk2gin9cjwpysakli7f0gs4q1w220sn73xzv35rhlspngrggyy")))) + "1j3swa212wh14dq5r6zjarm2lzpx6mrdfplpjy65px8b09ri0k74")))) (build-system perl-build-system) (native-inputs `(("perl-test-fatal" ,perl-test-fatal) @@ -1193,13 +1322,54 @@ Password Generator\".") ,(package-version perl) "/czplib/")) #t))))) - (home-page "http://sourceforge.net/projects/czplib/") + (home-page "https://sourceforge.net/projects/czplib/") (synopsis "Library for genomic analysis") (description "Chaolin Zhang's Perl Library (czplib) contains assorted functions and data structures for processing and analysing genomic and bioinformatics data.") (license gpl3+))) +(define-public perl-data-compare + (package + (name "perl-data-compare") + (version "1.25") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/D/DC/DCANTRELL/" + "Data-Compare-" version ".tar.gz")) + (sha256 + (base32 + "0wzasidg9yjcfsi2gdiaw6726ikqda7n24n0v2ngpaazakdkcjqx")))) + (build-system perl-build-system) + (propagated-inputs + `(("perl-file-find-rule" ,perl-file-find-rule))) + (home-page "http://search.cpan.org/dist/Data-Compare") + (synopsis "Compare Perl data structures") + (description "This module compares arbitrary data structures to see if +they are copies of each other.") + (license (package-license perl)))) + +(define-public perl-data-uniqid + (package + (name "perl-data-uniqid") + (version "0.12") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/M/MW/MWX/Data-Uniqid-" + version ".tar.gz")) + (sha256 + (base32 + "1jsc6acmv97pzsvx1fqywz4qvxxpp7kwmb78ygyqpsczkfj9p4dn")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Data-Uniqid") + (synopsis "Perl extension for generating unique identifiers") + (description "@code{Data::Uniqid} provides three simple routines for +generating unique ids. These ids are coded with a Base62 systen to make them +short and handy (e.g. to use it as part of a URL).") + (license (package-license perl)))) + (define-public perl-data-dump (package (name "perl-data-dump") @@ -1468,6 +1638,28 @@ operations, such as comparing two times, determining a date a given amount of time from another, or parsing international times.") (license (package-license perl)))) +(define-public perl-date-simple + (package + (name "perl-date-simple") + (version "3.03") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/I/IZ/IZUT/" + "Date-Simple-" version ".tar.gz")) + (sha256 + (base32 + "016x17r9wi6ffdc4idwirzd1sxqcb4lmq5fn2aiq25nf2iir5899")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Date-Simple") + (synopsis "Simple date handling") + (description "Dates are complex enough without times and timezones. This +module may be used to create simple date objects. It handles validation, +interval arithmetic, and day-of-week calculation. It does not deal with +hours, minutes, seconds, and time zones.") + ;; Can be used with either license. + (license (list (package-license perl) gpl2+)))) + (define-public perl-datetime (package (name "perl-datetime") @@ -1497,6 +1689,30 @@ combinations. It represents the Gregorian calendar, extended backwards in time before its creation (in 1582).") (license artistic2.0))) +(define-public perl-datetime-calendar-julian + (package + (name "perl-datetime-calendar-julian") + (version "0.04") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/P/PI/PIJLL/" + "DateTime-Calendar-Julian-" version ".tar.gz")) + (sha256 + (base32 + "03h0llkwsiw2d2ci1ah5x9sp8xrvnbgd471i5hnpgl5w32nnhndv")))) + (build-system perl-build-system) + ;; Only needed for tests + (native-inputs + `(("perl-datetime" ,perl-datetime))) + (home-page "http://search.cpan.org/dist/DateTime-Calendar-Julian") + (synopsis "Dates in the Julian calendar") + (description "This package is a companion module to @code{DateTime.pm}. +It implements the Julian calendar. It supports everything that +@code{DateTime.pm} supports and more: about one day per century more, to be +precise.") + (license (package-license perl)))) + (define-public perl-datetime-set (package (name "perl-datetime-set") @@ -2125,6 +2341,86 @@ SHA-1 message digest algorithm for use by Perl programs.") modules separately and deal with them after the module is done installing.") (license (package-license perl)))) +(define-public perl-encode-detect + (package + (name "perl-encode-detect") + (version "1.01") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/J/JG/JGMYERS/" + "Encode-Detect-" version ".tar.gz")) + (sha256 + (base32 + "1wdv9ffgs4xyfh5dnh09dqkmmlbf5m1hxgdgb3qy6v6vlwx8jkc3")))) + (build-system perl-build-system) + (native-inputs + `(("perl-module-build" ,perl-module-build))) + (home-page "http://search.cpan.org/dist/Encode-Detect") + (synopsis "Detect the encoding of data") + (description "This package provides a class @code{Encode::Detect} to detect +the encoding of data.") + (license mpl1.1))) + +(define-public perl-encode-eucjpascii + (package + (name "perl-encode-eucjpascii") + (version "0.03") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/N/NE/NEZUMI/" + "Encode-EUCJPASCII-" version ".tar.gz")) + (sha256 + (base32 + "0qg8kmi7r9jcf8326b4fyq5sdpqyim2a11h7j77q577xam6x767r")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Encode-EUCJPASCII") + (synopsis "ASCII mapping for eucJP encoding") + (description "This package provides an ASCII mapping for the eucJP +encoding.") + (license (package-license perl)))) + +(define-public perl-encode-jis2k + (package + (name "perl-encode-jis2k") + (version "0.03") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/D/DA/DANKOGAI/" + "Encode-JIS2K-" version ".tar.gz")) + (sha256 + (base32 + "1k1mdj4rd9m1z4h7qd2dl92ky0r1rk7mmagwsvdb9pirvdr4vj0y")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Encode-JIS2K") + (synopsis "JIS X 0212 (aka JIS 2000) encodings") + (description "This package provides encodings for JIS X 0212, which is +also known as JIS 2000.") + (license (package-license perl)))) + +(define-public perl-encode-hanextra + (package + (name "perl-encode-hanextra") + (version "0.23") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/A/AU/AUDREYT/" + "Encode-HanExtra-" version ".tar.gz")) + (sha256 + (base32 + "0fj4vd8iva2i0j6s2fyhwgr9afrvhr6gjlzi7805h257mmnb1m0z")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Encode-HanExtra") + (synopsis "Additional Chinese encodings") + (description "This Perl module provides Chinese encodings that are not +part of Perl by default, including \"BIG5-1984\", \"BIG5-2003\", \"BIG5PLUS\", +\"BIG5EXT\", \"CCCII\", \"EUC-TW\", \"CNS11643-*\", \"GB18030\", and +\"UNISYS\".") + (license expat))) + (define-public perl-env-path (package (name "perl-env-path") @@ -2325,6 +2621,29 @@ it ties together a family of modern toolchain modules.") module building modules.") (license (package-license perl)))) +(define-public perl-extutils-libbuilder + (package + (name "perl-extutils-libbuilder") + (version "0.08") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/A/AM/AMBS/" + "ExtUtils-LibBuilder-" version ".tar.gz")) + (sha256 + (base32 + "1lmmfcjxvsvhn4f3v2lyylgr8dzcf5j7mnd1pkq3jc75dph724f5")))) + (build-system perl-build-system) + (native-inputs + `(("perl-module-build" ,perl-module-build))) + (home-page "http://search.cpan.org/dist/ExtUtils-LibBuilder") + (synopsis "Tool to build C libraries") + (description "Some Perl modules need to ship C libraries together with +their Perl code. Although there are mechanisms to compile and link (or glue) +C code in your Perl programs, there isn't a clear method to compile standard, +self-contained C libraries. This module main goal is to help in that task.") + (license (package-license perl)))) + (define-public perl-file-changenotify (package (name "perl-file-changenotify") @@ -3023,6 +3342,26 @@ filehandles; in particular, IO::Scalar, IO::ScalarArray, and IO::Lines.") pseudo ttys.") (license (package-license perl)))) +(define-public perl-ipc-cmd + (package + (name "perl-ipc-cmd") + (version "0.96") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BI/BINGOS/IPC-Cmd-" + version ".tar.gz")) + (sha256 + (base32 + "0a2v44x70gj9fd5wa8i08f9z6n14qppj1j49m1hc333wh72mzk6i")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/IPC-Cmd") + (synopsis "Run interactive command-line programs") + (description "@code{IPC::Cmd} allows for the searching and execution of +any binary on your system. It adheres to verbosity settings and is able to +run interactively. It also has an option to capture output/error buffers.") + (license (package-license perl)))) + (define-public perl-ipc-run (package (name "perl-ipc-run") @@ -3345,6 +3684,26 @@ version.") one: logging, exceptions, and translations.") (license (package-license perl)))) +(define-public perl-lingua-translit + (package + (name "perl-lingua-translit") + (version "0.26") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/A/AL/ALINKE/" + "Lingua-Translit-" version ".tar.gz")) + (sha256 + (base32 + "161589h08kzliga17i2g0hb0yn4cjmb8rdiyadq5bw97974bac14")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Lingua-Translit") + (synopsis "Transliterate text between writing systems") + (description "@code{Lingua::Translit} can be used to convert text from one +writing system to another, based on national or international transliteration +tables. Where possible a reverse transliteration is supported.") + (license (package-license perl)))) + (define-public perl-list-allutils (package (name "perl-list-allutils") @@ -4372,6 +4731,26 @@ own set of Moose-like types. These custom types can then be used to describe fields in Moo-based classes.") (license (package-license perl)))) +(define-public perl-mozilla-ca + (package + (name "perl-mozilla-ca") + (version "20160104") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/A/AB/ABH/Mozilla-CA-" + version ".tar.gz")) + (sha256 + (base32 + "0aizn08lrdrgjz9vagkjmw2c7sxn46fzz521v9dbcqii4jd0d9r7")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Mozilla-CA") + (synopsis "Mozilla's CA cert bundle in PEM format") + (description "@code{Mozilla::CA} provides a copy of Mozilla's bundle of +Certificate Authority certificates in a form that can be consumed by modules +and libraries based on OpenSSL.") + (license mpl2.0))) + (define-public perl-mro-compat (package (name "perl-mro-compat") @@ -4396,7 +4775,7 @@ Perl (back to 5.6.0).") (define-public perl-namespace-autoclean (package (name "perl-namespace-autoclean") - (version "0.24") + (version "0.28") (source (origin (method url-fetch) @@ -4404,7 +4783,7 @@ Perl (back to 5.6.0).") "namespace-autoclean-" version ".tar.gz")) (sha256 (base32 - "0msggbg2zbixxjq1fda19h0yygavxndfzc4j4pq11nfghmawjsb0")))) + "0fbcq99yaix1aa99jl3v811dbw24il9jxnh5i2i23mddh4b0lhfd")))) (build-system perl-build-system) (native-inputs `(("perl-module-build" ,perl-module-build) @@ -5045,6 +5424,25 @@ designed to be slow or big, neither has it been designed to be fast or compact.") (license (package-license perl)))) +(define-public perl-sort-key + (package + (name "perl-sort-key") + (version "1.33") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/S/SA/SALVA/Sort-Key-" + version ".tar.gz")) + (sha256 + (base32 + "1kqs10s2plj6c96srk0j8d7xj8dxk1704r7mck8rqk09mg7lqspd")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Sort-Key") + (synopsis "Sort arrays by one or multiple calculated keys") + (description "This Perl module provides various functions to quickly sort +arrays by one or multiple calculated keys.") + (license (package-license perl)))) + (define-public perl-spiffy (package (name "perl-spiffy") @@ -6389,6 +6787,29 @@ decomposition of comma-separated values. An instance of the Text::CSV class can combine fields into a CSV string and parse a CSV string into fields.") (license (package-license perl)))) +(define-public perl-text-csv-xs + (package + (name "perl-text-csv-xs") + (version "1.25") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/H/HM/HMBRAND/" + "Text-CSV_XS-" version ".tgz")) + (sha256 + (base32 + "06zlfbqrwbl0g2g3bhk6046yy5pf2rz80fzcp8aj47rnswz2yx5k")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Text-CSV_XS") + (synopsis "Rountines for manipulating CSV files") + (description "@code{Text::CSV_XS} provides facilities for the composition +and decomposition of comma-separated values. An instance of the +@code{Text::CSV_XS} class will combine fields into a CSV string and parse a +CSV string into fields. The module accepts either strings or files as input +and support the use of user-specified characters for delimiters, separators, +and escapes.") + (license (package-license perl)))) + (define-public perl-text-diff (package (name "perl-text-diff") @@ -6459,6 +6880,27 @@ template engine, for when you need speed rather than complex features, yet need more features than simple variable substitution.") (license (package-license perl)))) +(define-public perl-text-roman + (package + (name "perl-text-roman") + (version "3.5") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/S/SY/SYP/Text-Roman-" + version ".tar.gz")) + (sha256 + (base32 + "0sh47svzz0wm993ywfgpn0fvhajl2sj5hcnf5zxjz02in6ihhjnb")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Text-Roman") + (synopsis "Convert between Roman and Arabic algorisms") + (description "This package provides functions to convert between Roman and +Arabic algorisms. It supports both conventional Roman algorisms (which range +from 1 to 3999) and Milhar Romans, a variation which uses a bar across the +algorism to indicate multiplication by 1000.") + (license (package-license perl)))) + (define-public perl-text-simpletable (package (name "perl-text-simpletable") @@ -6567,6 +7009,25 @@ controlled with command line parameters. The default parameter settings approximately follow the suggestions in the Perl Style Guide.") (license gpl2+))) +(define-public perl-tie-cycle + (package + (name "perl-tie-cycle") + (version "1.221") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/B/BD/BDFOY/Tie-Cycle-" + version ".tar.gz")) + (sha256 + (base32 + "10g6kirf6jfaldckg98y4pl87vrm7grqlg6ymb7a9vhrznyn7qn6")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Tie-Cycle") + (synopsis "Cycle through a list of values") + (description "You use @code{Tie::Cycle} to go through a list over and over +again. Once you get to the end of the list, you go back to the beginning.") + (license (package-license perl)))) + (define-public perl-tie-ixhash (package (name "perl-tie-ixhash") @@ -6810,17 +7271,58 @@ else.") common serialisation formats such as JSON or CBOR.") (license (package-license perl)))) +(define-public perl-unicode-normalize + (package + (name "perl-unicode-normalize") + (version "1.25") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/K/KH/KHW/" + "Unicode-Normalize-" version ".tar.gz")) + (sha256 + (base32 + "0v04bcyjfcfap4kfpc8q3ikq3j7s68nym4ckw3iasmmksdskmcq0")))) + (build-system perl-build-system) + (home-page "http://search.cpan.org/dist/Unicode-Normalize") + (synopsis "Unicode normalization forms") + (description "This Perl module provides Unicode normalization forms.") + (license (package-license perl)))) + +(define-public perl-unicode-collate + (package + (name "perl-unicode-collate") + (version "1.18") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/S/SA/SADAHIRO/" + "Unicode-Collate-" version ".tar.gz")) + (sha256 + (base32 + "1lq4p3mqqljhhy8wyiyahris33j4m5qfzpi6iacmcqjzw5g4afbm")))) + (build-system perl-build-system) + (propagated-inputs + `(("perl-unicode-normalize" ,perl-unicode-normalize))) + (home-page "http://search.cpan.org/dist/Unicode-Collate") + (synopsis "Unicode collation algorithm") + (description "This package provides tools for sorting and comparing +Unicode data.") + ;; The file Unicode/Collate/allkeys.txt is released under the Expat + ;; license. + (license (list (package-license perl) expat)))) + (define-public perl-unicode-linebreak (package (name "perl-unicode-linebreak") - (version "2015.12") + (version "2016.003") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/N/NE/NEZUMI/" "Unicode-LineBreak-" version ".tar.gz")) (sha256 (base32 - "1d0nnc97irfpab4d3b2lvq22hac118k7zbfrj0lnxkbfwx7122cm")))) + "096wf5x99swx7l7yd8pm2aw50g596nf50rkq7250zjcc1acjskp6")))) (build-system perl-build-system) (propagated-inputs `(("perl-mime-charset" ,perl-mime-charset))) @@ -7268,27 +7770,3 @@ interface to File::Find::Object.") (description "Test::TrailingSpace tests for trailing spaces in Perl source files.") (license x11))) - -(define-public perl-encode-detect - (package - (name "perl-encode-detect") - (version "1.01") - (source - (origin - (method url-fetch) - (uri (string-append - "mirror://cpan/authors/id/J/JG/JGMYERS/Encode-Detect-" - version - ".tar.gz")) - (sha256 - (base32 - "1wdv9ffgs4xyfh5dnh09dqkmmlbf5m1hxgdgb3qy6v6vlwx8jkc3")))) - (build-system perl-build-system) - (inputs - `(("perl-module-build" ,perl-module-build))) - (home-page - "http://search.cpan.org/dist/Encode-Detect") - (synopsis - "Perl Encode::Encoding subclass that detects the encoding of data") - (description "Encode::Detect detects the encoding of data for Perl.") - (license mpl1.1))) diff --git a/gnu/packages/photo.scm b/gnu/packages/photo.scm index f4d110edbc..8e823cfc21 100644 --- a/gnu/packages/photo.scm +++ b/gnu/packages/photo.scm @@ -89,20 +89,21 @@ data as produced by digital cameras.") (define-public libgphoto2 (package (name "libgphoto2") - (version "2.5.2") + (version "2.5.11") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/gphoto/libgphoto/" version "/libgphoto2-" version ".tar.bz2")) (sha256 (base32 - "0f1818l1vs5fbmrihzyv3qasddbqi3r01jik5crrxddwalsi2bd3")))) + "1ap070zz6l4kn2mbyxb1yj4x5ar8hpdbmf2pvjxgnly1ss319dkz")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs - `(;; ("libjpeg-turbo" ,libjpeg-turbo) + `(("libjpeg-turbo" ,libjpeg-turbo) ("libltdl" ,libltdl) - ("libusb" ,libusb))) + ("libusb" ,libusb) + ("libxml2" ,libxml2))) (propagated-inputs `(;; The .pc refers to libexif. ("libexif" ,libexif))) @@ -119,20 +120,20 @@ from digital cameras.") (define-public gphoto2 (package (name "gphoto2") - (version "2.5.2") + (version "2.5.11") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/gphoto/gphoto/" version "/gphoto2-" version ".tar.bz2")) (sha256 (base32 - "16c8k1cxfypg7v5h8xi87grclw7a5ayaamn548ys3zkj727r5fcf")))) + "1sgr6rsvzzagcwhc8fxbnvz3k02wr2hab0vrbvcb04k5l3b48a1r")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("readline" ,readline) - ;; ("libjpeg-turbo" ,libjpeg-turbo) + ("libjpeg-turbo" ,libjpeg-turbo) ("popt" ,popt) ("libexif" ,libexif) ("libgphoto2" ,libgphoto2))) diff --git a/gnu/packages/php.scm b/gnu/packages/php.scm index 245892f6e8..16b098517a 100644 --- a/gnu/packages/php.scm +++ b/gnu/packages/php.scm @@ -64,7 +64,7 @@ (define-public php (package (name "php") - (version "7.0.13") + (version "7.0.14") (home-page "https://secure.php.net/") (source (origin (method url-fetch) @@ -72,7 +72,7 @@ name "-" version ".tar.xz")) (sha256 (base32 - "1gzihbpcp51jc587gs1ryn59hsnr7vf5427dmcvdimvm77wsfyrm")) + "12ccgbrfchgvmcfb88rcknq7xmrf19c5ysdr4v8jxk51j9izy78g")) (modules '((guix build utils))) (snippet '(with-directory-excursion "ext" diff --git a/gnu/packages/pretty-print.scm b/gnu/packages/pretty-print.scm index 8ba9780685..8819b8adaf 100644 --- a/gnu/packages/pretty-print.scm +++ b/gnu/packages/pretty-print.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; 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 gperf) - #:use-module (gnu packages perl)) + #:use-module (gnu packages lua) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config)) (define-public a2ps (package @@ -197,6 +200,47 @@ seen in a terminal.") (license gpl3+) (properties '((ftp-directory . "/gnu/src-highlite"))))) +(define-public highlight + (package + (name "highlight") + (version "3.33") + (source + (origin + (method url-fetch) + (uri (string-append "http://www.andre-simon.de/zip/highlight-" + version ".tar.bz2")) + (sha256 + (base32 + "0g2whi6pxl640795vymikm82a1my841jmh7fiqzbrjpc9wsk1db4")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; no tests + #:make-flags + (let ((confdir (string-append %output "/share/highlight/config/"))) + (list (string-append "PREFIX=" %output) + (string-append "HL_CONFIG_DIR=" confdir) + (string-append "conf_dir=" confdir))) + #:phases + (modify-phases %standard-phases + (delete 'configure) + (add-after 'unpack 'fix-search-for-lua + (lambda _ + (substitute* "src/makefile" + (("(pkg-config.*)lua" _ prefix) + (string-append prefix "lua-5.3"))) + #t))))) + (inputs + `(("lua" ,lua) + ("boost" ,boost))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "http://www.andre-simon.de/doku/highlight/en/highlight.php") + (synopsis "Convert code to documents with syntax highlighting") + (description "Highlight converts source code to HTML, XHTML, RTF, LaTeX, +TeX, SVG, BBCode and terminal escape sequences with colored syntax +highlighting. Language definitions and color themes are customizable.") + (license gpl3+))) + (define-public astyle (package (name "astyle") diff --git a/gnu/packages/protobuf.scm b/gnu/packages/protobuf.scm index 586e532746..12f6f70521 100644 --- a/gnu/packages/protobuf.scm +++ b/gnu/packages/protobuf.scm @@ -63,17 +63,14 @@ internal RPC protocols and file formats.") (base32 "1xbgbfg4g43bihkyw1a2giqa2gxmqc5wkh0fzqcb90qi1z1hpi7c")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-six" ,python-six))) (home-page "https://github.com/google/protobuf") (synopsis "Protocol buffers is a data interchange format") (description "Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.") - (license bsd-3) - (properties `((python2-variant . ,(delay python2-protobuf)))))) + (license bsd-3))) (define-public python2-protobuf - (package (inherit (package-with-python2 - (strip-python2-variant python-protobuf))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-protobuf)) diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 497da52264..d8ca83d810 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -11,7 +11,7 @@ ;;; Copyright © 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org> ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr> ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org> -;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name> +;;; Copyright © 2015, 2016, 2017 Leo Famulari <leo@famulari.name> ;;; Copyright © 2015 Ben Woodcroft <donttrustben@gmail.com> ;;; Copyright © 2015, 2016 Erik Edrosa <erik.edrosa@gmail.com> ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il> @@ -32,6 +32,8 @@ ;;; Copyright © 2016 Alex Vong <alexvong1995@gmail.com> ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2016 Julien Lepiller <julien@lepiller.eu> +;;; Copyright © 2016, 2017 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2016 Thomas Danckaert <post@thomasdanckaert.be> ;;; ;;; This file is part of GNU Guix. ;;; @@ -123,6 +125,7 @@ "0y7rl603vmwlxm6ilkhc51rx2mfj14ckcz40xxgs0ljnvlhp30yp")) (patches (search-patches "python-2.7-search-paths.patch" "python-2-deterministic-build-info.patch" + "python-2.7-site-prefixes.patch" "python-2.7-source-date-epoch.patch")) (modules '((guix build utils))) ;; suboptimal to delete failing tests here, but if we delete them in the @@ -163,6 +166,7 @@ #:configure-flags (list "--enable-shared" ;allow embedding "--with-system-ffi" ;build ctypes + "--with-ensurepip=install" ;install pip and setuptools (string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out") "/lib")) @@ -434,8 +438,6 @@ instead of @command{python3}."))) (base32 "1w4r09fvn6kd80m5mx4ws1wz100brkaq6hzzpwrns8cgjzjpl6c6")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://www.github.com/giampaolo/psutil") (synopsis "Library for retrieving information on running processes") (description @@ -464,9 +466,8 @@ pidof, tty, taskset, pmap.") "1vdbqsa1a31s98fxkinl052q8nnpvbxnb83qanxfpi2p6c2zdr0b")))) (build-system python-build-system) (native-inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) - (inputs + `(("python-nose" ,python-nose))) + (propagated-inputs `(("python-py-bcrypt" ,python-py-bcrypt))) (arguments `(#:phases @@ -504,8 +505,6 @@ to providing full-strength password hashing for multi-user application.") (base32 "0y6smdggwi5s72v6p1nn53dg6w05hna3d264cq6kas0lap73p8az")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://code.google.com/p/py-bcrypt") (synopsis "Bcrypt password hashing and key derivation") @@ -539,12 +538,9 @@ John the Ripper).") (base32 "14k8z7ndc3zk5xivnm4d8lncchx475ll5izpf8vmfbq7rp9yp5rj")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs - `(("python-pycrypto" ,python-pycrypto))) - (inputs - `(("python-ecdsa" ,python-ecdsa))) + `(("python-pycrypto" ,python-pycrypto) + ("python-ecdsa" ,python-ecdsa))) (home-page "http://www.paramiko.org/") (synopsis "SSHv2 protocol library") (description "Paramiko is a python implementation of the SSHv2 protocol, @@ -569,8 +565,6 @@ Python interface around SSH networking concepts.") (base32 "126rsryvw9vhbf3qmsfw9lf4l4xm2srmgs439lgma4cpag4s3ay3")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/jcgregorio/httplib2") (synopsis "Comprehensive HTTP client library") (description @@ -596,8 +590,6 @@ other HTTP libraries.") (base32 "1yj31j0asmrx4an9xvsaj2icdmzy6pw0glfpqrrkrphwdpi1xkv4")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (inputs `(("openssl" ,openssl))) (home-page @@ -627,15 +619,18 @@ making them easy to handle and incorporate into other protocols.") (base32 "177dfxsmk3k4cih6fh6v8d91bh4nqx7ns6pc07w7m7i3cvdx3c8n")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) - (inputs + (propagated-inputs `(("python-pyyaml" ,python-pyyaml) + ;; Not listed in setup.py, but used in ccmlib/node.py for full + ;; functionality + ("python-psutil" ,python-psutil) ("python-six" ,python-six))) (home-page "https://github.com/pcmanus/ccm") - (synopsis "Cassandra Cluster Manager") - (description "A script/library to create, launch and remove an Apache -Cassandra cluster on localhost.") + (synopsis "Cassandra Cluster Manager for Apache Cassandra clusters on +localhost") + (description "Cassandra Cluster Manager is a development tool for testing +local Cassandra clusters. It creates, launches and removes Cassandra clusters +on localhost.") (license license:asl2.0))) (define-public python2-ccm @@ -644,14 +639,14 @@ Cassandra cluster on localhost.") (define-public python-pytz (package (name "python-pytz") - (version "2016.3") + (version "2016.10") (source (origin (method url-fetch) (uri (pypi-uri "pytz" version ".tar.bz2")) (sha256 (base32 - "1mjmrkk4vc5xzppw7fm0pli1nnbj57cvqv7jjv5whcmccyhxz4y1")))) + "0az099cyp6p5xbsvfcdacj4hvxncbwm2ayn3h55mcp07zb2b45kh")))) (build-system python-build-system) (arguments `(#:tests? #f)) ; no test target (home-page "http://pythonhosted.org/pytz") @@ -668,18 +663,17 @@ using Python 2.4 or higher and provides access to the Olson timezone database.") (define-public python-babel (package (name "python-babel") - (version "2.3.2") + (version "2.3.4") (source (origin (method url-fetch) (uri (pypi-uri "Babel" version)) (sha256 (base32 - "0k43pi0p1dwpds2w0km3fw92wixzxv2vw7p09capxmjz5cfh23lw")))) + "0x98qqqw35xllpcama013a9788ly84z8dm1w2wwfpxh2710c8df5")))) (build-system python-build-system) - (inputs - `(("python-pytz" ,python-pytz) - ("python-setuptools" ,python-setuptools))) + (propagated-inputs + `(("python-pytz" ,python-pytz))) (arguments `(#:tests? #f)) ; no test target (home-page "http://babel.pocoo.org/") (synopsis @@ -713,8 +707,6 @@ etc. ") (arguments `(#:python ,python-2 #:tests? #f)) ; no test target - (inputs - `(("python2-setuptools" ,python2-setuptools))) (home-page "https://bitbucket.org/brandon/backports.ssl_match_hostname") (synopsis "Backport of ssl.match_hostname() function from Python 3.5") (description @@ -724,6 +716,51 @@ certificate returned by the server to which a connection has been established, and verifies that it matches the intended target hostname.") (license license:psfl))) +(define-public python-hdf4 + (package + (name "python-hdf4") + (version "0.9") + (source + (origin + (method url-fetch) + (uri (pypi-uri name version)) + (sha256 + (base32 + "1hjiyrxvxk9817qyqky3nar4y3fs4z8wxz0n884zzb5wi6skrjks")))) + (build-system python-build-system) + (native-inputs `(("nose" ,python-nose))) + (propagated-inputs `(("numpy" ,python-numpy))) + (inputs + `(("hdf4" ,hdf4) + ("libjpeg" ,libjpeg) + ("zlib" ,zlib))) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + ;; The 'runexamples' script sets PYTHONPATH to CWD, then goes + ;; on to import numpy. Somehow this works on their CI system. + ;; Let's just manage PYTHONPATH here instead. + (substitute* "runexamples.sh" + (("export PYTHONPATH=.*") "")) + (setenv "PYTHONPATH" + (string-append (getcwd) ":" + (getenv "PYTHONPATH"))) + (and (zero? (system* "./runexamples.sh")) + (zero? (system* "nosetests" "-v")))))))) + (home-page "https://github.com/fhs/python-hdf4") + (synopsis "Python interface to the NCSA HDF4 library") + (description + "Python-HDF4 is a python wrapper around the NCSA HDF version 4 library, +which implements the SD (Scientific Dataset), VS (Vdata) and V (Vgroup) API’s. +NetCDF files can also be read and modified. Python-HDF4 is a fork of +@url{http://hdfeos.org/software/pyhdf.php,pyhdf}.") + (license license:expat))) + +(define-public python2-hdf4 + (package-with-python2 python-hdf4)) + (define-public python-h5py (package (name "python-h5py") @@ -753,10 +790,10 @@ and verifies that it matches the intended target hostname.") (string-append "['" prefix "/lib" "']"))) #t)))))) (propagated-inputs - `(("python-numpy" ,python-numpy))) + `(("python-six" ,python-six) + ("python-numpy" ,python-numpy))) (inputs - `(("hdf5" ,hdf5) - ("python-six" ,python-six))) + `(("hdf5" ,hdf5))) (native-inputs `(("python-cython" ,python-cython) ("python-pkgconfig" ,python-pkgconfig))) @@ -768,11 +805,61 @@ HDF5 library from Python. The low-level interface is intended to be a complete wrapping of the HDF5 API, while the high-level component supports access to HDF5 files, datasets and groups using established Python and NumPy concepts.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-h5py)))))) + (license license:bsd-3))) (define-public python2-h5py - (package-with-python2 (strip-python2-variant python-h5py))) + (package-with-python2 python-h5py)) + +(define-public python-netcdf4 + (package + (name "python-netcdf4") + (version "1.2.6") + (source + (origin + (method url-fetch) + (uri (pypi-uri "netCDF4" version)) + (sha256 + (base32 + "1qcymsfxsdfr4sx0vl7ih5d14z66k6c9sjy4gb6rjaksk5387zvg")))) + (build-system python-build-system) + (native-inputs + `(("python-cython" ,python-cython))) + (propagated-inputs + `(("python-numpy" ,python-numpy))) + (inputs + `(("netcdf" ,netcdf) + ("hdf4" ,hdf4) + ("hdf5" ,hdf5))) + (arguments + '(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (setenv "NO_NET" "1") ; disable opendap tests + (with-directory-excursion "test" + (setenv "PYTHONPATH" ; find and add the library we just built + (string-append + (car (find-files "../build" "lib.*" + #:directories? #:t + #:fail-on-error? #:t)) + ":" (getenv "PYTHONPATH"))) + (zero? (system* "python" "run_all.py")))))))) + (home-page + "https://github.com/Unidata/netcdf4-python") + (synopsis "Python/numpy interface to the netCDF library") + (description "Netcdf4-python is a Python interface to the netCDF C +library. netCDF version 4 has many features not found in earlier +versions of the library and is implemented on top of HDF5. This module +can read and write files in both the new netCDF 4 and the old netCDF 3 +format, and can create files that are readable by HDF5 clients. The +API is modelled after @code{Scientific.IO.NetCDF}, and should be familiar +to users of that module.") + ;; The software is mainly ISC, but includes some files covered + ;; by the Expat license. + (license (list license:isc license:expat)))) + +(define-public python2-netcdf4 + (package-with-python2 python-netcdf4)) (define-public python-lockfile (package @@ -795,15 +882,10 @@ concepts.") (description "The lockfile package exports a LockFile class which provides a simple API for locking files.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-lockfile)))))) + (license license:expat))) (define-public python2-lockfile - (let ((base (package-with-python2 (strip-python2-variant python-lockfile)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-lockfile)) (define-public python-mock (package @@ -812,14 +894,13 @@ API for locking files.") (source (origin (method url-fetch) - (uri (string-append "https://pypi.python.org/packages/source/m/mock/" - "mock-" version ".tar.gz")) + (uri (pypi-uri "mock" version)) (sha256 (base32 "0kzlsbki6q0awf89rc287f3aj8x431lrajf160a70z0ikhnxsfdq")))) (build-system python-build-system) (arguments '(#:test-target "check")) - (home-page "http://code.google.com/p/mock/") + (home-page "https://github.com/testing-cabal/mock") (synopsis "Python mocking and patching library for testing") (description "Mock is a library for testing in Python. It allows you to replace parts @@ -834,15 +915,22 @@ have been used.") (define-public python-setuptools (package (name "python-setuptools") - (version "18.3.1") + (version "31.0.0") (source (origin (method url-fetch) - (uri (string-append "https://pypi.python.org/packages/source/s/setuptools/setuptools-" - version ".tar.gz")) + (uri (pypi-uri "setuptools" version)) (sha256 (base32 - "0kc7rbav00ks6iaw14p38y81q12fx0lpkhgf5m97xc04f5r318ig")))) + "0ypybh4hx3bv4vhg2dc74xpj1g56ggnaffm87k4abhwjwq6wq608")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove included binaries which are used to build self-extracting + ;; installers for Windows. + ;; TODO: Find some way to build them ourself so we can include them. + (for-each delete-file (find-files "setuptools" "^(cli|gui).*\\.exe$")) + #t)))) (build-system python-build-system) ;; FIXME: Tests require pytest, which itself relies on setuptools. ;; One could bootstrap with an internal untested setuptools. @@ -860,12 +948,21 @@ test hooks, project installation, platform-specific details, Python 3 support.") - (license license:psfl))) + ;; TODO: setuptools now bundles the following libraries: + ;; packaging, pyparsing, six and appdirs. How to unbundle? + (license (list license:psfl ; setuptools itself + license:expat ; six, appdirs, pyparsing + license:asl2.0 ; packaging is dual ASL2/BSD-2 + license:bsd-2)))) (define-public python2-setuptools (package-with-python2 python-setuptools)) - +;;; Pycrypto is abandoned upstream: +;;; +;;; https://github.com/dlitz/pycrypto/issues/173 +;;; +;;; TODO Remove this package from GNU Guix. (define-public python-pycrypto (package (name "python-pycrypto") @@ -873,14 +970,12 @@ Python 3 support.") (source (origin (method url-fetch) - (uri (string-append "https://pypi.python.org/packages/source/p/" - "pycrypto/pycrypto-" version ".tar.gz")) + (uri (pypi-uri "pycrypto" version)) + (patches (search-patches "python-pycrypto-CVE-2013-7459.patch")) (sha256 (base32 "0g0ayql5b9mkjam8hym6zyg6bv77lbh66rv1fyvgqb17kfc1xkpj")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (inputs `(("python" ,python) ("gmp" ,gmp))) @@ -923,7 +1018,7 @@ etc.). The package is structured to make adding new modules easy.") (build-system python-build-system) (native-inputs `(("python-setuptools-scm" ,python-setuptools-scm))) - (inputs + (propagated-inputs `(("python-pycrypto" ,python-pycrypto))) (arguments `(#:tests? #f)) ;TODO: tests require pytest @@ -934,15 +1029,10 @@ etc.). The package is structured to make adding new modules easy.") service from python. It can be used in any application that needs safe password storage.") ;; "MIT" and PSF dual license - (license license:x11) - (properties `((python2-variant . ,(delay python2-keyring)))))) + (license license:x11))) (define-public python2-keyring - (let ((base (package-with-python2 (strip-python2-variant python-keyring)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-keyring)) (define-public python-six (package @@ -956,8 +1046,6 @@ password storage.") (base32 "0snmb8xffb3vsma0z67i0h0w2g2dy0p3gsgh9gi4i0kgc5l8spqh")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pypi.python.org/pypi/six/") (synopsis "Python 2 and 3 compatibility utilities") (description @@ -983,22 +1071,17 @@ Python file, so it can be easily copied into your project.") (base32 "0jrfpcgvgya6hs45dhrd9yiqgdgz9qp9aa07zsw8gqgn8zphff86")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-six" ,python-six))) (home-page "https://dateutil.readthedocs.io/en/stable/") (synopsis "Extensions to the standard datetime module") (description "The dateutil module provides powerful extensions to the standard datetime module, available in Python 2.3+.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-dateutil-2)))))) + (license license:bsd-3))) (define-public python2-dateutil-2 - (let ((base (package-with-python2 (strip-python2-variant python-dateutil-2)))) - (package - (inherit base) - (inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-inputs base)))))) + (package-with-python2 python-dateutil-2)) (define-public python-dateutil (package @@ -1013,8 +1096,6 @@ datetime module, available in Python 2.3+.") (base32 "0fqfglhy5khbvsipr3x7m6bcaqljh8xl5cw33vbfxy7qhmywm2n0")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://dateutil.readthedocs.io/en/stable/") (synopsis "Extensions to the standard datetime module") (description @@ -1045,15 +1126,10 @@ datetime module, available in Python 2.3+.") "Parse human-readable date/time text") (description "Parse human-readable date/time text.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-parsedatetime)))))) + (license license:asl2.0))) (define-public python2-parsedatetime - (let ((base (package-with-python2 (strip-python2-variant python-parsedatetime)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-parsedatetime)) (define-public python-pandas (package @@ -1070,12 +1146,12 @@ datetime module, available in Python 2.3+.") (base32 "1ckpxrvvjj6zxmn68icd9hib8qcpx9b35f6izxnr25br5ilq7r6j")))) (build-system python-build-system) (propagated-inputs - `(("python-numpy" ,python-numpy))) - (inputs - `(("python-pytz" ,python-pytz) + `(("python-numpy" ,python-numpy) + ("python-pytz" ,python-pytz) ("python-dateutil" ,python-dateutil-2))) (native-inputs - `(("python-nose" ,python-nose))) + `(("python-nose" ,python-nose) + ("python-cython" ,python-cython))) (home-page "http://pandas.pydata.org") (synopsis "Data structures for data analysis, time series, and statistics") (description @@ -1084,15 +1160,10 @@ structures designed to make working with structured (tabular, multidimensional, potentially heterogeneous) and time series data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-pandas)))))) + (license license:bsd-3))) (define-public python2-pandas - (let ((base (package-with-python2 (strip-python2-variant python-pandas)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pandas)) (define-public python-tzlocal (package @@ -1106,7 +1177,8 @@ doing practical, real world data analysis in Python.") (base32 "0paj7vlsb0np8b5sp4bv64wxv7qk2piyp7xg29pkhdjwsbls9fnb")))) (build-system python-build-system) - (inputs `(("python-pytz" ,python-pytz))) + (propagated-inputs + `(("python-pytz" ,python-pytz))) (home-page "https://github.com/regebro/tzlocal") (synopsis "Local timezone information for Python") @@ -1155,8 +1227,6 @@ Database API 2.0T.") (base32 "0rj7r166i1dyrq0ihm5rijfmvhs8a04im28lv05c0c3v206v4rrf")))) (build-system python-build-system) - (inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:python ,python-2 ; apparently incompatible with Python 3 #:tests? #f)) @@ -1213,15 +1283,14 @@ Python 3.3+.") (define-public python-pyicu (package (name "python-pyicu") - (version "1.9.2") + (version "1.9.5") (source (origin (method url-fetch) - (uri (string-append "https://pypi.python.org/packages/source/P/PyICU/PyICU-" - version ".tar.gz")) + (uri (pypi-uri "PyICU" version)) (sha256 (base32 - "1diba0g8md614fvm9yf50paiwdkhj6rd7xwf1rg9mc0pxc0hhn4v")))) + "16rmxy9y0qhqqna2v49i7nzwm09as699rbyvh4raw7w602w55c3k")))) (build-system python-build-system) (inputs `(("icu4c" ,icu4c))) @@ -1229,14 +1298,10 @@ Python 3.3+.") (synopsis "Python extension wrapping the ICU C++ API") (description "PyICU is a python extension wrapping the ICU C++ API.") - (license license:x11) - (properties `((python2-variant . ,(delay python2-pyicu)))))) + (license license:x11))) (define-public python2-pyicu - (package - (inherit (package-with-python2 - (strip-python2-variant python-pyicu))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-pyicu)) (define-public python2-dogtail ;; Python 2 only, as it leads to "TabError: inconsistent use of tabs and @@ -1341,7 +1406,8 @@ commands.") (arguments `(#:python ,python-2 ; SyntaxError with Python 3 #:tests? #f)) ; no 'test' sub-command - (inputs `(("element-tree" ,python2-element-tree))) + (propagated-inputs + `(("element-tree" ,python2-element-tree))) (synopsis "Python and command-line interface to Bugzilla") (description "PyBugz is a Python library and command-line tool to query the Bugzilla @@ -1391,9 +1457,8 @@ backported for previous versions of Python from 2.4 to 3.3.") (base32 "0iv1c34npr4iynwpgv1vkjx9rjd18a85ir8c01gc5f7wp8iv7l1x")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-six" ,python-six) + (propagated-inputs + `(("python-six" ,python-six) ("python-parse" ,python-parse))) (arguments '(#:tests? #f)) ;TODO: tests require pytest (home-page "https://github.com/jenisys/parse_type") @@ -1468,6 +1533,7 @@ existing ones.") (arguments ;; With Python 3.x, fails to build with a syntax error. `(#:python ,python-2 + #:use-setuptools? #f ; still relies on distutils #:tests? #f)) ; no 'python setup.py test' command (home-page "http://scons.org/") (synopsis "Software construction tool written in Python") @@ -1493,8 +1559,6 @@ software.") (base32 "1h7zx4dfyclalg0fqnfjijpn0f793a9mx8sy3b27gd31nr6dhq3s")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments ;; error in setup.cfg: command 'test' has no such option 'buffer' '(#:tests? #f)) @@ -1521,8 +1585,6 @@ software.") (base32 "1hyxg09kaj02ri0rmwjqi86wk4nd1akvv7n0dx77azz76wga4s9w")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments '(#:tests? #f)) ; no setup.py test command (home-page @@ -1548,8 +1610,6 @@ matching them against a list of media-ranges.") (base32 "164a43k7k2wsqqk1s6vavcdamvss4mz0vd6pwzv2h9n8rgwzxgzi")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments '(#:tests? #f)) ; FIXME: test suite fails (home-page "http://readthedocs.org/docs/nose/") @@ -1574,9 +1634,7 @@ matching them against a list of media-ranges.") "1x4zjq1zlyrh8b9ba0cmafd3w94pxhid408kibyjd3s6h1lap6s7")))) (build-system python-build-system) (arguments `(#:tests? #f)) ; 'module' object has no attribute 'collector' - (native-inputs - `(("python-setuptools" ,python-setuptools))) - (inputs + (propagated-inputs `(("python-cov-core" ,python-cov-core) ("python-pytest-cov" ,python-pytest-cov) ("python-six" ,python-six))) @@ -1606,8 +1664,6 @@ interfaces and processes.") (base32 "00yl6lskygcrddx5zspkhr0ibgvpknl4678kkm6s626539grq93q")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pypi.python.org/pypi/unittest2") (synopsis "Python unit testing library") (description @@ -1628,8 +1684,6 @@ standard library.") (sha256 (base32 "0wbs4i4x3x7klr3v35ss6p9mcqz883i1xgcpkhvl7n2lyv6yhpda")))) - (inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:python ,python-2 #:tests? #f)))) ; no setup.py test command @@ -1670,8 +1724,6 @@ standard library.") (base32 "0561gz2w3i825gyl42mcq14y3dcgkapfiv5zv9a2bz15qxiijl56")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pylib.readthedocs.org/") (synopsis "Python library for parsing, I/O, instrospection, and logging") (description @@ -1702,10 +1754,10 @@ code introspection, and logging.") (("def test_remove_dir_prefix\\(self\\):") "@pytest.mark.xfail\n def test_remove_dir_prefix(self):"))))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-py" ,python-py) - ("python-nose" ,python-nose) + (propagated-inputs + `(("python-py" ,python-py))) + (native-inputs + `(("python-nose" ,python-nose) ("python-mock" ,python-mock))) (home-page "http://pytest.org") (synopsis "Python testing library") @@ -1755,7 +1807,17 @@ and many external plugins.") (base32 "1yl4nbhzfgsxqlsyk4clafgp9x11zvgrkprm9i2p3fgkwx9jxcm8")))) (build-system python-build-system) - (inputs + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + ;; options taken from tox.ini + ;; TODO: make "--restructuredtext" tests pass. They currently fail + ;; with "Duplicate implicit target name" + (zero? (system* "python" "./setup.py" "check" + "--strict" "--metadata"))))))) + (propagated-inputs `(("python-coverage" ,python-coverage) ("python-pytest" ,python-pytest))) (home-page "https://github.com/pytest-dev/pytest-cov") @@ -1764,15 +1826,10 @@ and many external plugins.") "Pytest-cov produces coverage reports. It supports centralised testing and distributed testing in both @code{load} and @code{each} modes. It also supports coverage of subprocesses.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-cov)))))) + (license license:expat))) (define-public python2-pytest-cov - (let ((base (package-with-python2 (strip-python2-variant python-pytest-cov)))) - (package - (inherit base) - (inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-inputs base)))))) + (package-with-python2 python-pytest-cov)) (define-public python-pytest-runner (package @@ -1805,16 +1862,10 @@ supports coverage of subprocesses.") (description "This package provides a @command{pytest-runner} command that @file{setup.py} files can use to run tests.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-runner)))))) + (license license:expat))) (define-public python2-pytest-runner - (let ((base (package-with-python2 - (strip-python2-variant python-pytest-runner)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pytest-runner)) (define-public python-pytest-mock (package @@ -1830,9 +1881,8 @@ supports coverage of subprocesses.") (build-system python-build-system) (native-inputs `(("unzip" ,unzip))) - (inputs - `(("python-py" ,python-py) - ("python-pytest" ,python-pytest))) + (propagated-inputs + `(("python-pytest" ,python-pytest))) (home-page "https://github.com/pytest-dev/pytest-mock/") (synopsis "Thin-wrapper around the mock package for easier use with py.test") (description @@ -1848,12 +1898,9 @@ same arguments.") (let ((base (package-with-python2 (strip-python2-variant python-pytest-mock)))) (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base))) - (inputs + (propagated-inputs `(("python2-mock" ,python2-mock) - ,@(package-inputs base)))))) + ,@(package-propagated-inputs base)))))) (define-public python-pytest-xdist (package @@ -1878,9 +1925,8 @@ same arguments.") (native-inputs `(("unzip" ,unzip) ("python-setuptools-scm" ,python-setuptools-scm))) - (inputs - `(("python-apipkg" ,python-apipkg) - ("python-execnet" ,python-execnet) + (propagated-inputs + `(("python-execnet" ,python-execnet) ("python-pytest" ,python-pytest) ("python-py" ,python-py))) (home-page @@ -1894,16 +1940,10 @@ to run tests repeatedly when failed, and the ability to run tests on multiple Python interpreters or platforms. It uses rsync to copy the existing program code to a remote location, executes there, and then syncs the result back.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-xdist)))))) + (license license:expat))) (define-public python2-pytest-xdist - (let ((base (package-with-python2 - (strip-python2-variant python-pytest-xdist)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pytest-xdist)) (define-public python-scripttest (package @@ -1919,9 +1959,8 @@ result back.") (base32 "0f4w84k8ck82syys7yg9maz93mqzc8p5ymis941x034v44jzq74m")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-pytest" ,python-pytest))) + (native-inputs + `(("python-pytest" ,python-pytest))) (home-page "http://pythonpaste.org/scripttest/") (synopsis "Python library to test command-line scripts") (description "Scripttest is a Python helper library for testing @@ -1947,9 +1986,7 @@ subprocess and see the output as well as any file modifications.") "1dyml28ykpl5jb9khdmcdvhy1cxqingys6qvj2k04fzlaj6z3bbx")))) (build-system python-build-system) (propagated-inputs - `(("python-mimeparse" ,python-mimeparse))) - (inputs - `(("python-setuptools" ,python-setuptools) + `(("python-mimeparse" ,python-mimeparse) ("python-extras" ,python-extras))) (home-page "https://github.com/testing-cabal/testtools") (synopsis @@ -1977,10 +2014,8 @@ compatibility.") (base32 "1671jvrvqlmbnc42j7pc5y6vc37q44aiwrq0zic652pxyy2fxvjg")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-testtools" ,python-testtools) - ("python-mimeparse" ,python-mimeparse))) + (propagated-inputs + `(("python-testtools" ,python-testtools))) (home-page "https://launchpad.net/testscenarios") (synopsis "Pyunit extension for dependency injection") (description @@ -2005,8 +2040,6 @@ style tests.") (base32 "0cbj3plbllyz42c4b5xxgwaa7mml54lakslrn4kkhinxhdri22md")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://launchpad.net/testresources") (synopsis "Pyunit extension for managing test resources") @@ -2032,11 +2065,11 @@ use of resources by test cases.") (base32 "1nkw9wfbvizmpajbj3in8ns07g7lwkiv8hip14jjlwk3cacls6jv")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-testtools" ,python-testtools) - ("python-mimeparse" ,python-mimeparse) - ("python-testscenarios" ,python-testscenarios))) + (propagated-inputs + `(("python-extras" ,python-extras) + ("python-mimeparse" ,python-mimeparse))) + (native-inputs + `(("python-testscenarios" ,python-testscenarios))) (home-page "http://launchpad.net/subunit") (synopsis "Python implementation of the subunit protocol") (description @@ -2047,96 +2080,51 @@ protocol.") (define-public python2-subunit (package-with-python2 python-subunit)) -;; Recent versions of python-fixtures need a recent version of python-pbr, -;; which needs a recent version of python-fixtures. To fix this circular -;; dependency, we keep old versions of python-fixtures and python-pbr to -;; bootstrap the whole thing: -;; - python-fixtures-0.3.16 is used to build python-pbr-0.11 -;; - python-pbr-0.11 is used to build python-fixtures -;; - python-fixtures is used to build python-pbr -(define-public python-fixtures-0.3.16 - (package - (name "python-fixtures") - (version "0.3.16") - (source - (origin - (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/f/fixtures/fixtures-" - version ".tar.gz")) - (sha256 - (base32 - "0x9r2gwilcig5g54k60bxzg96zabizq1855lrprlb4zckalp9asc")))) - (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) - (arguments - '(#:tests? #f)) ; no setup.py test command - (home-page "https://launchpad.net/python-fixtures") - (synopsis "Python test fixture library") - (description - "Fixtures provides a way to create reusable state, useful when writing -Python tests.") - (license (list license:bsd-3 license:asl2.0)))) ; at user's option - -(define-public python2-fixtures-0.3.16 - (package-with-python2 python-fixtures-0.3.16)) - -(define-public python-pbr-0.11 - (package - (name "python-pbr") - (version "0.11.0") +;; Recent versions of python-fixtures and python-testrepository need +;; python-pbr for packaging, which itself needs these two packages for +;; testing. +;; To fix this circular dependency, we use a build of python-pbr, based on the +;; same source, just without any test dependencies and with tests disabled. +;; python-pbr-minmal is then used to package python-fixtures and +;; python-testrepository. +;; Strictly speaking we currently could remove the test-requirements from the +;; normal python-pbr package (and save this package) since test are disabled +;; there anyway. But this may change in future. +(define python-pbr-minimal + (package + (name "python-pbr-minimal") + (version "1.8.1") (source (origin (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/p/pbr/pbr-" - version ".tar.gz")) + (uri (pypi-uri "pbr" version)) (sha256 (base32 - "0v9gb7gyqf7q9s99l0nnjj9ww9b0jvyqlwm4d56pcyinxydddw6p")))) + "0jcny36cf3s8ar5r4a575npz080hndnrfs4np1fqhv0ym4k7c4p2")))) (build-system python-build-system) (arguments - `(#:tests? #f)) ;; Most tests seem to use the Internet. - (inputs - `(("python-fixtures-0.3.16" ,python-fixtures-0.3.16) - ("python-pip" ,python-pip) - ("python-setuptools" ,python-setuptools))) - (home-page "https://launchpad.net/pbr") - (synopsis "Change the default behavior of Python’s setuptools") + `(#:tests? #f)) + (home-page "http://docs.openstack.org/developer/pbr/") + (synopsis "Minimal build of python-pbr used for bootstrapping") (description - "Python Build Reasonableness (PBR) is a library that injects some useful -and sensible default behaviors into your setuptools run.") + "Used only for bootstrapping python2-pbr, you should not need this.") (license license:asl2.0))) -(define-public python2-pbr-0.11 - (package-with-python2 python-pbr-0.11)) +(define python2-pbr-minimal + (package-with-python2 python-pbr-minimal)) (define-public python-pbr (package + (inherit python-pbr-minimal) (name "python-pbr") - (version "1.8.1") - (source - (origin - (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/p/pbr/pbr-" - version - ".tar.gz")) - (sha256 - (base32 - "0jcny36cf3s8ar5r4a575npz080hndnrfs4np1fqhv0ym4k7c4p2")))) - (build-system python-build-system) (arguments `(#:tests? #f)) ;; Most tests seem to use the Internet. (propagated-inputs - `(("python-testrepository" ,python-testrepository) - ("git" ,git))) ;; pbr actually uses the "git" binary. - (inputs + `(("git" ,git))) ;; pbr actually uses the "git" binary. + (native-inputs `(("python-fixtures" ,python-fixtures) - ("python-mimeparse" ,python-mimeparse) + ;; discover, coverage, hacking, subunit ("python-mock" ,python-mock) - ("python-setuptools" ,python-setuptools) ("python-six" ,python-six) ("python-sphinx" ,python-sphinx) ("python-testrepository" ,python-testrepository) @@ -2144,12 +2132,13 @@ and sensible default behaviors into your setuptools run.") ("python-testscenarios" ,python-testscenarios) ("python-testtools" ,python-testtools) ("python-virtualenv" ,python-virtualenv))) - (home-page "https://launchpad.net/pbr") - (synopsis "Change the default behavior of Python’s setuptools") + (synopsis "Enhance the default behavior of Python’s setuptools") (description "Python Build Reasonableness (PBR) is a library that injects some useful -and sensible default behaviors into your setuptools run.") - (license license:asl2.0))) +and sensible default behaviors into your setuptools run. It will set +versions, process requirements files and generate AUTHORS and ChangeLog file +from git information. +"))) (define-public python2-pbr (package-with-python2 python-pbr)) @@ -2167,15 +2156,10 @@ and sensible default behaviors into your setuptools run.") "0djxvdwm8s60dbfn7bhf40x6g818p3b3mlwijm1c3bqg7msn271y")))) (build-system python-build-system) (propagated-inputs - `(("python-six" ,python-six) - ("python-pbr-0.11" ,python-pbr-0.11))) - (inputs - `(("python-pip" ,python-pip) - ("python-setuptools" ,python-setuptools) - ;; Tests + `(("python-six" ,python-six))) + (native-inputs + `(("python-pbr-minimal" ,python-pbr-minimal) ("python-testtools" ,python-testtools))) - (arguments - '(#:tests? #f)) ; no setup.py test command (home-page "https://launchpad.net/python-fixtures") (synopsis "Python test fixture library") (description @@ -2201,11 +2185,11 @@ Python tests.") "1ssqb07c277010i6gzzkbdd46gd9mrj0bi0i8vn560n2k2y4j93m")))) (build-system python-build-system) (propagated-inputs - `(("python-fixtures-0.3.16" ,python-fixtures-0.3.16) - ("python-testtools" ,python-testtools))) - (inputs - `(("python-setuptools" ,python-setuptools) + `(("python-fixtures" ,python-fixtures) ("python-subunit" ,python-subunit) + ("python-testtools" ,python-testtools))) + (native-inputs + `(("python-pbr-minimal" ,python-pbr-minimal) ;; same as for building fixture ("python-mimeparse" ,python-mimeparse))) (home-page "https://launchpad.net/testrepository") (synopsis "Database for Python test results") @@ -2229,8 +2213,6 @@ have failed since the last commit or what tests are currently failing.") (base32 "01rbr4br4lsk0lwn8fb96zwd2xr4f0mg1w7iq3j11i8f5ig2nqs1")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://nedbatchelder.com/code/coverage") (synopsis "Code coverage measurement for Python") (description @@ -2255,22 +2237,17 @@ executed.") (base32 "0k3np9ymh06yv1ib96sb6wfsxjkqhmik8qfsn119vnhga9ywc52a")))) (build-system python-build-system) - (native-inputs + (propagated-inputs `(("python-coverage" ,python-coverage))) (home-page "https://github.com/schlamar/cov-core") (synopsis "plugin core for use by pytest-cov, nose-cov and nose2-cov") (description "This is a library package for use by pytest-cov, nose-cov and nose2-cov. It is useful for developing coverage plugins for these testing frameworks.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-cov-core)))))) + (license license:expat))) (define-public python2-cov-core - (let ((cov-core (package-with-python2 (strip-python2-variant python-cov-core)))) - (package (inherit cov-core) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs cov-core)))))) + (package-with-python2 python-cov-core)) (define-public python-discover (package @@ -2286,8 +2263,6 @@ It is useful for developing coverage plugins for these testing frameworks.") (base32 "0y8d0zwiqar51kxj8lzmkvwc3b8kazb04gk5zcb4nzg5k68zmhq5")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pypi.python.org/pypi/discover/") (synopsis "Python test discovery for unittest") @@ -2310,9 +2285,8 @@ backported from Python 2.7 for Python 2.4+.") (base32 "1iypp6z46r19n4xmgx6m1lwmlpfjh8vapq8izigrqlaarvp2y64c")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-six" ,python-six) + (propagated-inputs + `(("python-six" ,python-six) ("python-parse" ,python-parse) ("python-parse-type" ,python-parse-type))) (arguments `(#:tests? #f)) ;TODO: tests require nose>=1.3 and @@ -2338,8 +2312,6 @@ tests written in a natural language style, backed up by Python code.") (base32 "1b90jf6m9vxh9nanhpyvqdq7hmfx5iggw1l8kq10jrs6xgr49qkr")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments `(#:tests? #f)) ; no tests (home-page "https://github.com/ianare/exif-py") (synopsis "Python library to extract EXIF data from image files") @@ -2362,8 +2334,6 @@ files.") (base32 "1m0fs6897vxfkf7awah5i66i7b7smm5fnywf1w50fpzyfbfhr156")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments `(#:tests? #f)) ; no tests (home-page "http://github.com/digitalbazaar/pyld") (synopsis "Python implementation of the JSON-LD specification") @@ -2385,8 +2355,6 @@ files.") (base32 "06c9dcyv8ss050gkv5xjivbxhm6qm0s9vzy4r33wqabgv118lw7p")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments `(#:tests? #f)) ; no tests (home-page "http://python-requests.org/") (synopsis "Python CA certificate bundle") @@ -2421,8 +2389,6 @@ is used by the Requests library to verify HTTPS requests.") (("'locale'") (string-append "'" glibc "/bin/locale'")))) #t))))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://click.pocoo.org") (synopsis "Command line library for Python") (description @@ -2448,8 +2414,7 @@ with sensible defaults out of the box.") "0j0n38hg1jvrmyy68f9ikvzq1gs9g0sx4ws7maf8wi3bwbbqmfqy")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-jsonschema" ,python-jsonschema) + `(("python-jsonschema" ,python-jsonschema) ("python-pytest-cov" ,python-pytest-cov))) (home-page "https://bitbucket.org/pypa/wheel/") (synopsis "Format for built Python packages") @@ -2484,8 +2449,7 @@ installed with a newer @code{pip} or with wheel's own command line utility.") "0zsqrzlybf25xscgi7ja4s48y2abf9wvjkn47wh984qgs1fq2xy5")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-py" ,python-py) + `(("python-py" ,python-py) ("python-pytest" ,python-pytest) ("python-pytest-cov" ,python-pytest-cov) ("python-wheel" ,python-wheel))) @@ -2528,15 +2492,10 @@ than Python’s urllib2 library.") information in a variety of version control systems in order to discover version numbers.") (home-page "https://github.com/habnabit/vcversioner") - (license license:isc) - (properties `((python2-variant . ,(delay python2-vcversioner)))))) + (license license:isc))) (define-public python2-vcversioner - (let ((vcversioner (package-with-python2 - (strip-python2-variant python-vcversioner)))) - (package (inherit vcversioner) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs vcversioner)))))) + (package-with-python2 python-vcversioner)) (define-public python-jsonschema (package @@ -2572,11 +2531,38 @@ version numbers.") (package (inherit jsonschema) (native-inputs `(("python2-mock" ,python2-mock) - ("python2-setuptools" ,python2-setuptools) ,@(package-native-inputs jsonschema))) (propagated-inputs `(("python2-functools32" ,python2-functools32)))))) +(define-public python-kitchen + (package + (name "python-kitchen") + (version "1.2.4") + (source + (origin + (method url-fetch) + (uri (pypi-uri "kitchen" version)) + (sha256 + (base32 + "0ggv3p4x8jvmmzhp0xm00h6pvh1g0gmycw71rjwagnrj8n23vxrq")))) + (build-system python-build-system) + (propagated-inputs + `(("python-chardet" ,python-chardet))) + (home-page "https://fedorahosted.org/kitchen") + (synopsis "Python API for snippets") + (description "@code{kitchen} module provides a python API for all sorts of +little useful snippets of code that everybody ends up writing for their projects +but never seem big enough to build an independent release. Use kitchen and stop +cutting and pasting that code over and over.") + (license (list license:lgpl2.1+ + ;; subprocess.py, test_subprocess.py, + ;; kitchen/pycompat25/defaultdict.py: + license:psfl)))) + +(define-public python2-kitchen + (package-with-python2 python-kitchen)) + (define-public python-unidecode (package (name "python-unidecode") @@ -2588,8 +2574,6 @@ version numbers.") (base32 "12hhblqy1ajvidm38im4171x4arg83pfmziyn53nizp29p3m14gi")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://pypi.python.org/pypi/Unidecode") (synopsis "ASCII transliterations of Unicode text") (description @@ -2616,10 +2600,9 @@ somewhat intelligeble.") "1556v2jppd8mjkkj66pxb5rcazm35jq81r233mdl8hfmz9n3icp1")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) + `(("python-pytest" ,python-pytest) + ("python-pytest-cov" ,python-pytest-cov) ("python-pytest-runner" ,python-pytest-runner))) - (arguments - '(#:tests? #f)) ; test suite doesn't work (home-page "http://github.com/progrium/pyjwt") (synopsis "JSON Web Token implementation in Python") (description @@ -2641,13 +2624,10 @@ somewhat intelligeble.") "1bfrj70vdjxjw74khbyh6f0dksv7p5rh2346jnlrffyacd3gwjzg")))) (build-system python-build-system) (native-inputs - `(("python-coverage" ,python-coverage) - ("python-nose" ,python-nose) - ("python-mock" ,python-mock))) - (inputs - `(("python-blinker" ,python-blinker) + `(("python-nose" ,python-nose) ("python-cryptography" ,python-cryptography) - ("python-pyjwt" ,python-pyjwt))) + ("python-pyjwt" ,python-pyjwt) + ("python-blinker" ,python-blinker))) (home-page "https://github.com/idan/oauthlib") (synopsis "OAuth implementation for Python") (description @@ -2660,8 +2640,8 @@ OAuth request-signing logic.") (let ((base (package-with-python2 (strip-python2-variant python-oauthlib)))) (package (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2) + (native-inputs `(("python2-unittest2" ,python2-unittest2) + ("python2-mock" ,python2-mock) ,@(package-native-inputs base)))))) (define-public python-itsdangerous @@ -2683,35 +2663,25 @@ OAuth request-signing logic.") (description "Itsdangerous provides various helpers to pass trusted data to untrusted environments and back.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-itsdangerous)))))) + (license license:bsd-3))) (define-public python2-itsdangerous - (let ((base (package-with-python2 - (strip-python2-variant python-itsdangerous)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-itsdangerous)) (define-public python-pyyaml (package (name "python-pyyaml") - (version "3.11") + (version "3.12") (source (origin (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/P/PyYAML/PyYAML-" - version ".tar.gz")) + (uri (pypi-uri "PyYAML" version)) (sha256 (base32 - "1s26125vfnskng58ym37xhwv8v0mm95b2cwbjfag8prfhy596v63")))) + "1aqjl8dk9amd4zr99n8v2qxzgmr2hdvqfma4zh7a41rj6336c9sr")))) (build-system python-build-system) (inputs `(("libyaml" ,libyaml))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pyyaml.org/wiki/PyYAML") (synopsis "YAML parser and emitter for Python") (description @@ -2747,9 +2717,8 @@ object.") (substitute* "tests/test_virtualenv.py" (("skipif.*") "skipif(True, reason=\"Guix\")\n")) (zero? (system* "py.test"))))))) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-mock" ,python-mock) + (native-inputs + `(("python-mock" ,python-mock) ("python-pytest" ,python-pytest))) (home-page "https://virtualenv.pypa.io/") (synopsis "Virtual Python environment builder") @@ -2774,8 +2743,6 @@ object.") (base32 "1hvip33wva3fnmvfp9x5klqri7hpl1hkgqmjbss18nmrb7zimv54")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://github.com/mitsuhiko/markupsafe") (synopsis "XML/HTML/XHTML markup safe string implementation for Python") (description @@ -2798,9 +2765,8 @@ for Python.") (base32 "1x0v41lp5m1pjix3l46zx02b7lqp2hflgpnxwkywxynvi3zz47xw")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-markupsafe" ,python-markupsafe))) + (propagated-inputs + `(("python-markupsafe" ,python-markupsafe))) (home-page "http://jinja.pocoo.org/") (synopsis "Python template engine") (description @@ -2822,8 +2788,6 @@ written in pure Python.") (base32 "0nmqsfmiw4arjxqkmf9z66ml950pcdjk6aq4gin4sywmzdjw5fzp")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://defunkt.io/pystache/") (synopsis "Python logic-less template engine") (description @@ -2843,7 +2807,15 @@ logic-free templating system Mustache.") (uri (pypi-uri "joblib" version)) (sha256 (base32 - "0787k919zlfmgymprz5bzv0v1df5bbirlf3awrghmjgvkrd9dci9")))) + "0787k919zlfmgymprz5bzv0v1df5bbirlf3awrghmjgvkrd9dci9")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-compiled .pyc files from source. + (for-each delete-file-recursively + (find-files "." "__pycache__" #:directories? #t)) + (for-each delete-file (find-files "." "\\.pyc$")) + #t)))) (build-system python-build-system) (arguments `(#:phases @@ -2864,9 +2836,9 @@ logic-free templating system Mustache.") (("def test_parallel_with_interactively_defined_functions" line) (string-append "@SkipTest\n" line))) #t))))) + ;; Provide nose to enable tests command (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-nose" ,python-nose) + `(("python-nose" ,python-nose) ("python-sphinx" ,python-sphinx) ("python-docutils" ,python-docutils) ("python-numpydoc" ,python-numpydoc))) @@ -2885,19 +2857,15 @@ logging and tracing of the execution.") (define-public python-docutils (package (name "python-docutils") - (version "0.12") + (version "0.13.1") (source (origin (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/d/docutils/docutils-" - version ".tar.gz")) + (uri (pypi-uri "docutils" version)) (sha256 (base32 - "1ylnjnw1x4b2y7blr6x35ncdzn69k253kw4cdkv6asdb21w73ny7")))) + "1gkma47i609jfs7dssxn4y9vsz06qi0l5q41nws0zgkpnrghz33i")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments '(#:tests? #f)) ; no setup.py test command (home-page "http://docutils.sourceforge.net/") @@ -2916,17 +2884,15 @@ reStructuredText.") (define-public python-pygments (package (name "python-pygments") - (version "2.0.2") + (version "2.1.3") (source (origin (method url-fetch) (uri (pypi-uri "Pygments" version)) (sha256 (base32 - "0lagrwifsgn0s8bzqahpr87p7gd38xja8f06akscinp6hj89283k")))) + "10axnp2wpjnq9g8wg53fx0c70dfxqrz498jyz8mrdx9a3flwir48")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pygments.org/") (synopsis "Syntax highlighting") (description @@ -2950,9 +2916,8 @@ reStructuredText.") (base32 "011xizm3jnmf4cvs5i6kgf6c5nn046h79i8j0vd0f27yw9j3p4wl")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-jinja2" ,python-jinja2) + (propagated-inputs + `(("python-jinja2" ,python-jinja2) ("python-docutils" ,python-docutils) ("python-pygments" ,python-pygments))) (home-page "http://sphinx-doc.org/") @@ -2979,17 +2944,6 @@ sources.") (base32 "19nw3rn7awplcdrz63kg1njqwkbymfg9lwn7l2grhdyhyr2gaa8g")))) (build-system python-build-system) - (arguments - `(;; With standard flags, the install phase attempts to create a zip'd - ;; egg file, and fails with an error: 'ZIP does not support timestamps - ;; before 1980' - #:configure-flags '("--single-version-externally-managed" - "--record=sphinx-rtd-theme.txt"))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) - (inputs - `(("python-docutils" ,python-docutils) - ("python-sphinx" ,python-sphinx))) (home-page "https://github.com/snide/sphinx_rtd_theme/") (synopsis "ReadTheDocs.org theme for Sphinx") (description "A theme for Sphinx used by ReadTheDocs.org.") @@ -2998,6 +2952,36 @@ sources.") (define-public python2-sphinx-rtd-theme (package-with-python2 python-sphinx-rtd-theme)) +(define-public python-rst.linker + (package + (name "python-rst.linker") + (version "1.7") + (source + (origin + (method url-fetch) + (uri (pypi-uri "rst.linker" version)) + (sha256 + (base32 + "0bh4lnj2p1nh0wf5pgxgfbrp27xhb1rinahkb5j7s3qprq6qn0sr")))) + (build-system python-build-system) + (propagated-inputs + `(("python-dateutil" ,python-dateutil-2) + ("python-six" ,python-six))) + (native-inputs + `(("python-setuptools-scm" ,python-setuptools-scm))) + ;; Test would require path.py, which would introduce a cyclic dependence. + (arguments `(#:tests? #f)) + ;; Note: As of version 1.7 the documentation is not worth building. + (home-page "https://github.com/jaraco/rst.linker") + (synopsis "Sphinx plugin to add links and timestamps") + (description "rst.linker allows to automatically replace text by a +reStructuredText external reference or timestamps. It's primary purpose is to +augment the changelog, but it can be used for other documents, too.") + (license license:expat))) + +(define-public python2-rst.linker + (package-with-python2 python-rst.linker)) + (define-public python-feedgenerator (package (name "python-feedgenerator") @@ -3008,11 +2992,18 @@ sources.") (uri (pypi-uri "feedgenerator" version)) (sha256 (base32 - "0mkimp1fpdan4p3882vzcws4l594k71ich4g0wq97jbra7p602n0")))) + "0mkimp1fpdan4p3882vzcws4l594k71ich4g0wq97jbra7p602n0")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-compiled .pyc files from source. + (for-each delete-file-recursively + (find-files "." "__pycache__" #:directories? #t)) + (for-each delete-file (find-files "." "\\.pyc$")) + #t)))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-pytz" ,python-pytz) + (propagated-inputs + `(("python-pytz" ,python-pytz) ("python-six" ,python-six))) (home-page "https://github.com/getpelican/feedgenerator") (synopsis @@ -3037,11 +3028,6 @@ which can produce feeds in RSS 2.0, RSS 0.91, and Atom formats.") (base32 "1dpq0vb01p36jjwbhhd08ylvrnyvcc82yxx3mwjx6awrycjyw6j7")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) - ;; No "test" command supplied to setuptools, so unless there's another way - ;; to run tests, we're skipping them! - (arguments '(#:tests? #f)) (home-page "http://pythonhosted.org/blinker/") (synopsis "Fast, simple object-to-object and broadcast signaling") (description @@ -3064,7 +3050,7 @@ interested parties to subscribe to events, or \"signals\".") (base32 "1hn94rb4q3zmcq16in055xikal4dba5hfx3zznq7warllcgc9f8k")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-feedgenerator" ,python-feedgenerator) ("python-jinja2" ,python-jinja2) ("python-pygments" ,python-pygments) @@ -3100,7 +3086,7 @@ and is very extensible.") (define-public python-scikit-learn (package (name "python-scikit-learn") - (version "0.16.1") + (version "0.18.1") (source (origin (method url-fetch) @@ -3110,7 +3096,7 @@ and is very extensible.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "140skabifgc7lvvj873pnzlwx0ni6q8qkrsyad2ccjb3h8rxzkih")))) + "1hwswckdmd27f7k1jvwdc0m4mqrgxl2s245yq1scq34v124bjqgq")))) (build-system python-build-system) (arguments `(#:phases @@ -3118,20 +3104,12 @@ and is very extensible.") 'check 'set-HOME ;; some tests require access to "$HOME" (lambda _ (setenv "HOME" "/tmp")) - ;; Tests can only be run after the library has been installed and not - ;; within the source directory. - (alist-cons-after - 'install 'check - (lambda _ - (with-directory-excursion "/tmp" - ;; With Python 3 one test of 3334 fails - ;; (sklearn.tests.test_common.test_transformers); see - ;; https://github.com/scikit-learn/scikit-learn/issues/3693 - (system* "nosetests" "-v" "sklearn"))) - (alist-delete 'check %standard-phases))))) + %standard-phases))) (inputs - `(("openblas" ,openblas) - ("python-nose" ,python-nose))) + `(("openblas" ,openblas))) + (native-inputs + `(("python-nose" ,python-nose) + ("python-cython" ,python-cython))) (propagated-inputs `(("python-numpy" ,python-numpy) ("python-scipy" ,python-scipy))) @@ -3140,11 +3118,10 @@ and is very extensible.") (description "Scikit-learn provides simple and efficient tools for data mining and data analysis.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-scikit-learn)))))) + (license license:bsd-3))) (define-public python2-scikit-learn - (package-with-python2 (strip-python2-variant python-scikit-learn))) + (package-with-python2 python-scikit-learn)) (define-public python-scikit-image (package @@ -3159,33 +3136,24 @@ mining and data analysis.") (sha256 (base32 "0jz416fqvpahqyffw8plmszzfj669w8wvf3y9clnr5lr6a7md3kn")))) (build-system python-build-system) + ;; See DEPENDS.txt for the list of build and run time requiremnts (propagated-inputs `(("python-matplotlib" ,python-matplotlib) ("python-networkx" ,python-networkx) - ("python-numpy" ,python-numpy) ("python-scipy" ,python-scipy) - ("python-six" ,python-six) ("python-pillow" ,python-pillow))) (native-inputs - `(("python-cython" ,python-cython) - ("python-setuptools" ,python-setuptools))) + `(("python-numpy" ,python-numpy) + ("python-cython" ,python-cython) + ("python-six" ,python-six))) (home-page "http://scikit-image.org/") (synopsis "Image processing in Python") (description "Scikit-image is a collection of algorithms for image processing.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-scikit-image)))))) + (license license:bsd-3))) (define-public python2-scikit-image - (let ((scikit-image (package-with-python2 - (strip-python2-variant python-scikit-image)))) - (package (inherit scikit-image) - (native-inputs - `(("python2-mock" ,python2-mock) - ,@(package-native-inputs scikit-image))) - (propagated-inputs - `(("python2-pytz" ,python2-pytz) - ,@(package-propagated-inputs scikit-image)))))) + (package-with-python2 python-scikit-image)) (define-public python-redis (package @@ -3202,9 +3170,9 @@ mining and data analysis.") (build-system python-build-system) ;; Tests require a running Redis server (arguments '(#:tests? #f)) - (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-pytest" ,python-pytest))) + ;; As long as we are not running test, we do not need this input :-) + ;;(native-inputs + ;; `(("python-pytest" ,python-pytest))) (home-page "https://github.com/andymccurdy/redis-py") (synopsis "Redis Python client") (description @@ -3230,8 +3198,6 @@ mining and data analysis.") (propagated-inputs `(("python-click" ,python-click) ("python-redis" ,python-redis))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://python-rq.org/") (synopsis "Simple job queues for Python") (description @@ -3297,8 +3263,7 @@ writing C extensions for Python as easy as Python itself.") (build-system python-build-system) (arguments `(#:python ,python-2)) (native-inputs - `(("python2-pytest" ,python2-pytest) ; needed for running tests - ("python2-setuptools" ,python2-setuptools))) + `(("python2-pytest" ,python2-pytest))) ; needed for running tests (home-page "https://rpython.readthedocs.org") (synopsis "Framework for implementing interpreters and virtual machines") (description "RPython is a translation and support framework for @@ -3322,16 +3287,16 @@ between language specification and implementation aspects.") "1bjjhvncraka5s6i4lg644jrxij6bvycxy7an20gcz3a0m11iygp")))) (build-system python-build-system) (inputs - `(("python-nose" ,python-nose) - ("openblas" ,openblas) + `(("openblas" ,openblas) ("lapack" ,lapack))) (native-inputs - `(("gfortran" ,gfortran))) + `(("python-nose" ,python-nose) + ("gfortran" ,gfortran))) (arguments `(#:phases - (alist-cons-before - 'build 'set-environment-variables - (lambda* (#:key inputs #:allow-other-keys) + (modify-phases %standard-phases + (add-before 'build 'set-environment-variables + (lambda* (#:key inputs #:allow-other-keys) (call-with-output-file "site.cfg" (lambda (port) (format port @@ -3340,7 +3305,8 @@ libraries = openblas library_dirs = ~a/lib include_dirs = ~a/include -[lapack] +# backslash-n to make emacs happy +\n[lapack] lapack_libs = lapack library_dirs = ~a/lib include_dirs = ~a/include @@ -3353,18 +3319,17 @@ include_dirs = ~a/include (substitute* "numpy/distutils/system_info.py" (("c = distutils\\.ccompiler\\.new_compiler\\(\\)") "c = distutils.ccompiler.new_compiler(); c.set_executables(compiler='gcc',compiler_so='gcc',linker_exe='gcc',linker_so='gcc -shared')")) - #t) + #t)) ;; Tests can only be run after the library has been installed and not ;; within the source directory. - (alist-cons-after - 'install 'check - (lambda _ + (delete 'check) + (add-after 'install 'check + (lambda* (#:key outputs inputs #:allow-other-keys) + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) (with-directory-excursion "/tmp" (zero? (system* "python" "-c" - "import numpy; numpy.test(verbose=2)")))) - (alist-delete - 'check - %standard-phases))))) + "import numpy; numpy.test(verbose=2)")))))))) (home-page "http://www.numpy.org/") (synopsis "Fundamental package for scientific computing with Python") (description "NumPy is the fundamental package for scientific computing @@ -3377,17 +3342,38 @@ capabilities.") (define python2-numpy-bootstrap (package-with-python2 python-numpy-bootstrap)) +(define-public python-munch + (package + (name "python-munch") + (version "2.0.4") + (source + (origin + (method url-fetch) + (uri (pypi-uri "munch" version)) + (sha256 + (base32 + "1cmqg91xnqx8gvnh4pmp0bfl1dfcm65d5p9mg73zz8pkjhx6h80l")))) + (build-system python-build-system) + (home-page "https://github.com/Infinidat/munch") + (synopsis "Dot-accessible dictionary") + (description "Munch is a dot-accessible dictionary similar to JavaScript +objects.") + (license license:expat))) + +(define-public python2-munch + (package-with-python2 python-munch)) + (define-public python2-fastlmm (package (name "python2-fastlmm") - (version "0.2.21") + (version "0.2.26") (source (origin (method url-fetch) (uri (pypi-uri "fastlmm" version ".zip")) (sha256 (base32 - "1q8c34rpmwkfy3r4d5172pzdkpfryj561897z9r3x22gq7813x1m")))) + "0yxrx9xzai4fyrsi7c2p31kxvpq9czmv1p0wax5ic07m6izbszxg")))) (build-system python-build-system) (arguments `(#:python ,python-2)) ; only Python 2.7 is supported @@ -3397,12 +3383,11 @@ capabilities.") ("python2-matplotlib" ,python2-matplotlib) ("python2-pandas" ,python2-pandas) ("python2-scikit-learn" ,python2-scikit-learn) - ("python2-cython" ,python2-cython) ("python2-pysnptools" ,python2-pysnptools))) (native-inputs `(("unzip" ,unzip) - ("python2-mock" ,python2-mock) - ("python2-setuptools" ,python2-setuptools))) + ("python2-cython" ,python2-cython) + ("python2-mock" ,python2-mock))) (home-page "http://research.microsoft.com/en-us/um/redmond/projects/mscompbio/fastlmm/") (synopsis "Perform genome-wide association studies on large data sets") (description @@ -3417,14 +3402,15 @@ association studies (GWAS) on extremely large data sets.") (outputs '("out" "doc")) (inputs `(("which" ,which) - ("python-setuptools" ,python-setuptools) - ("python-matplotlib" ,python-matplotlib) - ("python-sphinx" ,python-sphinx) - ("python-pyparsing" ,python-pyparsing) - ("python-numpydoc" ,python-numpydoc) ,@(package-inputs python-numpy-bootstrap))) + (propagated-inputs + `(("python-matplotlib" ,python-matplotlib) + ("python-pyparsing" ,python-pyparsing) + ,@(package-propagated-inputs python-numpy-bootstrap))) (native-inputs `(("pkg-config" ,pkg-config) + ("python-sphinx" ,python-sphinx) + ("python-numpydoc" ,python-numpydoc) ("texlive" ,texlive) ("texinfo" ,texinfo) ("perl" ,perl) @@ -3435,7 +3421,10 @@ association studies (GWAS) on extremely large data sets.") ((#:phases phases) `(alist-cons-after 'install 'install-doc - (lambda* (#:key outputs #:allow-other-keys) + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Make installed package available for building the + ;; documentation + (add-installed-pythonpath inputs outputs) (let* ((data (string-append (assoc-ref outputs "doc") "/share")) (doc (string-append data "/doc/" ,name "-" @@ -3471,6 +3460,33 @@ association studies (GWAS) on extremely large data sets.") (define-public python2-numpy (package-with-python2 python-numpy)) +(define-public python-pygit2 + (package + (name "python-pygit2") + (version "0.24.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "pygit2" version)) + (sha256 + (base32 + "0shnafv9zc483wmcr4fzgvirg1qzz42xpdqd4a3ad39sdj1qbbia")))) + (build-system python-build-system) + (propagated-inputs + `(("python-six" ,python-six) + ("python-cffi" ,python-cffi) + ("libgit2" ,libgit2) + ("python-tox" ,python-tox))) + (home-page "https://github.com/libgit2/pygit2") + (synopsis "Python bindings for libgit2") + (description "Pygit2 is a set of Python bindings to the libgit2 shared +library, libgit2 implements Git plumbing.") + ;; GPL2.0 only, with linking exception. + (license license:gpl2))) + +(define-public python2-pygit2 + (package-with-python2 python-pygit2)) + (define-public python-pyparsing (package (name "python-pyparsing") @@ -3542,11 +3558,10 @@ that client code uses to construct the grammar directly in Python code.") (substitute* "numpydoc/tests/test_plot_directive.py" (("3") "2")))))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-docutils" ,python-docutils) - ("python-sphinx" ,python-sphinx) - ("python-nose" ,python-nose))) + (propagated-inputs + `(("python-sphinx" ,python-sphinx))) + (native-inputs + `(("python-nose" ,python-nose))) (home-page "https://pypi.python.org/pypi/numpydoc") (synopsis "Numpy's Sphinx extensions") @@ -3560,14 +3575,14 @@ that client code uses to construct the grammar directly in Python code.") (define-public python-numexpr (package (name "python-numexpr") - (version "2.6.0") + (version "2.6.1") (source (origin (method url-fetch) (uri (pypi-uri "numexpr" version)) (sha256 (base32 - "0i6iagl2hhbr8q4qzbbjd859v5806vqylq87fq7pi914ps6d6cag")))) + "01lsja72m32z0i5p8rwxbfyzk4mplh72k2a140nwh8vv4wpyfbnv")))) (build-system python-build-system) (arguments `(#:tests? #f)) ; no tests included (propagated-inputs @@ -3581,11 +3596,10 @@ doing the same calculation in Python. In addition, its multi-threaded capabilities can make use of all your cores, which may accelerate computations, most specially if they are not memory-bounded (e.g. those using transcendental functions).") - (license license:expat) - (properties `((python2-variant . ,(delay python2-numexpr)))))) + (license license:expat))) (define-public python2-numexpr - (package-with-python2 (strip-python2-variant python-numexpr))) + (package-with-python2 python-numexpr)) (define-public python-matplotlib (package @@ -3608,6 +3622,11 @@ transcendental functions).") ("python-pygobject" ,python-pygobject) ("gobject-introspection" ,gobject-introspection) ("python-tkinter" ,python "tk") + ("python-dateutil" ,python-dateutil-2) + ("python-numpy" ,python-numpy-bootstrap) + ("python-pillow" ,python-pillow) + ("python-pytz" ,python-pytz) + ("python-six" ,python-six) ;; The 'gtk+' package (and 'gdk-pixbuf', 'atk' and 'pango' propagated ;; from 'gtk+') provides the required 'typelib' files used by ;; 'gobject-introspection'. The location of these files is set with the @@ -3624,21 +3643,11 @@ transcendental functions).") ("python-pycairo" ,python-pycairo) ("python-cairocffi" ,python-cairocffi))) (inputs - `(("python-setuptools" ,python-setuptools) - ("python-dateutil" ,python-dateutil-2) - ("python-six" ,python-six) - ("python-pytz" ,python-pytz) - ("python-numpy" ,python-numpy-bootstrap) - ("python-sphinx" ,python-sphinx) - ("python-numpydoc" ,python-numpydoc) - ("python-nose" ,python-nose) - ("python-mock" ,python-mock) - ("libpng" ,libpng) + `(("libpng" ,libpng) ("imagemagick" ,imagemagick) ("freetype" ,freetype) ("cairo" ,cairo) ("glib" ,glib) - ("python-pillow" ,python-pillow) ;; FIXME: Add backends when available. ;("python-wxpython" ,python-wxpython) ;("python-pyqt" ,python-pyqt) @@ -3646,6 +3655,10 @@ transcendental functions).") ("tk" ,tk))) (native-inputs `(("pkg-config" ,pkg-config) + ("python-sphinx" ,python-sphinx) + ("python-numpydoc" ,python-numpydoc) + ("python-nose" ,python-nose) + ("python-mock" ,python-mock) ("texlive" ,texlive) ("texinfo" ,texinfo))) (arguments @@ -3670,11 +3683,14 @@ backend = TkAgg~%" (assoc-ref inputs "tk")))))) (alist-cons-after 'install 'install-doc - (lambda* (#:key outputs #:allow-other-keys) + (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((data (string-append (assoc-ref outputs "doc") "/share")) (doc (string-append data "/doc/" ,name "-" ,version)) (info (string-append data "/info")) (html (string-append doc "/html"))) + ;; Make installed package available for building the + ;; documentation + (add-installed-pythonpath inputs outputs) (with-directory-excursion "doc" ;; Produce pdf in 'A4' format. (substitute* (find-files "." "conf\\.py") @@ -3744,15 +3760,11 @@ toolkits.") (propagated-inputs `(("python2-numpy" ,python2-numpy) ("python2-scipy" ,python2-scipy) - ("python2-pytz" ,python2-pytz) - ("python2-cython" ,python2-cython))) - (inputs - `(("python2-dateutil-2" ,python2-dateutil-2) - ("python2-pandas" ,python2-pandas) - ("python2-six" ,python2-six))) + ("python2-pandas" ,python2-pandas))) (native-inputs - `(("unzip" ,unzip) - ("python2-setuptools" ,python2-setuptools))) + `(("python2-cython" ,python2-cython))) + (native-inputs + `(("unzip" ,unzip))) (home-page "http://research.microsoft.com/en-us/um/redmond/projects/mscompbio/") (synopsis "Library for reading and manipulating genetic data") (description @@ -3774,15 +3786,15 @@ operators such as union, intersection, and difference.") (base32 "0nhan2qvrw7b7gg5zddwa22kybdv3x1g26vkd7q8lvnkgzrs4dga")))) (build-system python-build-system) + (propagated-inputs + `(("python-six" ,python-six))) (inputs - `(("python-six" ,python-six) - ("readline" ,readline) + `(("readline" ,readline) ("icu4c" ,icu4c) ("pcre" ,pcre) ("r" ,r))) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("zlib" ,zlib))) + `(("zlib" ,zlib))) (home-page "http://rpy.sourceforge.net/") (synopsis "Python interface to the R language") (description "rpy2 is a redesign and rewrite of rpy. It is providing a @@ -3839,7 +3851,9 @@ functions.") libraries = openblas library_dirs = ~a/lib include_dirs = ~a/include -[atlas] + +# backslash-n to make emacs happy +\n[atlas] library_dirs = ~a/lib atlas_libs = openblas " @@ -3849,11 +3863,14 @@ atlas_libs = openblas #t) (alist-cons-after 'install 'install-doc - (lambda* (#:key outputs #:allow-other-keys) + (lambda* (#:key inputs outputs #:allow-other-keys) (let* ((data (string-append (assoc-ref outputs "doc") "/share")) (doc (string-append data "/doc/" ,name "-" ,version)) (html (string-append doc "/html")) (pyver ,(string-append "PYVER="))) + ;; Make installed package available for building the + ;; documentation + (add-installed-pythonpath inputs outputs) (with-directory-excursion "doc" ;; Fix generation of images for mathematical expressions. (substitute* (find-files "source" "conf\\.py") @@ -3977,16 +3994,10 @@ simple and Pythonic domain language.") (description "@code{pycodestyle} (formerly pep8) is a tool to check Python code against some of the style conventions in @url{http://www.python.org/dev/peps/pep-0008/,PEP 8}.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pycodestyle)))))) + (license license:expat))) (define-public python2-pycodestyle - (let ((base (package-with-python2 (strip-python2-variant - python-pycodestyle)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pycodestyle)) (define-public python-orderedmultidict (package @@ -4019,16 +4030,10 @@ Python code against some of the style conventions in dictionaries. A multivalue dictionary is a dictionary that can store multiple values for the same key. An ordered multivalue dictionary is a multivalue dictionary that retains the order of insertions and deletions.") - (license license:unlicense) - (properties `((python2-variant . ,(delay python2-orderedmultidict)))))) + (license license:unlicense))) (define-public python2-orderedmultidict - (let ((base (package-with-python2 (strip-python2-variant - python-orderedmultidict)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-orderedmultidict)) (define-public python-furl (package @@ -4051,16 +4056,10 @@ multivalue dictionary that retains the order of insertions and deletions.") (synopsis "URL manipulation in Python") (description "Furl provides an easy-to-use alternative to the @code{urllib} and @code{urlparse} modules for manipulating URLs.") - (license license:unlicense) - (properties `((python2-variant . ,(delay python2-furl)))))) + (license license:unlicense))) (define-public python2-furl - (let ((base (package-with-python2 (strip-python2-variant - python-furl)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-furl)) (define-public python-flask-babel (package @@ -4084,28 +4083,22 @@ multivalue dictionary that retains the order of insertions and deletions.") (description "This package implements internationalization and localization support for Flask. This is based on the Python babel module as well as pytz - both of which are installed automatically if you install this library.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-flask-babel)))))) + (license license:bsd-3))) (define-public python2-flask-babel - (let ((base (package-with-python2 (strip-python2-variant - python-flask-babel)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-flask-babel)) (define-public python-sqlalchemy-utils (package (name "python-sqlalchemy-utils") - (version "0.32.9") + (version "0.32.11") (source (origin (method url-fetch) (uri (pypi-uri "SQLAlchemy-Utils" version)) (sha256 (base32 - "1zbmmh7n8m01ikizn2mj1mfwch26nsr1awv9mvskqry7av0mpy98")))) + "1wghyvk73cmq3iqyg3fczw128fv2pan2v76m0xg1bw05h8fhvnk3")))) (build-system python-build-system) (propagated-inputs `(("python-six" ,python-six) @@ -4129,16 +4122,10 @@ You might also want to install the following optional dependencies: @item @code{python-flask-babel} @end enumerate ") - (properties `((python2-variant . ,(delay python2-sqlalchemy-utils)))) (license license:bsd-3))) (define-public python2-sqlalchemy-utils - (let ((base (package-with-python2 - (strip-python2-variant python-sqlalchemy-utils)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-sqlalchemy-utils)) (define-public python-alembic (package @@ -4165,16 +4152,10 @@ You might also want to install the following optional dependencies: (description "Alembic is a lightweight database migration tool for usage with the SQLAlchemy Database Toolkit for Python.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-alembic)))))) + (license license:expat))) (define-public python2-alembic - (let ((alembic (package-with-python2 - (strip-python2-variant python-alembic)))) - (package - (inherit alembic) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs alembic)))))) + (package-with-python2 python-alembic)) (define-public python-distutils-extra (package @@ -4190,8 +4171,6 @@ SQLAlchemy Database Toolkit for Python.") (base32 "0lx15kcbby9zisx33p2h5hgakgwh2bvh0ibag8z0px4j6ifhs41x")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://launchpad.net/python-distutils-extra/") (synopsis "Enhancements to Python's distutils") (description @@ -4219,17 +4198,10 @@ Python's distutils.") (base32 "0y7vzff9xgbnaay7m0va1arl6g68ncwrvbgwl7jqlclsahzzb09d")))) (build-system python-build-system) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments ;; incompatible with Python 3 (exception syntax) `(#:python ,python-2 - #:tests? #f - ;; With standard flags, the install phase attempts to create a zip'd - ;; egg file, and fails with an error: 'ZIP does not support timestamps - ;; before 1980' - #:configure-flags '("--single-version-externally-managed" - "--record=elib.txt"))) + #:tests? #f)) (home-page "https://github.com/dieterv/elib.intl") (synopsis "Enhanced internationalization for Python") (description @@ -4250,8 +4222,7 @@ services for your Python modules and applications.") "0xkv0p1d73gz0a1qaasf0ai4262g8f334j07vd60bjrxs2wr3nmj")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-nose" ,python-nose))) + `(("python-nose" ,python-nose))) (inputs `(("freetype" ,freetype) ("lcms" ,lcms) @@ -4260,27 +4231,16 @@ services for your Python modules and applications.") ("openjpeg" ,openjpeg) ("libtiff" ,libtiff) ("libwebp" ,libwebp))) - (propagated-inputs - `(;; Used at runtime for pkg_resources - ("python-setuptools" ,python-setuptools))) (arguments `(#:phases (modify-phases %standard-phases - (add-before - 'install 'disable-egg-compression - (lambda _ - ;; Leave the .egg uncompressed since compressing it would - ;; prevent the GC from identifying run-time dependencies. - ;; See <http://bugs.gnu.org/20765>. - (let ((port (open-file "setup.cfg" "a"))) - (display "\n[easy_install]\nzip_ok = 0\n" - port) - (close-port port) - #t))) (add-after 'install 'check-installed - (lambda _ + (lambda* (#:key outputs inputs #:allow-other-keys) (begin (setenv "HOME" (getcwd)) + ;; Make installed package available for running the + ;; tests + (add-installed-pythonpath inputs outputs) (and (zero? (system* "python" "selftest.py" "--installed")) (zero? (system* "python" "test-installed.py")))))) @@ -4304,39 +4264,36 @@ a general image processing tool.") (define-public python-pycparser (package (name "python-pycparser") - (version "2.14") + (version "2.17") (source (origin (method url-fetch) (uri (pypi-uri "pycparser" version)) (sha256 (base32 - "0wvzyb6rxsfj3xcnpa4ynbh9qc7rrbk2277d5wqpphmx9akv8nbr")))) + "1dkkjri0miidqb1zcqhqljfa34fcy9k5akasgwsv6k622zlk3b0a")))) (outputs '("out" "doc")) (build-system python-build-system) (native-inputs - `(("pkg-config" ,pkg-config) - ("python-setuptools" ,python-setuptools))) + `(("pkg-config" ,pkg-config))) (arguments `(#:phases - (alist-replace - 'check - (lambda _ - (with-directory-excursion "tests" - (zero? (system* "python" "all_tests.py")))) - (alist-cons-after - 'install 'install-doc - (lambda* (#:key outputs #:allow-other-keys) - (let* ((data (string-append (assoc-ref outputs "doc") "/share")) - (doc (string-append data "/doc/" ,name "-" ,version)) - (examples (string-append doc "/examples"))) - (mkdir-p examples) - (for-each (lambda (file) - (copy-file (string-append "." file) - (string-append doc file))) - '("/README.rst" "/CHANGES" "/LICENSE")) - (copy-recursively "examples" examples))) - %standard-phases)))) + (modify-phases %standard-phases + (replace 'check + (lambda _ + (with-directory-excursion "tests" + (zero? (system* "python" "all_tests.py"))))) + (add-after 'install 'install-doc + (lambda* (#:key outputs #:allow-other-keys) + (let* ((data (string-append (assoc-ref outputs "doc") "/share")) + (doc (string-append data "/doc/" ,name "-" ,version)) + (examples (string-append doc "/examples"))) + (mkdir-p examples) + (for-each (lambda (file) + (copy-file (string-append "." file) + (string-append doc file))) + '("/README.rst" "/CHANGES" "/LICENSE")) + (copy-recursively "examples" examples))))))) (home-page "https://github.com/eliben/pycparser") (synopsis "C parser in Python") (description @@ -4367,8 +4324,7 @@ a front-end for C compilers or analysis tools.") (native-inputs `(("pkg-config" ,pkg-config) ("python-sphinx" ,python-sphinx) - ("python-pytest" ,python-pytest) - ("python-setuptools" ,python-setuptools))) + ("python-pytest" ,python-pytest))) (arguments `(#:phases (alist-cons-after @@ -4406,12 +4362,10 @@ a front-end for C compilers or analysis tools.") "0655hzxv57h1a9ja9kwp0ichbkhf3djw32k33d66xp0q37dq2y81")))) (build-system python-build-system) (inputs - `(("libxcb" ,libxcb) - ("python-six" ,python-six))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) + `(("libxcb" ,libxcb))) (propagated-inputs - `(("python-cffi" ,python-cffi))) ; used at run time + `(("python-cffi" ,python-cffi) ; used at run time + ("python-six" ,python-six))) (arguments `(#:phases (alist-cons-after @@ -4455,8 +4409,7 @@ support for Python 3 and PyPy. It is based on cffi.") (native-inputs `(("pkg-config" ,pkg-config) ("python-sphinx" ,python-sphinx) - ("python-docutils" ,python-docutils) - ("python-setuptools" ,python-setuptools))) + ("python-docutils" ,python-docutils))) (propagated-inputs `(("python-xcffib" ,python-xcffib))) ; used at run time (arguments @@ -4494,17 +4447,15 @@ PNG, PostScript, PDF, and SVG file output.") (define-public python-decorator (package (name "python-decorator") - (version "4.0.9") + (version "4.0.10") (source (origin (method url-fetch) (uri (pypi-uri "decorator" version)) (sha256 - (base32 "1a5vwhflfd9sh3rfb40xlyipldgdzfff6brman57hqv3661jw0lh")))) + (base32 "0w7hg59hlpq74jpyja4yfryap0ccjvchgpkfp20rhj9krgnrhvlw")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; no test target - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://pypi.python.org/pypi/decorator/") (synopsis "Python module to simplify usage of decorators") (description @@ -4535,8 +4486,7 @@ etc. The core of this module is a decorator factory.") ;; should be set to the path of the libdrmaa library. (arguments '(#:tests? #f)) (native-inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + `(("python-nose" ,python-nose))) (home-page "https://pypi.python.org/pypi/drmaa") (synopsis "Python bindings for the DRMAA library") (description @@ -4562,12 +4512,10 @@ Python language binding specification.") (sha256 (base32 "1gzjg2k6f14i1msm2b0ax8d9ds1hvk6qd5nlaivg8m4cxqp4cp1x")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-psutil" ,python-psutil) ("python-drmaa" ,python-drmaa) ("python-pyzmq" ,python-pyzmq))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/pygridtools/gridmap") (synopsis "Create jobs on a cluster directly from Python") (description @@ -4620,7 +4568,6 @@ child application and control it as if a human were typing commands.") (base32 "1gqr73i150yzj3mz32854vj93x07yr52kn8fdckwa41ll8wgficc")))) (build-system python-build-system) - (native-inputs `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/pypa/setuptools_scm/") (synopsis "Manage Python package versions in SCM metadata") (description @@ -4643,14 +4590,33 @@ them as the version argument or in a SCM managed file.") "path.py/path.py-" version ".tar.gz")) (sha256 (base32 "1p8s1l2vfkqhqxdhqlj0g1jjw4f1as2frr35sjcpjjpd5a89y41f")))) + (outputs '("out" "doc")) (build-system python-build-system) (propagated-inputs `(("python-appdirs" ,python-appdirs))) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-setuptools-scm" ,python-setuptools-scm) + `(("python-setuptools-scm" ,python-setuptools-scm) + ("python-sphinx" ,python-sphinx) + ("python-rst.linker" ,python-rst.linker) ("python-pytest" ,python-pytest) ("python-pytest-runner" ,python-pytest-runner))) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'build 'build-doc + (lambda _ + (setenv "LANG" "en_US.UTF-8") + (zero? (system* "python" "setup.py" "build_sphinx")))) + (add-after 'install 'install-doc + (lambda* (#:key outputs #:allow-other-keys) + (let* ((data (string-append (assoc-ref outputs "doc") "/share")) + (doc (string-append data "/doc/" ,name "-" ,version)) + (html (string-append doc "/html"))) + (mkdir-p html) + (for-each (lambda (file) + (copy-file file (string-append doc "/" file))) + '("README.rst" "CHANGES.rst")) + (copy-recursively "build/sphinx/html" html))))))) (home-page "http://github.com/jaraco/path.py") (synopsis "Python module wrapper for built-in os.path") (description @@ -4675,8 +4641,6 @@ common operations on files to be invoked on those path objects directly.") (build-system python-build-system) (propagated-inputs `(("python-pathpy" ,python-pathpy))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/vivainio/pickleshare") (synopsis "Tiny key value database with concurrency support") (description @@ -4705,8 +4669,7 @@ PickleShare.") (base32 "0wwi1c6md4vkbcsfsf8dklf3vr4mcdj4mpxkanwgb6jb1432x5yw")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("unzip" ,unzip))) + `(("unzip" ,unzip))) (home-page "http://cheeseshop.python.org/pypi/simplegeneric") (synopsis "Python module for simple generic functions") (description @@ -4722,6 +4685,7 @@ standard library.") (package-with-python2 python-simplegeneric)) (define-public python-ipython-genutils + ;; TODO: This package is retired, check if can be removed, see description. (package (name "python-ipython-genutils") (version "0.1.0") @@ -4738,7 +4702,13 @@ standard library.") (home-page "http://ipython.org") (synopsis "Vestigial utilities from IPython") (description - "This package provides retired utilities from IPython.") + "This package provides retired utilities from IPython. No packages +outside IPython/Jupyter should depend on it. + +This package shouldn't exist. It contains some common utilities shared by +Jupyter and IPython projects during The Big Split. As soon as possible, those +packages will remove their dependency on this, and this package will go +away.") (license license:bsd-3))) (define-public python2-ipython-genutils @@ -4783,14 +4753,14 @@ without using the configuration machinery.") (define-public python-jupyter-core (package (name "python-jupyter-core") - (version "4.2.0") + (version "4.2.1") (source (origin (method url-fetch) (uri (string-append (pypi-uri "jupyter_core" version))) (sha256 (base32 - "177d9csqldzhsh6xs1p4nf6lzvhzyg6gklqjf69lxgxyadx87v24")))) + "1cy7inv218dgh4m1fbzbsiqpz733ylgjrj62jxqpfzs3r2cm7ic9")))) (build-system python-build-system) ;; FIXME: not sure how to run the tests (arguments `(#:tests? #f)) @@ -4840,13 +4810,13 @@ installing @code{kernelspec}s for use with Jupyter frontends.") (define-public python-ipykernel (package (name "python-ipykernel") - (version "4.5.0") + (version "4.5.2") (source (origin (method url-fetch) (uri (pypi-uri "ipykernel" version)) (sha256 - (base32 "15c2bp1x3i6s4xb7vz7742h3kmvdfdfn9n2haywm3mwgvf77jni4")))) + (base32 "0qllv0k6zzv1r1cj1x2ygxmlrrqhbslzj8rc6r6fg3kc1rgz4m2s")))) (build-system python-build-system) ;; The tests load a submodule of IPython. However, IPython itself depends ;; on ipykernel. @@ -4907,13 +4877,13 @@ tools for mocking system commands and recording calls to those.") (define-public python-ipython (package (name "python-ipython") - (version "4.0.0") + (version "4.0.3") (source (origin (method url-fetch) (uri (pypi-uri "ipython" version ".tar.gz")) (sha256 - (base32 "1npl8g6bfsff9j938ypx0q5fyzy2l8lp0jl8skjjj2zv0z27dlig")))) + (base32 "1h2gp1p06sww9rzfkfzqy489bh47gj3910y2b1wdk3dcx1cqz4is")))) (build-system python-build-system) (outputs '("out" "doc")) (propagated-inputs @@ -4941,8 +4911,7 @@ tools for mocking system commands and recording calls to those.") ("python-nose" ,python-nose) ("python-sphinx" ,python-sphinx) ("texlive" ,texlive) - ("texinfo" ,texinfo) - ("python-setuptools" ,python-setuptools))) + ("texinfo" ,texinfo))) (arguments `(#:phases (modify-phases %standard-phases @@ -4956,6 +4925,8 @@ tools for mocking system commands and recording calls to those.") (info (string-append data "/info")) (examples (string-append doc "/examples"))) (setenv "LANG" "en_US.utf8") + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) (with-directory-excursion "docs" ;; FIXME: pdf fails to build ;;(system* "make" "pdf" "PAPER=a4") @@ -4975,9 +4946,11 @@ tools for mocking system commands and recording calls to those.") (delete 'check) (add-after 'install 'check - (lambda* (#:key outputs tests? #:allow-other-keys) + (lambda* (#:key inputs outputs tests? #:allow-other-keys) (if tests? (with-directory-excursion "/tmp" + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) (setenv "HOME" "/tmp/") ;; required by a test (zero? (system* (string-append (assoc-ref outputs "out") "/bin/iptest")))) @@ -5012,9 +4985,9 @@ computing.") (arguments `(#:tests? #f ,@(package-arguments ipython))) ;; FIXME: add pyreadline once available. - (inputs + (native-inputs `(("python2-mock" ,python2-mock) - ,@(package-inputs ipython)))))) + ,@(package-native-inputs ipython)))))) (define-public python-isodate (package @@ -5028,8 +5001,6 @@ computing.") (base32 "0cafaiwixgpxwh9dsd28qb0dbzsj6xpxjdkyk30ns91ps10mq422")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://cheeseshop.python.org/pypi/isodate") (synopsis @@ -5045,19 +5016,18 @@ ISO 8601 dates, time and duration.") (define-public python-html5lib (package (name "python-html5lib") - (version "1.0b8") + (version "1.0b10") (source (origin (method url-fetch) (uri (pypi-uri "html5lib" version)) (sha256 (base32 - "1lknq5j3nh11xrl268ks76zaj0gyzh34v94n5vbf6dk8llzxdx0q")))) + "1yd068a5c00wd0ajq0hqimv7fd82lhrw0w3s01vbhy9bbd6xapqd")))) (build-system python-build-system) (propagated-inputs - `(("python-six" ,python-six))) ; required to "import html5lib" - (inputs - `(("python-setuptools" ,python-setuptools))) + `(("python-six" ,python-six) + ("python-webencodings" ,python-webencodings))) (arguments `(#:test-target "check")) (home-page @@ -5088,6 +5058,46 @@ and written in Python.") (define-public python2-html5lib-0.9 (package-with-python2 python-html5lib-0.9)) +(define-public python-webencodings + (package + (name "python-webencodings") + (version "0.5") + (source (origin + (method url-fetch) + (uri (pypi-uri "webencodings" version)) + (sha256 + (base32 + "015rw7662lkpb9aqiqah2hbizk6w531badqwjpz41rr47glmxid5")))) + (build-system python-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (zero? (system* "py.test" "-v" "webencodings/tests.py"))))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (home-page "https://github.com/SimonSapin/python-webencodings") + (synopsis "Character encoding aliases for legacy web content") + (description + "In order to be compatible with legacy web content when interpreting +something like @code{Content-Type: text/html; charset=latin1}, tools need +to use a particular set of aliases for encoding labels as well as some +overriding rules. For example, @code{US-ASCII} and @code{iso-8859-1} on +the web are actually aliases for @code{windows-1252}, and an @code{UTF-8} +or @code{UTF-16} BOM takes precedence over any other encoding declaration. +The WHATWG @url{https://encoding.spec.whatwg.org/,Encoding} standard +defines all such details so that implementations do not have to +reverse-engineer each other. + +This module implements the Encoding standard and has encoding labels and +BOM detection, but the actual implementation for encoders and decoders +is Python’s.") + (license license:bsd-3))) + +(define-public python2-webencodings + (package-with-python2 python-webencodings)) + (define-public python-urwid (package (name "python-urwid") @@ -5111,7 +5121,6 @@ and written in Python.") (substitute* "urwid/tests/test_event_loops.py" (("test_remove_watch_file") "disable_remove_watch_file"))))))) - (native-inputs `(("python-setuptools" ,python-setuptools))) (home-page "http://urwid.org") (synopsis "Console user interface library for Python") (description @@ -5122,6 +5131,27 @@ features useful for text console applications.") (define-public python2-urwid (package-with-python2 python-urwid)) +(define-public python2-openid + (package + (name "python2-openid") + (version "2.2.5") + (source + (origin + (method url-fetch) + (uri (pypi-uri "python-openid" version)) + (sha256 + (base32 + "1vvhxlghjan01snfdc4k7ykd80vkyjgizwgg9bncnin8rqz1ricj")))) + (build-system python-build-system) + (arguments + ;; Python 3 support is in `python3-openid`, a separate package. + `(#:python ,python-2)) + (home-page "https://github.com/openid/python-openid") + (synopsis "OpenID support for servers and consumers") + (description "This library provides OpenID authentication for Python, both +for clients and servers.") + (license license:asl2.0))) + (define-public python-urwidtrees (package (name "python-urwidtrees") @@ -5140,7 +5170,7 @@ features useful for text console applications.") (build-system python-build-system) (arguments '(#:tests? #f)) ; no tests - (inputs `(("python-urwid" ,python-urwid))) + (propagated-inputs `(("python-urwid" ,python-urwid))) (home-page "https://github.com/pazz/urwidtrees") (synopsis "Tree widgets for urwid") (description "Urwidtrees is a Widget Container API for the @code{urwid} @@ -5209,8 +5239,7 @@ implementation of D-Bus.") "0w4jb0wpx785qw42r3h4fh7gl5w2968q48i7gygybsfxck8nzffs")))) (build-system python-build-system) (inputs - `(("python-setuptools" ,python-setuptools) - ("sqlite" ,sqlite))) + `(("sqlite" ,sqlite))) (arguments `(#:phases ;; swap check and install phases @@ -5245,8 +5274,7 @@ translate the complete SQLite API into Python.") (build-system python-build-system) (inputs `(("libxml2" ,libxml2) - ("libxslt" ,libxslt) - ("python-setuptools" ,python-setuptools))) + ("libxslt" ,libxslt))) (home-page "http://lxml.de/") (synopsis "Python XML processing library") @@ -5292,14 +5320,12 @@ screen-scraping projects. It offers Pythonic idioms for navigating, searching, and modifying a parse tree, providing a toolkit for dissecting a document and extracting what you need. It automatically converts incoming documents to Unicode and outgoing documents to UTF-8.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-beautifulsoup4)))))) + (license license:expat))) (define-public python2-beautifulsoup4 (package (inherit (package-with-python2 (strip-python2-variant python-beautifulsoup4))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:python ,python-2)))) (define-public python2-cssutils @@ -5317,8 +5343,6 @@ converts incoming documents to Unicode and outgoing documents to UTF-8.") (native-inputs `(("python2-mock" ,python2-mock) ; for the tests ("unzip" ,unzip))) ; for unpacking the source - (inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:python ,python-2 ; Otherwise tests fail with a syntax error. #:tests? #f ; The tests apparently download an external URL. @@ -5344,8 +5368,6 @@ options.") (base32 "1xg6gbva1yswghiycmgincv6ab4bn7hpm720ndbj40h8xycmnfvi")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (arguments ;; tests fail with message ;; AttributeError: 'module' object has no attribute 'tests' @@ -5363,6 +5385,49 @@ another XPath engine to find the matching elements in an XML or HTML document.") (define-public python2-cssselect (package-with-python2 python-cssselect)) +(define-public python-openid-cla + (package + (name "python-openid-cla") + (version "1.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "python-openid-cla" version)) + (sha256 + (base32 + "102hy2qisvjxp5s0v9lvwqi4f2dk0dhns40vjgn008yxc7k0h3cr")))) + (build-system python-build-system) + (home-page "https://github.com/puiterwijk/python-openid-cla/") + (synopsis "Implementation of the OpenID CLA extension for python-openid") + (description "@code{openid-cla} is an implementation of the OpenID +contributor license agreement extension for python-openid.") + (license license:bsd-3))) + +(define-public python2-openid-cla + (package-with-python2 python-openid-cla)) + +(define-public python-openid-teams + (package + (name "python-openid-teams") + (version "1.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "python-openid-teams" version)) + (sha256 + (base32 + "05zrh78alav24rxkbqlpbad6d3x2nljk6z6j7kflxf3vdqa7w969")))) + (build-system python-build-system) + (home-page "https://github.com/puiterwijk/python-openid-teams/") + (synopsis "Implementation of the OpenID teams extension for python-openid") + (description + "@code{openid-teams} is an implementation of the OpenID +teams extension for python-openid.") + (license license:bsd-3))) + +(define-public python2-openid-teams + (package-with-python2 python-openid-teams)) + (define-public python-netifaces (package (name "python-netifaces") @@ -5378,8 +5443,6 @@ another XPath engine to find the matching elements in an XML or HTML document.") (base32 "1plw237a4zib4z8s62g0mrs8gm3kjfrp5sxh6bbk9nl3rdls2mln")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://bitbucket.org/al45tair/netifaces") (synopsis @@ -5407,8 +5470,7 @@ interfaces in an easy and portable manner.") (propagated-inputs `(("python-decorator" ,python-decorator))) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-nose" ,python-nose))) + `(("python-nose" ,python-nose))) (home-page "http://networkx.github.io/") (synopsis "Python module for creating and manipulating graphs and networks") (description @@ -5432,7 +5494,6 @@ of the structure, dynamics, and functions of complex networks.") (sha256 (base32 "0fi4b63sj60hvi7rfydvmz2icl4wj74djw5sn2gl8hxd02qw4b91")))) (build-system python-build-system) - (inputs `(("python-setuptools" ,python-setuptools))) (home-page "https://bitbucket.org/johanneskoester/snakemake") (synopsis "Python-based execution environment for make-like workflows") (description @@ -5471,9 +5532,7 @@ and statistical routines from scipy and statsmodels.") (package (inherit base) (propagated-inputs `(("python2-pytz" ,python2-pytz) - ,@(package-propagated-inputs base))) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + ,@(package-propagated-inputs base)))))) (define-public python-sympy (package @@ -5488,8 +5547,6 @@ and statistical routines from scipy and statsmodels.") (sha256 (base32 "19yp0gy4i7p4g6l3b8vaqkj9qj7yqb5kqy0qgbdagpzgkdz958yz")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://www.sympy.org/") (synopsis "Python library for symbolic mathematics") (description @@ -5519,16 +5576,10 @@ as possible in order to be comprehensible and easily extensible.") "q is a Python module for \"print\" style of debugging Python code. It provides convenient short API for print out of values, tracebacks, and falling into the Python interpreter.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-q)))))) + (license license:asl2.0))) (define-public python2-q - (let ((base (package-with-python2 (strip-python2-variant python-q)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-q)) (define-public python-testlib (package @@ -5543,21 +5594,8 @@ falling into the Python interpreter.") (sha256 (base32 "1mz26cxn4x8bbgv0rn0mvj2z05y31rkc8009nvdlb3lam5b4mj3y")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (native-inputs - `(("unzip" ,unzip))) - (arguments - `(#:phases - (alist-replace - 'unpack - (lambda* (#:key inputs outputs #:allow-other-keys) - (let ((unzip (string-append (assoc-ref inputs "unzip") - "/bin/unzip")) - (source (assoc-ref inputs "source"))) - (and (zero? (system* unzip source)) - (chdir (string-append "testlib-" ,version))))) - %standard-phases))) + `(("unzip" ,unzip))) ; for unpacking the source (synopsis "Python micro test suite harness") (description "A micro unittest suite harness for Python.") (home-page "https://github.com/trentm/testlib") @@ -5582,8 +5620,6 @@ falling into the Python interpreter.") (arguments `(#:python ,python-2 ;Python 2 only #:tests? #f)) ;no tests - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://python-xlib.sourceforge.net/") (synopsis "Python X11 client library") (description @@ -5605,9 +5641,7 @@ It is written entirely in Python.") "171b7ip0hsq5qm83np40h3phlr36ym18w0lay0a8v08kvy3sy1jv")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools))) - (inputs - `(("python-six" ,python-six))) + `(("python-six" ,python-six))) ; required for conversion, not at run-time (home-page "http://docs.python.org/3/library/functools.html#functools.singledispatch") (synopsis "Backport of singledispatch feature from Python 3.4") @@ -5632,7 +5666,7 @@ It is written entirely in Python.") (build-system python-build-system) (native-inputs `(("python-certifi" ,python-certifi))) - (inputs + (propagated-inputs `(("python-backports-abc" ,python-backports-abc))) (home-page "http://www.tornadoweb.org/") (synopsis "Python web framework and asynchronous networking library") @@ -5648,30 +5682,25 @@ connection to each user.") (define-public python2-tornado (let ((tornado (package-with-python2 (strip-python2-variant python-tornado)))) (package (inherit tornado) - (inputs + (propagated-inputs `(("python2-backport-ssl-match-hostname" ,python2-backport-ssl-match-hostname) ("python2-singledispatch" ,python2-singledispatch) - ,@(package-inputs tornado))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs tornado)))))) + ,@(package-propagated-inputs tornado)))))) ;; the python- version can be removed with python-3.5 (define-public python-backports-abc (package (name "python-backports-abc") - (version "0.4") + (version "0.5") (source (origin (method url-fetch) (uri (pypi-uri "backports_abc" version)) (sha256 (base32 - "19fh75lni9pb673n2fn505m1rckm0af0szcv5xx1qm1xpa940glb")))) + "1pkv8d1zxj5f9i227dxbjczncbv7ks7ywnjwyxfjagm02i2yafq3")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/cython/backports_abc") (synopsis "Backport of additions to the 'collections.abc' module") (description @@ -5737,8 +5766,7 @@ applications.") `(("zeromq" ,zeromq))) (native-inputs `(("pkg-config" ,pkg-config) - ("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + ("python-nose" ,python-nose))) (home-page "http://github.com/zeromq/pyzmq") (synopsis "Python bindings for 0MQ") (description @@ -5760,8 +5788,6 @@ applications.") (base32 "002rkl4lsn6x2mxmf8ar00l0m8i3mzrc6pnzz77blyksmpsxa4x1")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pep8.readthedocs.org/") (synopsis "Python style guide checker") (description @@ -5784,8 +5810,6 @@ PEP 8.") (base32 "0qs2sgqszq7wcplis8509wk2ygqcrwzbs1ghfj3svvivq2j377pk")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/pyflakes/pyflakes") (synopsis "Passive checker of Python programs") @@ -5808,10 +5832,9 @@ PEP 8.") (base32 "0yr08a36h8lqlif10l4xcikbbig7q8f41gqywir7rrvnv3mi4aws")))) (build-system python-build-system) - (inputs + (native-inputs `(("python-pytest" ,python-pytest) - ("python-pytest-runner" ,python-pytest-runner) - ("python-setuptools" ,python-setuptools))) + ("python-pytest-runner" ,python-pytest-runner))) (home-page "https://github.com/flintwork/mccabe") (synopsis "McCabe checker, plugin for flake8") (description @@ -5831,8 +5854,7 @@ complexity of Python source code.") (uri (pypi-uri "mccabe" version)) (sha256 (base32 - "0fi4a81kr5bcv5p4xgibqr595hyj5dafkqgsmfk96mfy8w71fajs")))) - (inputs `(("python-setuptools" ,python-setuptools))))) + "0fi4a81kr5bcv5p4xgibqr595hyj5dafkqgsmfk96mfy8w71fajs")))))) (define-public python2-mccabe-0.2.1 (package-with-python2 python-mccabe-0.2.1)) @@ -5885,14 +5907,22 @@ complexity of Python source code.") (uri (pypi-uri "flake8" version)) (sha256 (base32 - "0bs9cz4fr99r2rwig1b8jwaadl1nan7kgpdzqwj0bwbckwbmh7nc")))) + "0bs9cz4fr99r2rwig1b8jwaadl1nan7kgpdzqwj0bwbckwbmh7nc")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-compiled .pyc files from source. + (for-each delete-file-recursively + (find-files "." "__pycache__" #:directories? #t)) + (for-each delete-file (find-files "." "\\.pyc$")) + #t)))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-pep8" ,python-pep8) + (propagated-inputs + `(("python-pep8" ,python-pep8) ("python-pyflakes" ,python-pyflakes) - ("python-mccabe" ,python-mccabe) - ("python-mock" ,python-mock) + ("python-mccabe" ,python-mccabe))) + (native-inputs + `(("python-mock" ,python-mock) ; TODO: only required for < 3.3 ("python-nose" ,python-nose))) (home-page "https://gitlab.com/pycqa/flake8") (synopsis @@ -5908,12 +5938,12 @@ complexity of Python source code.") ;; necessary once python-hacking > 0.10.2 is released. (define-public python-flake8-2.2.4 (package (inherit python-flake8) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-pep8" ,python-pep8-1.5.7) + (propagated-inputs + `(("python-pep8" ,python-pep8-1.5.7) ("python-pyflakes" ,python-pyflakes-0.8.1) - ("python-mccabe" ,python-mccabe-0.2.1) - ("python-mock" ,python-mock) + ("python-mccabe" ,python-mccabe-0.2.1))) + (native-inputs + `(("python-mock" ,python-mock) ("python-nose" ,python-nose))) (version "2.2.4") (source @@ -5922,7 +5952,15 @@ complexity of Python source code.") (uri (pypi-uri "flake8" version)) (sha256 (base32 - "1r9wsry4va45h1rck5hxd3vzsg2q3y6lnl6pym1bxvz8ry19jwx8")))))) + "1r9wsry4va45h1rck5hxd3vzsg2q3y6lnl6pym1bxvz8ry19jwx8")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-compiled .pyc files from source. + (for-each delete-file-recursively + (find-files "." "__pycache__" #:directories? #t)) + (for-each delete-file (find-files "." "\\.pyc$")) + #t)))))) (define-public python2-flake8-2.2.4 (package-with-python2 python-flake8-2.2.4)) @@ -5942,9 +5980,8 @@ complexity of Python source code.") (base32 "17zqjp9m4d1w3jf2rbbq5xshcw24q1vlcv24gkgfqqyyymajxahx")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-nose" ,python-nose) + (native-inputs + `(("python-nose" ,python-nose) ("python-cython" ,python-cython))) (home-page "https://github.com/lepture/mistune") (synopsis "Markdown parser in pure Python") @@ -5958,14 +5995,14 @@ Python.") (define-public python-markdown (package (name "python-markdown") - (version "2.6.5") + (version "2.6.7") (source (origin (method url-fetch) (uri (pypi-uri "Markdown" version)) (sha256 (base32 - "0q758a3fiiawr20b3hhjfs677cwj6xi284yb7xspcvv0fdicz54d")))) + "1h055llfd0ps0ig7qb3v1j9068xv90dc9s7xkhkgz9zg8r4g5sys")))) (build-system python-build-system) (arguments `(#:phases @@ -6002,9 +6039,8 @@ markdown_py is also provided to convert Markdown files to HTML.") (base32 "0nggns5kikn32yyda2zrj1xdmh49pi3v0drggcdwljbv36r8zdyw")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-nose" ,python-nose))) + (native-inputs + `(("python-nose" ,python-nose))) (arguments `(#:phases (modify-phases %standard-phases @@ -6057,10 +6093,29 @@ term.js Javascript terminal emulator library.") (propagated-inputs `(("python2-backport-ssl-match-hostname" ,python2-backport-ssl-match-hostname) - ,@(package-propagated-inputs terminado))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs terminado)))))) + ,@(package-propagated-inputs terminado)))))) + +(define-public python-straight-plugin + (package + (name "python-straight-plugin") + (version "1.4.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "straight.plugin" version)) + (sha256 + (base32 + "069pjll4383p4kkgvcc40hgyvf79j2wdbpgwz77yigzxksh1gj62")))) + (build-system python-build-system) + (home-page "https://github.com/ironfroggy/straight.plugin") + (synopsis "Simple namespaced plugin facility") + (description "Straight Plugin provides a type of plugin you can create from +almost any existing Python modules, and an easy way for outside developers to +add functionality and customization to your projects with their own plugins.") + (license license:expat))) + +(define-public python2-straight-plugin + (package-with-python2 python-straight-plugin)) (define-public python-fonttools (package @@ -6075,15 +6130,23 @@ term.js Javascript terminal emulator library.") (base32 "08ay3x4ijarwhl60gqx2i9jzq6pxs20p4snc2d1q5jagh4rn39lb")))) (build-system python-build-system) - (arguments '(#:test-target "check")) - (propagated-inputs - ;; XXX: module not found if setuptools is not available. - `(("python-setuptools" ,python-setuptools))) + (arguments + '(#:test-target "check" + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-setuppy + ;; Remove the undocumented "extra_path" argument, which adds an + ;; intervening directories between site-packages and the package + ;; directory. + (lambda _ + (substitute* "setup.py" + (("^[ \t]*extra_path *= *'FontTools',") "")) + #t))))) (home-page "http://github.com/behdad/fonttools") (synopsis "Tools to manipulate font files") (description "FontTools/TTX is a library to manipulate font files from Python. It -supports reading and writinfg of TrueType/OpenType fonts, reading and writing +supports reading and writing of TrueType/OpenType fonts, reading and writing of AFM files, reading (and partially writing) of PS Type 1 fonts. The package also contains a tool called “TTX” which converts TrueType/OpenType fonts to and from an XML-based format.") @@ -6108,8 +6171,6 @@ from an XML-based format.") (base32 "0g6n288l83sfwavxh1aryi0aqvsr3sp7v6f903mckwqa4scpky62")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (synopsis "Tool and library for manipulating LilyPond files") (description "This package provides a Python library to parse, manipulate or create documents in LilyPond format. A command line program ly is also @@ -6132,8 +6193,6 @@ provided that can be used to do various manipulations with LilyPond files.") (base32 "1iddva7v3fq0aqzsahkazxr7vpw28mqcrsy818z4wyiqnkplbhlg")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://github.com/ActiveState/appdirs") (synopsis "Determine platform-specific dirs, e.g. a \"user data dir\"") @@ -6162,8 +6221,7 @@ should be stored on various operating systems.") `(("fuse" ,fuse) ("attr" ,attr))) (native-inputs - `(("pkg-config" ,pkg-config) - ("python-setuptools" ,python-setuptools))) + `(("pkg-config" ,pkg-config))) (synopsis "Python bindings for FUSE") (description "Python-LLFUSE is a set of Python bindings for the low level FUSE API.") @@ -6208,14 +6266,10 @@ should be stored on various operating systems.") suitable for similar data to JSON. This package provides CPython bindings for reading and writing MessagePack data.") (home-page "https://pypi.python.org/pypi/msgpack-python/") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-msgpack)))))) + (license license:asl2.0))) (define-public python2-msgpack - (package (inherit (package-with-python2 - (strip-python2-variant python-msgpack))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-msgpack)) (define-public python-netaddr (package @@ -6233,8 +6287,6 @@ reading and writing MessagePack data.") "06dxjlbcicq7q3vqy8agq11ra01kvvd47j4mk6dmghjsyzyckxd1")))) (build-system python-build-system) (arguments `(#:tests? #f)) ;; No tests. - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/drkjam/netaddr/") (synopsis "Pythonic manipulation of network addresses") (description @@ -6264,8 +6316,6 @@ and MAC network addresses.") ;; Tests are not included in the tarball, they are only available in the ;; git repository. `(#:tests? #f)) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/GrahamDumpleton/wrapt") (synopsis "Module for decorators, wrappers and monkey patching") (description @@ -6289,8 +6339,6 @@ and MAC network addresses.") (base32 "0c7gh3lsdjds262h0v1sqc66l7hqgfwbakn96qrhdbl0i3vm5yz8")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://bitbucket.org/micktwomey/pyiso8601") (synopsis "Module to parse ISO 8601 dates") (description @@ -6316,8 +6364,6 @@ and MAC network addresses.") (base32 "0yz0bcbwx8r2c01czzfpbrxddynxyk9k95jj8h6sgcb7xmfvl998")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/atdt/monotonic") (synopsis "Implementation of time.monotonic() for Python 2 & < 3.3") (description @@ -6340,9 +6386,8 @@ fractional seconds) of a clock which never goes backwards.") (base32 "02bhhzijfhv8hmi1i54d4b0v43liwhnywhflvxsv4x3zax9s3afq")))) (build-system python-build-system) - (inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + (native-inputs + `(("python-nose" ,python-nose))) (home-page "http://webob.org/") (synopsis "WSGI request and response object") (description @@ -6370,8 +6415,7 @@ object to help create WSGI responses.") ;; Current test in setup.py does not work as of 1.0.0, so use nose to ;; run tests instead for now. (replace 'check (lambda _ (zero? (system* "nosetests"))))))) - (native-inputs `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + (native-inputs `(("python-nose" ,python-nose))) (home-page "http://www.python-excel.org/") (synopsis "Library for extracting data from Excel files") (description "This packages provides a library to extract data from @@ -6397,8 +6441,6 @@ Unicode-aware. It is not intended as an end-user tool.") (base32 "0diwsicwmiq2cpzpxri7cyl5fmsvicafw6nfqf6p6p322dji2g45")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://code.google.com/p/prettytable/") (synopsis "Display tabular data in an ASCII table format") (description @@ -6421,7 +6463,15 @@ printing of sub-tables by specifying a row range.") (uri (pypi-uri "tables" version)) (sha256 (base32 - "117s6w7s3yxafpmf3zz3svana7xfrsviw01va1xp7h8ylx8v6r1m")))) + "117s6w7s3yxafpmf3zz3svana7xfrsviw01va1xp7h8ylx8v6r1m")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-compiled .pyc files from source. + (for-each delete-file-recursively + (find-files "." "__pycache__" #:directories? #t)) + (for-each delete-file (find-files "." "\\.pyc$")) + #t)))) (build-system python-build-system) (arguments `(;; FIXME: python-build-system does not pass configure-flags to "build" @@ -6452,8 +6502,7 @@ printing of sub-tables by specifying a row range.") `(("python-numexpr" ,python-numexpr) ("python-numpy" ,python-numpy))) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-cython" ,python-cython) + `(("python-cython" ,python-cython) ("pkg-config" ,pkg-config))) (inputs `(("hdf5" ,hdf5) @@ -6502,11 +6551,9 @@ suitable for a wide range of protocols based on the ASN.1 specification.") (base32 "0drqgw81xd3fxdlg89kgd79zzrabvfncvkbybi2wr6w2y4s1jmhh")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-pyasn1" ,python-pyasn1))) - (home-page "http://sourceforge.net/projects/pyasn1/") + (home-page "https://sourceforge.net/projects/pyasn1/") (synopsis "ASN.1 codec implementations") (description "Pyasn1-modules is a collection of Python modules providing ASN.1 types and @@ -6534,15 +6581,10 @@ implementations of ASN.1-based codecs and protocols.") in Python. This library is used to create, poke at, and manipulate IPv4 and IPv6 addresses and networks. This is a port of the Python 3.3 ipaddress module to older versions of Python.") - (license license:psfl) - (properties `((python2-variant . ,(delay python2-ipaddress)))))) + (license license:psfl))) (define-public python2-ipaddress - (let ((base (package-with-python2 (strip-python2-variant python-ipaddress)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-ipaddress)) (define-public python2-ipaddr (package @@ -6586,8 +6628,6 @@ versions of Python.") (base32 "0frxgmgi234lr9hylg62j69j4ik5zhg0wz05w5dhyacbjfnrl68n")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/kjd/idna") (synopsis "Internationalized domain names in applications") (description @@ -6616,8 +6656,6 @@ specification.") (base32 "0r5r7ygz9m6d2bklflbl84cqhjkc2q12xgis8268ygjh30g2q3wk")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/alex/pretend") (synopsis "Library for stubbing in Python") (description @@ -6633,17 +6671,15 @@ responses, rather than doing any computation.") (define-public python-cryptography-vectors (package (name "python-cryptography-vectors") - (version "1.5.3") + (version "1.7.1") (source (origin (method url-fetch) (uri (pypi-uri "cryptography_vectors" version)) (sha256 (base32 - "1bnd1bricyhxa27rhr0ljk0kacxzvysd3ar2j2hlv13a2k6zw4z5")))) + "1x2mz4wggja5ih45c6cw0kzyad4jr8avg327dawjr1gnpdq1psa7")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/pyca/cryptography") (synopsis "Test vectors for the cryptography package") (description @@ -6657,29 +6693,15 @@ responses, rather than doing any computation.") (define-public python-cryptography (package (name "python-cryptography") - (version "1.5.3") + (version "1.7.1") (source (origin (method url-fetch) (uri (pypi-uri "cryptography" version)) (sha256 (base32 - "1raanvkdfw5ai56ymlij6ghc4k126fs7jx948ig7yn4vj6ndv0ng")))) + "0k6v7wq4h0yk9r0x0bl2x9fyrg4a6gj5qp4m9mgpk6m481yyygwm")))) (build-system python-build-system) - (arguments - `(#:phases - (modify-phases %standard-phases - (add-before 'check 'disable-failing-test - (lambda _ - ;; This test is known to fail with OpenSSL >= 1.0.2i and older - ;; versions of python-cryptography: - ;; https://github.com/pyca/cryptography/issues/3196 - ;; TODO: Try re-enabling the test when upgrading - ;; python-cryptography. - (substitute* "tests/hazmat/backends/test_openssl.py" - (("def test_numeric_string_x509_name_entry") - "@pytest.mark.xfail\n def test_numeric_string_x509_name_entry")) - #t))))) (inputs `(("openssl" ,openssl))) (propagated-inputs @@ -6691,7 +6713,6 @@ responses, rather than doing any computation.") (native-inputs `(("python-cryptography-vectors" ,python-cryptography-vectors) ("python-hypothesis" ,python-hypothesis) - ("python-setuptools" ,python-setuptools) ("python-pretend" ,python-pretend) ("python-pyasn1" ,python-pyasn1) ("python-pyasn1-modules" ,python-pyasn1-modules) @@ -6737,8 +6758,6 @@ message digests and key derivation functions.") ("python-six" ,python-six))) (inputs `(("openssl" ,openssl))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/pyca/pyopenssl") (synopsis "Python wrapper module around the OpenSSL library") (description @@ -6761,10 +6780,9 @@ library.") (base32 "08cm8d4228fj0qnrysy3qv1a6022zr3dcs25amd14lgxil6vvx26")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools) + (native-inputs + `(;; Tests ("python-virtualenv" ,python-virtualenv) - ;; Tests ("python-mock" ,python-mock) ("python-pytest" ,python-pytest) ("python-scripttest" ,python-scripttest))) @@ -6869,18 +6887,9 @@ a hash value.") (substitute* "libarchive/ffi.py" (("find_library\\('archive'\\)") (string-append "'" libarchive - "/lib/libarchive.so'")))) - - ;; Do not make a compressed egg (see - ;; <http://bugs.gnu.org/20765>). - (let ((port (open-file "setup.cfg" "a"))) - (display "\n[easy_install]\nzip_ok = 0\n" - port) - (close-port port) - #t)))))) + "/lib/libarchive.so'"))))))))) (inputs - `(("python-setuptools" ,python-setuptools) - ("libarchive" ,libarchive))) + `(("libarchive" ,libarchive))) (home-page "https://github.com/Changaco/python-libarchive-c") (synopsis "Python interface to libarchive") (description @@ -6921,17 +6930,10 @@ Python's @code{ctypes} foreign function interface (FFI).") (synopsis "Python bindings to the libmagic file type guesser. Note that this module and the python-magic module both provide a \"magic.py\" file; these two modules, which are different and were developed separately, both -serve the same purpose: provide Python bindings for libmagic.") - (properties `((python2-variant . ,(delay python2-file)))))) +serve the same purpose: provide Python bindings for libmagic."))) (define-public python2-file - (let ((base (package-with-python2 (strip-python2-variant python-file)))) - (package - (inherit base) - (source (package-source file)) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-file)) (define-public python-debian (package @@ -6947,10 +6949,8 @@ serve the same purpose: provide Python bindings for libmagic.") (base32 "193faznwnjc3n5991wyzim6h9gyq1zxifmfrnpm3avgkh7ahyynh")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-six" ,python-six))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://packages.debian.org/sid/python-debian") (synopsis "Debian package related modules") (description @@ -6993,8 +6993,6 @@ Debian-related files, such as: ("python-jsonschema" ,python-jsonschema) ("python-jupyter-core" ,python-jupyter-core) ("python-traitlets" ,python-traitlets))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://jupyter.org") (synopsis "Jupyter Notebook format") (description "This package provides the reference implementation of the @@ -7018,7 +7016,6 @@ Jupyter Notebook format and Python APIs for working with notebooks.") (build-system python-build-system) (propagated-inputs `(("python-html5lib" ,python-html5lib-0.9) - ("python-setuptools" ,python-setuptools) ("python-six" ,python-six))) (native-inputs `(("python-nose" ,python-nose))) @@ -7093,7 +7090,6 @@ functions to find and load entry points.") ("python-mistune" ,python-mistune) ("python-nbformat" ,python-nbformat) ("python-pygments" ,python-pygments) - ("python-setuptools" ,python-setuptools) ("python-traitlets" ,python-traitlets))) (home-page "http://jupyter.org") (synopsis "Converting Jupyter Notebooks") @@ -7148,10 +7144,28 @@ convert an @code{.ipynb} notebook file into various static formats including: (description "The Jupyter HTML notebook is a web-based notebook environment for interactive computing.") + (properties `((python2-variant . ,(delay python2-notebook)))) (license license:bsd-3))) (define-public python2-notebook - (package-with-python2 python-notebook)) + (let ((base (package-with-python2 + (strip-python2-variant python-notebook)))) + (package (inherit base) + (native-inputs + `(("python2-mock" ,python2-mock) + ,@(package-native-inputs base))) + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + `(modify-phases ,phases + (add-before 'check 'disable-test-case + ;; The test requires network access to localhost. Curiously it + ;; fails with Python 2 only. Simply make the test-case return + ;; immediately. + (lambda _ + (substitute* + "notebook/services/nbconvert/tests/test_nbconvert_api.py" + (("formats = self.nbconvert_api") "return #"))))))))))) (define-public python-widgetsnbextension (package @@ -7168,8 +7182,7 @@ interactive computing.") (propagated-inputs `(("python-notebook" ,python-notebook))) (native-inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + `(("python-nose" ,python-nose))) (home-page "http://ipython.org") (synopsis "IPython HTML widgets for Jupyter") (description "This package provides interactive HTML widgets for Jupyter @@ -7196,7 +7209,6 @@ notebooks.") (propagated-inputs `(("python-ipykernel" ,python-ipykernel) ("python-ipython" ,python-ipython) - ("python-setuptools" ,python-setuptools) ("python-traitlets" ,python-traitlets) ("python-widgetsnbextension" ,python-widgetsnbextension))) (home-page "http://ipython.org") @@ -7229,8 +7241,7 @@ in the data.") ("python-ipython" ,python-ipython) ("python-jupyter-client" ,python-jupyter-client) ("python-prompt-toolkit" ,python-prompt-toolkit) - ("python-pygments" ,python-pygments) - ("python-setuptools" ,python-setuptools))) + ("python-pygments" ,python-pygments))) (home-page "https://jupyter.org") (synopsis "Jupyter terminal console") (description "This package provides a terminal-based console frontend for @@ -7260,8 +7271,7 @@ Jupyter kernels such as IJulia and IRKernel.") ("python-ipywidgets" ,python-ipywidgets) ("python-jupyter-console" ,python-jupyter-console) ("python-nbconvert" ,python-nbconvert) - ("python-notebook" ,python-notebook) - ("python-setuptools" ,python-setuptools))) + ("python-notebook" ,python-notebook))) (home-page "http://jupyter.org") (synopsis "Web application for interactive documents") (description @@ -7286,8 +7296,6 @@ simulation, statistical modeling, machine learning and much more.") (base32 "1ak87ikcw34fivcgiz2xvi938dmclh078az65l9x3rmgljrkhgp5")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/chardet/chardet") (synopsis "Universal encoding detector for Python 2 and 3") (description @@ -7315,8 +7323,7 @@ automatically detect a wide range of file encodings.") "16bf890xbdz3m30rsv2qacklh2rdn1zrfspfnwzx9g7vwz8yw4r1")))) (build-system python-build-system) (native-inputs - `(("python-pytest" ,python-pytest) - ("python-setuptools" ,python-setuptools))) + `(("python-pytest" ,python-pytest))) (arguments `(#:phases (alist-replace 'check @@ -7346,8 +7353,6 @@ programatically with command-line parsers like @code{getopt} and (base32 "11p75zpfz3ffhz21nzx9wb23xs993ck5s6hkjcvhswwizni5jynw")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pypi.python.org/pypi/zope.event") (synopsis "Event publishing system for Python") (description "Zope.event provides an event publishing API, intended for @@ -7372,7 +7377,7 @@ dispatching systems can be built.") (base32 "0ks8h73b2g4bkad821qbv0wzjppdrwys33i7ka45ik3wxjg1l8if")))) (build-system python-build-system) - (propagated-inputs + (native-inputs `(("python-zope-event" ,python-zope-event))) (home-page "https://github.com/zopefoundation/zope.interface") (synopsis "Python implementation of the \"design by contract\" @@ -7460,6 +7465,7 @@ forms, HTTP servers, regular expressions, and more.") (build-system python-build-system) (native-inputs `(("python-six" ,python-six) + ;("python-zope-interface" ,python-zope-interface) ("python-zope-exceptions" ,python-zope-exceptions) ("python-zope-testing" ,python-zope-testing) ("unzip" ,unzip))) @@ -7495,8 +7501,6 @@ tests.") (base32 "1rslyph0klk58dmjjy4j0jxy21k03azksixc3x2xhqbkv97cmzml")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://pypi.python.org/pypi/zope.i18nmessageid") (synopsis "Message identifiers for internationalization") (description "Zope.i18nmessageid provides facilities for declaring @@ -7523,7 +7527,9 @@ internationalized messages within program source text.") `(("python-zope-event" ,python-zope-event) ("python-zope-interface" ,python-zope-interface))) (native-inputs - `(("python-zope-testing" ,python-zope-testing))) + `(("python-zope-testing" ,python-zope-testing) + ("python-coverage" ,python-coverage) + ("python-nose" ,python-nose))) (home-page "http://pypi.python.org/pypi/zope.schema") (synopsis "Zope data schemas") (description "Zope.scheme provides extensions to zope.interface for @@ -7598,7 +7604,7 @@ brokering, etc.) for which the proxy is responsible.") (base32 "1nj9da4ksiyv3h8n2vpzwd0pb03mdsh7zy87hfpx72b6p2zcwg74")))) (build-system python-build-system) - (native-inputs + (propagated-inputs `(("python-zope-proxy" ,python-zope-proxy) ("python-zope-schema" ,python-zope-schema))) (home-page "http://pypi.python.org/pypi/zope.location/") @@ -7625,10 +7631,12 @@ Zope3, which are are special objects that have a structural location.") (build-system python-build-system) (propagated-inputs `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid) - ("python-zope-component" ,python-zope-component) - ("python-zope-location" ,python-zope-location) ("python-zope-proxy" ,python-zope-proxy) - ("python-zope-schema" ,python-zope-schema) + ("python-zope-schema" ,python-zope-schema))) + (native-inputs + `(("python-zope-component" ,python-zope-component) + ("python-zope-configuration" ,python-zope-configuration) + ("python-zope-location" ,python-zope-location) ("python-zope-testrunner" ,python-zope-testrunner) ("python-zope-testing" ,python-zope-testing))) (home-page "http://pypi.python.org/pypi/zope.security") @@ -7741,8 +7749,7 @@ This allows one to make simple text-mode user interfaces on Unix-like systems") (propagated-inputs `(("python-pytz" ,python-pytz))) (native-inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + `(("python-nose" ,python-nose))) (home-page "https://github.com/kurtraschke/pyRFC3339") (synopsis "Python timestamp library") (description "Python library for generating and parsing RFC 3339-compliant @@ -7755,14 +7762,14 @@ timestamps.") (define-public python-werkzeug (package (name "python-werkzeug") - (version "0.11.11") + (version "0.11.15") (source (origin (method url-fetch) (uri (pypi-uri "Werkzeug" version)) (sha256 (base32 - "1rgpq8a2qv26d75v9j3b074inirlyy6y4b5x4rxblp202jy4cb77")))) + "1h5wycw8yj7q0grqsjnsqflmrlsdagvl2j4dsgdncci6mjc7fpa5")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest))) @@ -7794,9 +7801,8 @@ addon modules.") ;; required to parse the keyword 'install_requires' in setup.py. (patches (search-patches "python-configobj-setuptools.patch")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-six" ,python-six))) + (propagated-inputs + `(("python-six" ,python-six))) (synopsis "Config file reading, writing and validation") (description "ConfigObj is a simple but powerful config file reader and writer: an ini file round tripper. Its main feature is that it is very easy to @@ -7837,15 +7843,13 @@ be set via config files and/or environment variables.") (define-public python-ndg-httpsclient (package (name "python-ndg-httpsclient") - (version "0.4.0") + (version "0.4.2") (source (origin (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/source/n/ndg-httpsclient/" - "ndg_httpsclient-" version ".tar.gz")) + (uri (pypi-uri "ndg_httpsclient" version)) (sha256 (base32 - "0x32ibixm3vv5m9xfk83xsqm8xcqw4dd0khbh6qbri6rxgymbhg8")))) + "1b5qirv46v4dpnmfqviwq42mdwfcby4dxmz0i41wad2337pqf2aq")))) (build-system python-build-system) (arguments '(;; The tests appear to require networking. @@ -7934,10 +7938,8 @@ tables.") (base32 "0h9glp1jll3z76ly3kg08aqgxqk0a68p4zi9yn50353bh5nj92v7")))) (build-system python-build-system) - (native-inputs - `(("python-six" ,python-six))) ; for tests - (inputs - `(("python-setuptools" ,python-setuptools))) + (propagated-inputs + `(("python-six" ,python-six))) (home-page "https://github.com/liris/websocket-client") (synopsis "WebSocket client for Python") (description "The Websocket-client module provides the low level APIs for @@ -7962,14 +7964,10 @@ WebSocket usage in Python programs.") (description "Library for atomic file writes using platform dependent tools for atomic file system operations.") (home-page "https://github.com/untitaker/python-atomicwrites") - (license license:expat) - (properties `((python2-variant . ,(delay python2-atomicwrites)))))) + (license license:expat))) (define-public python2-atomicwrites - (package (inherit (package-with-python2 - (strip-python2-variant python-atomicwrites))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-atomicwrites)) (define-public python-requests-toolbelt (package @@ -8022,13 +8020,13 @@ applications.") (define-public python-click-log (package (name "python-click-log") - (version "0.1.3") + (version "0.1.8") (source (origin (method url-fetch) (uri (pypi-uri "click-log" version)) (sha256 (base32 - "0kdd1vminxpcfczxl2kkf285n0dr1gxh2cdbx1p6vkj7b7bci3gx")))) + "14ikfjfgnzf21mjniq9lfk2igzykgzfvwwrk85nw2b9fq44109sp")))) (build-system python-build-system) (propagated-inputs `(("python-click" ,python-click))) @@ -8049,22 +8047,17 @@ applications.") (base32 "1iks5701qnp3dlr3q1d9qm68y2plp2m029irhpz92a44psfkjf1f")))) (build-system python-build-system) - (inputs + (native-inputs `(("python-pytest" ,python-pytest))) (synopsis "Namespace control and lazy-import mechanism") (description "With apipkg you can control the exported namespace of a Python package and greatly reduce the number of imports for your users. It is a small pure Python module that works on virtually all Python versions.") (home-page "https://bitbucket.org/hpk42/apipkg") - (license license:expat) - (properties `((python2-variant . ,(delay python2-apipkg)))))) + (license license:expat))) (define-public python2-apipkg - (package - (inherit (package-with-python2 - (strip-python2-variant python-apipkg))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-apipkg)) (define-public python-execnet (package @@ -8085,7 +8078,7 @@ pure Python module that works on virtually all Python versions.") (native-inputs `(("python-pytest" ,python-pytest) ("python-setuptools-scm" ,python-setuptools-scm))) - (inputs + (propagated-inputs `(("python-apipkg" ,python-apipkg))) (synopsis "Rapid multi-Python deployment") (description "Execnet provides a share-nothing model with @@ -8098,17 +8091,32 @@ minimal and fast API targetting the following uses: @item write scripts to administer multiple environments @end enumerate") (home-page "http://codespeak.net/execnet/") - (license license:expat) - (properties `((python2-variant . ,(delay python2-execnet)))))) + (license license:expat))) (define-public python2-execnet - (let ((execnet (package-with-python2 - (strip-python2-variant python-execnet)))) - (package - (inherit execnet) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs execnet)))))) + (package-with-python2 python-execnet)) + +(define-public python-trollius-redis + (package + (name "python-trollius-redis") + (version "0.1.4") + (source + (origin + (method url-fetch) + (uri (pypi-uri "trollius_redis" version)) + (sha256 + (base32 + "0k3vypszmgmaipgw9xscvgm79h2zd6p6ci8gdp5sxl6g5kbqr9fy")))) + (build-system python-build-system) + (home-page "https://github.com/benjolitz/trollius-redis") + (synopsis "Port of asyncio-redis to trollius") + (description "@code{trollius-redis} is a Redis client for Python + trollius. It is an asynchronious IO (PEP 3156) implementation of the + Redis protocol.") + (license license:bsd-2))) + +(define-public python2-trollius-redis + (package-with-python2 python-trollius-redis)) ;;; The software provided by this package was integrated into pytest 2.8. (define-public python-pytest-cache @@ -8122,7 +8130,7 @@ minimal and fast API targetting the following uses: (base32 "1a873fihw4rhshc722j4h6j7g3nj7xpgsna9hhg3zn6ksknnhx5y")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-apipkg" ,python-apipkg) ("python-execnet" ,python-execnet) ("python-py" ,python-py) @@ -8131,17 +8139,10 @@ minimal and fast API targetting the following uses: (description "The pytest-cache plugin provides tools to rerun failures from the last py.test invocation.") (home-page "https://bitbucket.org/hpk42/pytest-cache/") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-cache)))))) + (license license:expat))) (define-public python2-pytest-cache - (let ((pytest-cache (package-with-python2 - (strip-python2-variant python-pytest-cache)))) - (package - (inherit pytest-cache) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs pytest-cache)))))) + (package-with-python2 python-pytest-cache)) (define-public python-pytest-localserver (package @@ -8164,7 +8165,7 @@ the last py.test invocation.") `(("python-pytest" ,python-pytest) ("python-requests" ,python-requests) ("python-six" ,python-six))) - (inputs + (propagated-inputs `(("python-werkzeug" ,python-werkzeug))) (synopsis "Py.test plugin to test server connections locally") (description "Pytest-localserver is a plugin for the pytest testing @@ -8186,13 +8187,13 @@ framework which enables you to test server connections locally.") (base32 "0kjj2v2dvmnpdd5h5gk9rzz0f54rhjb0yiz3zg65bmp65slfw65d")))) (build-system python-build-system) + (propagated-inputs + `(("python-six" ,python-six))) (native-inputs `(("python-pytest" ,python-pytest) - ("python-six" ,python-six) + ("python-httplib2" ,python-httplib2) + ("python-requests" ,python-requests) ("python-urllib3" ,python-urllib3))) - (propagated-inputs - `(("python-httplib2" ,python-httplib2) - ("python-requests" ,python-requests))) (synopsis "Puts a WSGI application in place of a real URI for testing") (description "Wsgi_intercept installs a WSGI application in place of a real URI for testing. Testing a WSGI application normally involves starting a @@ -8228,13 +8229,13 @@ processes across test runs.") (define-public python-icalendar (package (name "python-icalendar") - (version "3.11") + (version "3.11.1") (source (origin (method url-fetch) (uri (pypi-uri "icalendar" version)) (sha256 (base32 - "01v2f3swd5s72x65cdihw83dx1z799b4i49a6ncg7vqmcm20wapd")))) + "1bvi7rzh7scl4nmgj2n2cy7k0v3p29y15cqy2hcdnfq9mnhdr63y")))) (build-system python-build-system) (propagated-inputs `(("python-dateutil-2" ,python-dateutil-2) @@ -8257,8 +8258,7 @@ files for use with Python.") "1d7gam3mn8v4in4p16yn3v10vps7nnaz6ilw99j4klij39dqd37p")))) (build-system python-build-system) (propagated-inputs - `(("python-docutils" ,python-docutils) - ("python-sphinx" ,python-sphinx))) + `(("python-sphinx" ,python-sphinx))) (synopsis "News Feed extension for Sphinx") (description "Sphinxcontrib-newsfeed is an extension for adding a simple Blog, News or Announcements section to a Sphinx website.") @@ -8276,8 +8276,6 @@ Blog, News or Announcements section to a Sphinx website.") (base32 "057qzi46h5dmxdqknsbrssn78lmqjlnm624iqdhrnpk26zcbi1d7")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/kennethreitz/args") (synopsis "Command-line argument parser") (description @@ -8298,9 +8296,8 @@ Blog, News or Announcements section to a Sphinx website.") (base32 "1an5lkkqk1zha47198p42ji3m94xmzx1a03dn7866m87n4r4q8h5")))) (build-system python-build-system) - (inputs - `(("python-args" ,python-args) - ("python-setuptools" ,python-setuptools))) + (propagated-inputs + `(("python-args" ,python-args))) (home-page "https://github.com/kennethreitz/clint") (synopsis "Command-line interface tools") (description @@ -8323,8 +8320,6 @@ output, progress bar display, and pipes.") (base32 "1fdafq5hkis1fxqlmhw0sn44zp2ar46nxhbc22cvwg7hsd8z5gsa")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/berkerpeksag/astor") (synopsis "Read and write Python ASTs") (description @@ -8346,9 +8341,8 @@ Abstract Syntax Tree.") (base32 "12rp1d9ba7nvd5rhaxi6xzx1rm67r1k1ylsrkzhpwnphqpb06cvj")))) (build-system python-build-system) - (inputs - `(("python-appdirs" ,python-appdirs) - ("python-setuptools" ,python-setuptools))) + (propagated-inputs + `(("python-appdirs" ,python-appdirs))) (home-page "https://github.com/alex/rply") (synopsis "Parser generator for Python") (description @@ -8371,11 +8365,10 @@ with a new public API, and RPython support.") (base32 "1msqv747iz12r73mz4qvsmlwkddwjvrahlrk7ysrcz07h7dsscxs")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-astor" ,python-astor) ("python-clint" ,python-clint) - ("python-rply" ,python-rply) - ("python-setuptools" ,python-setuptools))) + ("python-rply" ,python-rply))) (home-page "http://hylang.org/") (synopsis "Lisp frontend to Python") (description @@ -8401,7 +8394,7 @@ Python at your fingertips, in Lisp form.") (build-system python-build-system) (arguments `(#:test-target "check")) - (inputs + (propagated-inputs `(("python-requests" ,python-requests))) (home-page "https://github.com/litl/rauth") (synopsis "Python library for OAuth 1.0/a, 2.0, and Ofly") @@ -8416,8 +8409,7 @@ authenticated session objects providing things like keep-alive.") (let ((base (package-with-python2 (strip-python2-variant python-rauth)))) (package (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2) + (native-inputs `(("python2-unittest2" ,python2-unittest2) ,@(package-native-inputs base)))))) (define-public python2-functools32 @@ -8435,8 +8427,6 @@ authenticated session objects providing things like keep-alive.") (arguments `(#:python ,python-2 #:tests? #f)) ; no test target - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (home-page "https://github.com/MiCHiLU/python-functools32") (synopsis "Backport of the functools module from Python 3.2.3") @@ -8458,8 +8448,6 @@ authenticated session objects providing things like keep-alive.") "1vcb34dqhzkhbq1957vdjszhhm5y3j9ba88dgwhqx2zynhmk9qig")))) (build-system python-build-system) (arguments `(#:python ,python-2)) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (home-page "https://github.com/agronholm/pythonfutures") (synopsis "Backport of the concurrent.futures package from Python 3.2") @@ -8500,7 +8488,6 @@ concurrent.futures package from Python 3.2") (native-inputs `(("python2-futures" ,python2-futures) ("python2-pytest" ,python2-pytest) - ("python2-setuptools" ,python2-setuptools) ,@(package-native-inputs promise)))))) (define-public python-urllib3 @@ -8517,13 +8504,12 @@ concurrent.futures package from Python 3.2") (build-system python-build-system) (arguments `(#:tests? #f)) (native-inputs - `(("python-setuptools" ,python-setuptools) - ;; some packages for tests + `(;; some packages for tests ("python-nose" ,python-nose) ("python-mock" ,python-mock) ("python-tornado" ,python-tornado))) (propagated-inputs - `(;; packages for https security + `(;; extra packages for https security ("python-certifi" ,python-certifi) ("python-ndg-httpsclient" ,python-ndg-httpsclient) ("python-pyasn1" ,python-pyasn1) @@ -8551,8 +8537,6 @@ supports url redirection and retries, and also gzip and deflate decoding.") (base32 "1716z9pq1r5ys3nkg7wdrb3h2f9rmd0zdxpxzmx3bgwgf6xg48gb")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (synopsis "colored terminal text rendering for Python") (description "Colorama is a Python library for rendering colored terminal text.") @@ -8574,9 +8558,8 @@ text.") (base32 "1dcxvszbikgzh99ybdc7jq0zb9wspy2ds8z9mjsqiyv3q884xpr5")))) (build-system python-build-system) - (inputs - `(("python-pyasn1" ,python-pyasn1) - ("python-setuptools" ,python-setuptools))) + (propagated-inputs + `(("python-pyasn1" ,python-pyasn1))) (synopsis "Pure-Python RSA implementation") (description "Python-RSA is a pure-Python RSA implementation. It supports encryption and decryption, signing and verifying signatures, and key @@ -8600,8 +8583,6 @@ library as well as on the command line.") (base32 "18qfzfm40bgx672lkg8q9x5hdh76n7vax99aank7vh2nw21wg70m")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (synopsis "Plugin and hook calling mechanism for Python") (description "Pluggy is an extraction of the plugin manager as used by Pytest but stripped of Pytest specific details.") @@ -8624,15 +8605,16 @@ Pytest but stripped of Pytest specific details.") "1vj73ar4rimq3fwy5r2z3jv4g9qbh8rmpmncsc00g0k310acqzxz")))) (build-system python-build-system) (arguments - ;; FIXME: Tests require a newer version of pytest, but upgrading our - ;; pytest breaks other packages. + ;; FIXME: Tests require pytest-timeout, which itself requires + ;; pytest>=2.8.0 for installation. '(#:tests? #f)) - (inputs - `(("python-setuptools" ,python-setuptools) - ("python-pluggy" ,python-pluggy) + (propagated-inputs + `(("python-pluggy" ,python-pluggy) ; >=0.3.0,<0.4.0 ("python-py" ,python-py) - ("python-virtualenv" ,python-virtualenv) - ("python-pytest" ,python-pytest))) + ("python-virtualenv" ,python-virtualenv))) + (native-inputs + `(; FIXME: Missing: ("python-pytest-timeout" ,python-pytest-timeout) + ("python-pytest" ,python-pytest))) ; >= 2.3.5 (home-page "http://tox.testrun.org/") (synopsis "Virtualenv-based automation of test activities") (description "Tox is a generic virtualenv management and test command line @@ -8657,8 +8639,6 @@ servers.") (base32 "0g9xvl69y7nr3w7ag4fsp6sm4fqf6vrqjw7504x2hzrrsh3ampq8")))) (build-system python-build-system) - (inputs - `(("python-setuptools" ,python-setuptools))) (synopsis "JSON Matching Expressions") (description "JMESPath (pronounced “james path”) is a Python library that allows one to declaratively specify how to extract elements from a JSON @@ -8681,15 +8661,16 @@ document.") (base32 "1zxczlwqy9bl27d9bc5x99mb5mcsxm350240lp5nx7014xb311lj")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-dateutil" ,python-dateutil-2) ("python-docutils" ,python-docutils) - ("python-mock" ,python-mock) + ("python-jmespath" ,python-jmespath))) + (native-inputs + `(("python-mock" ,python-mock) ("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools) + ("behave" ,behave) ("python-tox" ,python-tox) - ("python-wheel" ,python-wheel) - ("python-jmespath" ,python-jmespath))) + ("python-wheel" ,python-wheel))) (home-page "https://github.com/boto/botocore") (synopsis "Low-level interface to AWS") (description "Botocore is a Python library that provides a low-level @@ -8702,27 +8683,27 @@ interface to the Amazon Web Services (AWS) API.") (define-public awscli (package (name "awscli") - (version "1.11.5") + (version "1.11.35") (source (origin (method url-fetch) (uri (pypi-uri name version)) (sha256 (base32 - "0lclasm0wnayd3b8zl9l91i32nbgrhh0ncf9lksss4cv0myfwmfg")))) + "0k6y8cg311bqak5x9pilg80w6f76dcbzm6xcdrw6rjnk6v4xwy70")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-colorama" ,python-colorama) + ("python-botocore" ,python-botocore) + ("python-s3transfer" ,python-s3transfer) ("python-docutils" ,python-docutils) - ("python-mock" ,python-mock) + ("python-rsa" ,python-rsa))) + (native-inputs + `(("python-mock" ,python-mock) ("python-nose" ,python-nose) - ("python-rsa" ,python-rsa) - ("python-setuptools" ,python-setuptools) ("python-sphinx" ,python-sphinx) ("python-tox" ,python-tox) - ("python-wheel" ,python-wheel) - ("python-botocore" ,python-botocore) - ("python-s3transfer" ,python-s3transfer))) + ("python-wheel" ,python-wheel))) (home-page "http://aws.amazon.com/cli/") (synopsis "Command line client for AWS") (description "AWS CLI provides a unified command line interface to the @@ -8757,8 +8738,7 @@ seamlessly into your existing Python unit testing work flow.") (strip-python2-variant python-hypothesis)))) (package (inherit hypothesis) (native-inputs - `(("python2-enum34" ,python2-enum34) - ("python2-setuptools" ,python2-setuptools)))))) + `(("python2-enum34" ,python2-enum34)))))) (define-public python-pytest-subtesthack (package @@ -8771,9 +8751,6 @@ seamlessly into your existing Python unit testing work flow.") (base32 "15kzcr5pchf3id4ikdvlv752rc0j4d912n589l4rifp8qsj19l1x")))) (build-system python-build-system) - (native-inputs - `(;; setuptools required for python-2 variant - ("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-pytest" ,python-pytest))) (synopsis "Set-up and tear-down fixtures for unit tests") @@ -8788,10 +8765,10 @@ normally the case.") (define-public python2-pytest-subtesthack (package-with-python2 python-pytest-subtesthack)) -(define-public python2-xdo +(define-public python-xdo (package - (name "python2-xdo") - (version "0.2") + (name "python-xdo") + (version "0.3") (source (origin (method url-fetch) (uri (string-append @@ -8799,11 +8776,10 @@ normally the case.") "python-xdo_" version ".orig.tar.gz")) (sha256 (base32 - "1kl5c1p0dyxf62plnk6fl77ycfb4whwjms16r14dxx8kn90hlqz4")))) + "1vqh1n5yy5dhnq312kwrl90fnck4v26is3lq3lxdvcn60vv19da0")))) (build-system python-build-system) (arguments - `(#:python ,python-2 - #:tests? #f)) ; no tests provided + `(#:tests? #f)) ; no tests provided (inputs `(("xdotool" ,xdotool) ("libX11" ,libx11))) @@ -8814,6 +8790,9 @@ input. (Note that this is mostly a legacy library; you may wish to look at python-xdo for newer bindings.)") (license license:bsd-3))) +(define-public python2-xdo + (package-with-python2 python-xdo)) + (define-public python-wtforms (package (name "python-wtforms") @@ -8846,46 +8825,36 @@ python-xdo for newer bindings.)") "WTForms is a flexible forms validation and rendering library for Python web development. It is very similar to the web form API available in Django, but is a standalone package.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-wtforms)))))) + (license license:bsd-3))) (define-public python2-wtforms - (package - (inherit (package-with-python2 - (strip-python2-variant python-wtforms))) - (inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-wtforms)) (define-public python-mako (package (name "python-mako") - (version "1.0.3") + (version "1.0.6") (source (origin (method url-fetch) (uri (pypi-uri "Mako" version)) (sha256 (base32 - "136kcjbs0s98qkx8a418b05dfblqp0kiiqyx8vhx4rarwc7bqi3n")))) + "03dyxgjknp4ffsv7vwfd28l5bbpzi0ylp20543wpg3iahyyrwma8")))) (build-system python-build-system) + (propagated-inputs + `(("python-markupsafe" ,python-markupsafe))) (native-inputs - `(("python-markupsafe" ,python-markupsafe) - ("python-mock" ,python-mock) + `(("python-mock" ,python-mock) ("python-nose" ,python-nose))) (home-page "http://www.makotemplates.org/") (synopsis "Templating language for Python") (description "Mako is a templating language for Python that compiles templates into Python modules.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-mako)))))) + (license license:expat))) (define-public python2-mako - (let ((base (package-with-python2 - (strip-python2-variant python-mako)))) - (package - (inherit base) - (native-inputs - (cons `("python2-setuptools" ,python2-setuptools) - (package-native-inputs base)))))) + (package-with-python2 python-mako)) (define-public python-waitress (package @@ -8903,14 +8872,10 @@ templates into Python modules.") (synopsis "Waitress WSGI server") (description "Waitress is meant to be a production-quality pure-Python WSGI server with very acceptable performance.") - (license license:zpl2.1) - (properties `((python2-variant . ,(delay python2-waitress)))))) + (license license:zpl2.1))) (define-public python2-waitress - (package - (inherit (package-with-python2 - (strip-python2-variant python-waitress))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-waitress)) (define-public python-wsgiproxy2 (package @@ -8943,16 +8908,10 @@ server with very acceptable performance.") WSGIProxy turns WSGI function calls into HTTP requests. It also includes code to sign requests and pass private data, and to spawn subprocesses to handle requests.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-wsgiproxy2)))))) + (license license:expat))) (define-public python2-wsgiproxy2 - (let ((wsgiproxy2 (package-with-python2 - (strip-python2-variant python-wsgiproxy2)))) - (package - (inherit wsgiproxy2) - (inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-inputs wsgiproxy2)))))) + (package-with-python2 python-wsgiproxy2)) (define-public python-pastedeploy (package @@ -8968,10 +8927,6 @@ and to spawn subprocesses to handle requests.") (build-system python-build-system) (native-inputs `(("python-nose" ,python-nose))) - (propagated-inputs - ;; This package uses pkg_resources, part of setuptools, during runtime, - ;; hence why not a native-input. - `(("python-setuptools" ,python-setuptools))) (home-page "http://pythonpaste.org/deploy/") (synopsis "Load, configure, and compose WSGI applications and servers") @@ -9002,9 +8957,7 @@ file.") (native-inputs `(("python-nose" ,python-nose))) (propagated-inputs - `(;; Uses pkg_resources provided by setuptools internally. - ("python-setuptools" ,python-setuptools) - ("python-six" ,python-six))) + `(("python-six" ,python-six))) (arguments '(;; Tests don't pass on Python 3, but work fine on Python 2. ;; (As of 2.0.2, Python 3 support in Paste is presently a bit broken, @@ -9046,9 +8999,7 @@ follows ideas flowing from WSGI (Web Standard Gateway Interface).") (native-inputs `(("python-nose" ,python-nose))) (propagated-inputs - `(;; Uses pkg_resources provided by setuptools internally. - ("python-setuptools" ,python-setuptools) - ("python-paste" ,python-paste) + `(("python-paste" ,python-paste) ("python-pastedeploy" ,python-pastedeploy))) (home-page "http://pythonpaste.org/script/") (arguments @@ -9072,14 +9023,14 @@ layouts.") (define-public python-pyquery (package (name "python-pyquery") - (version "1.2.13") + (version "1.2.17") (source (origin (method url-fetch) (uri (pypi-uri "pyquery" version)) (sha256 (base32 - "0j9fsisip21qv4xljsg5dmni1pgpvwrjyyhhql0glydc4bs5rjgv")))) + "1xia20wm0vx5dk85kcwgh13bylz8qh47ffjxssd2586r60xi783a")))) (build-system python-build-system) (native-inputs `(("python-webob" ,python-webob) @@ -9092,16 +9043,10 @@ layouts.") (description "pyquery allows you to make jQuery queries on xml documents. The API is as much as possible the similar to jQuery. pyquery uses lxml for fast xml and html manipulation.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-pyquery)))))) + (license license:bsd-3))) (define-public python2-pyquery - (let ((pyquery (package-with-python2 - (strip-python2-variant python-pyquery)))) - (package - (inherit pyquery) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs pyquery)))))) + (package-with-python2 python-pyquery)) (define-public python-webtest (package @@ -9144,16 +9089,10 @@ fast xml and html manipulation.") (description "Webtest allows you to test your Python web applications without starting an HTTP server. It supports anything that supports the minimum of WSGI.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-webtest)))))) + (license license:expat))) (define-public python2-webtest - (let ((webtest (package-with-python2 - (strip-python2-variant python-webtest)))) - (package - (inherit webtest) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs webtest)))))) + (package-with-python2 python-webtest)) (define-public python-anyjson (package @@ -9192,8 +9131,7 @@ and provides a uniform API regardless of which JSON implementation is used.") (arguments `(;; Unlike the python 3 variant, we do run tests. See above! #:tests? #t ,@(package-arguments anyjson))) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-nose" ,python2-nose)))))) + (native-inputs `(("python2-nose" ,python2-nose)))))) (define-public python-amqp (package @@ -9229,9 +9167,7 @@ alternative when librabbitmq is not available.") ;; unmaintained. Weirdly, does not do this on the python 3 ;; version? #:tests? #f - ,@(package-arguments amqp))) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs amqp)))))) + ,@(package-arguments amqp)))))) (define-public python-kombu (package @@ -9268,9 +9204,8 @@ RabbitMQ messaging server is the most popular implementation.") (strip-python2-variant python-kombu)))) (package (inherit kombu) - (inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2) - ,@(package-inputs kombu)))))) + (native-inputs `(("python2-unittest2" ,python2-unittest2) + ,@(package-native-inputs kombu)))))) (define-public python-billiard (package @@ -9302,8 +9237,7 @@ Python 2.4 and 2.5, and will draw its fixes/improvements from python-trunk.") (strip-python2-variant python-billiard)))) (package (inherit billiard) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2) + (native-inputs `(("python2-unittest2" ,python2-unittest2) ("python2-mock" ,python2-mock) ,@(package-native-inputs billiard)))))) @@ -9330,10 +9264,8 @@ Python 2.4 and 2.5, and will draw its fixes/improvements from python-trunk.") (system* "nosetests" "--exclude=^test_safe_to_remove.*"))))))) (native-inputs `(("python-nose" ,python-nose))) - (inputs + (propagated-inputs `(("python-pytz" ,python-pytz) - ("python-amqp" ,python-amqp) - ("python-anyjson" ,python-anyjson) ("python-billiard" ,python-billiard) ("python-kombu" ,python-kombu))) (home-page "http://celeryproject.org") @@ -9352,8 +9284,7 @@ synchronously (wait until ready).") (strip-python2-variant python-celery)))) (package (inherit celery) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2) + (native-inputs `(("python2-unittest2" ,python2-unittest2) ("python2-mock" ,python2-mock) ,@(package-native-inputs celery)))))) @@ -9379,14 +9310,10 @@ synchronously (wait until ready).") "This package contains codecs for transliterating ISO 10646 texts into best-effort representations using smaller coded character sets (ASCII, ISO 8859, etc.).") - (license license:expat) - (properties `((python2-variant . ,(delay python2-translitcodec)))))) + (license license:expat))) (define-public python2-translitcodec - (package - (inherit (package-with-python2 - (strip-python2-variant python-translitcodec))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-translitcodec)) (define-public python-editor (package @@ -9407,14 +9334,10 @@ ISO 8859, etc.).") (description "python-editor is a library that provides the editor module for programmatically interfacing with your system's $EDITOR.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-editor)))))) + (license license:asl2.0))) (define-public python2-editor - (package - (inherit (package-with-python2 - (strip-python2-variant python-editor))) - (inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-editor)) (define-public python-sphinxcontrib-programoutput (package @@ -9428,20 +9351,15 @@ programmatically interfacing with your system's $EDITOR.") "098as6z1s0gb4dh5xcr1fd2vpm91zj93jzvgawspxf5s4hqs0xhp")))) (build-system python-build-system) (propagated-inputs - `(("python-docutils" ,python-docutils) - ("python-sphinx" ,python-sphinx))) + `(("python-sphinx" ,python-sphinx))) (synopsis "Sphinx extension to include program output") (description "A Sphinx extension to literally insert the output of arbitrary commands into documents, helping you to keep your command examples up to date.") (home-page "https://github.com/lunaryorn/sphinxcontrib-programoutput") - (license license:bsd-2) - (properties `((python2-variant . ,(delay python2-sphinxcontrib-programoutput)))))) + (license license:bsd-2))) (define-public python2-sphinxcontrib-programoutput - (package - (inherit (package-with-python2 - (strip-python2-variant python-sphinxcontrib-programoutput))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-sphinxcontrib-programoutput)) (define-public python-sphinx-repoze-autointerface (package @@ -9455,8 +9373,7 @@ commands into documents, helping you to keep your command examples up to date.") "08ycivzf7bh4a1zcyp31hbyqs1b2c9r26raa3vxjwwmbfqr3iw4f")))) (build-system python-build-system) (propagated-inputs - `(("python-docutils" ,python-docutils) - ("python-sphinx" ,python-sphinx) + `(("python-sphinx" ,python-sphinx) ("python-zope-interface" ,python-zope-interface))) (synopsis "Auto-generate Sphinx API docs from Zope interfaces") (description "This package defines an extension for the Sphinx documentation @@ -9490,14 +9407,10 @@ introspection of @code{zope.interface} instances in code.") (synopsis "Python PostgreSQL adapter") (description "psycopg2 is a thread-safe PostgreSQL adapter that implements DB-API 2.0. ") - (license license:lgpl3+) - (properties `((python2-variant . ,(delay python2-psycopg2)))))) + (license license:lgpl3+))) (define-public python2-psycopg2 - (package - (inherit (package-with-python2 - (strip-python2-variant python-psycopg2))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-psycopg2)) (define-public python-vobject (package @@ -9513,7 +9426,7 @@ introspection of @code{zope.interface} instances in code.") (arguments '(;; The test suite relies on some non-portable Windows interfaces. #:tests? #f)) - (inputs + (propagated-inputs `(("python-dateutil-2" ,python-dateutil-2) ("python-pyicu" ,python-pyicu))) (synopsis "Parse and generate vCard and vCalendar files") @@ -9523,25 +9436,21 @@ are supported and well tested. vCard 3.0 files are supported, and all data should be imported, but only a few components are understood in a sophisticated way.") (home-page "http://eventable.github.io/vobject/") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-vobject)))))) + (license license:asl2.0))) (define-public python2-vobject - (package - (inherit (package-with-python2 - (strip-python2-variant python-vobject))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-vobject)) (define-public python-munkres (package (name "python-munkres") - (version "1.0.7") + (version "1.0.8") (source (origin (method url-fetch) (uri (pypi-uri "munkres" version)) (sha256 (base32 - "1i6nf45i0kkzdx6k70giybsqxz4dxsjbrkrfqgjd7znfkf25sjik")))) + "0mbspx4zv8id4x6pim6ybsa1xh96qwpbqj7skbqz4c9c9nf1lpqq")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; no test suite @@ -9569,21 +9478,67 @@ useful for solving the Assignment Problem.") (propagated-inputs `(("python-itsdangerous" ,python-itsdangerous) ("python-jinja2" ,python-jinja2) + ("python-click" ,python-click) ("python-werkzeug" ,python-werkzeug))) - (native-inputs - `(("python-click" ,python-click))) (home-page "https://github.com/mitsuhiko/flask/") (synopsis "Microframework based on Werkzeug, Jinja2 and good intentions") (description "Flask is a micro web framework based on the Werkzeug toolkit and Jinja2 template engine. It is called a micro framework because it does not presume or force a developer to use a particular tool or library.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-flask)))))) + (license license:bsd-3))) (define-public python2-flask - (package (inherit (package-with-python2 - (strip-python2-variant python-flask))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-flask)) + +(define-public python-flask-wtf + (package + (name "python-flask-wtf") + (version "0.13.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "Flask-WTF" version)) + (sha256 + (base32 + "04l5743j2dici46038sqlzvf0xzpg8rf7s9ld2x24xv7f4idg990")))) + (build-system python-build-system) + (propagated-inputs + `(("python-flask-babel" ,python-flask-babel) + ("python-babel" ,python-babel) + ("python-wtforms" ,python-wtforms))) + (native-inputs + `(("python-nose" ,python-nose))) + (home-page "https://github.com/lepture/flask-wtf") + (synopsis "Simple integration of Flask and WTForms") + (description "Flask-WTF integrates Flask and WTForms, including CSRF, file +upload, and reCAPTCHA.") + (license license:bsd-3))) + +(define-public python2-flask-wtf + (package-with-python2 python-flask-wtf)) + +(define-public python-flask-multistatic + (package + (name "python-flask-multistatic") + (version "1.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "flask-multistatic" version)) + (sha256 + (base32 + "0p4v50rwv64wcd0zlq7rzl4waprwr4hj19s3cgf1isywa7jcisgm")))) + (build-system python-build-system) + (propagated-inputs + `(("python-flask" ,python-flask))) + (home-page "https://pagure.io/flask-multistatic") + (synopsis "Flask plugin to allow overriding static files") + (description "@code{flask-multistatic} is a flask plugin that adds support +for overriding static files.") + (license license:gpl3+))) + +(define-public python2-flask-multistatic + (package-with-python2 python-flask-multistatic)) (define-public python-cookies (package @@ -9605,15 +9560,10 @@ presume or force a developer to use a particular tool or library.") (description "A RFC 6265-compliant HTTP cookie parser and renderer in Python.") (home-page "https://gitlab.com/sashahart/cookies") - (license license:expat) - (properties `((python2-variant . ,(delay python2-cookies)))))) + (license license:expat))) (define-public python2-cookies - (let ((cookies (package-with-python2 - (strip-python2-variant python-cookies)))) - (package (inherit cookies) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs cookies)))))) + (package-with-python2 python-cookies)) (define-public python-responses (package @@ -9631,24 +9581,19 @@ Python.") ;; https://github.com/getsentry/responses/issues/38 #:tests? #f)) (native-inputs - `(("python-cookies" ,python-cookies) - ("python-mock" ,python-mock))) + `(("python-mock" ,python-mock))) (propagated-inputs `(("python-requests" ,python-requests) + ("python-cookies" ,python-cookies) ("python-six" ,python-six))) (home-page "https://github.com/getsentry/responses") (synopsis "Utility for mocking out the `requests` Python library") (description "A utility library for mocking out the `requests` Python library.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-responses)))))) + (license license:asl2.0))) (define-public python2-responses - (let ((responses (package-with-python2 - (strip-python2-variant python-responses)))) - (package (inherit responses) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs responses)))))) + (package-with-python2 python-responses)) (define-public python-whoosh (package @@ -9663,8 +9608,7 @@ library.") "10qsqdjpbc85fykc1vgcs8xwbgn4l2l52c8d83xf1q59pwyn79bw")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-pytest" ,python-pytest))) + `(("python-pytest" ,python-pytest))) (home-page "http://bitbucket.org/mchaput/whoosh") (synopsis "Full text indexing, search, and spell checking library") (description @@ -9734,8 +9678,7 @@ anymore.") (arguments `(#:python ,python-2)) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-six" ,python2-six))) + `(("python2-six" ,python2-six))) (home-page "http://pypi.python.org/pypi/pathlib2/") (synopsis "Object-oriented file system paths - backport of standard pathlib module") @@ -9759,13 +9702,13 @@ ambiguities (forward vs. backward slashes, etc.). (define-public python-jellyfish (package (name "python-jellyfish") - (version "0.5.3") + (version "0.5.6") (source (origin (method url-fetch) (uri (pypi-uri "jellyfish" version)) (sha256 (base32 - "12bxh8cy9xmvyrjz7aw159nd5pyvb645rkvw4r6bvm4xbvs8gd07")))) + "1j9rplb16ba2prjj6mip46z0w9pnhnqpwgiwi0x93vnas14rlyl8")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest))) @@ -9780,8 +9723,7 @@ encoding algorithms to do fuzzy string matching.") (let ((jellyfish (package-with-python2 (strip-python2-variant python-jellyfish)))) (package (inherit jellyfish) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ("python2-unicodecsv" ,python2-unicodecsv) + (native-inputs `(("python2-unicodecsv" ,python2-unicodecsv) ,@(package-native-inputs jellyfish)))))) (define-public python2-unicodecsv @@ -9803,8 +9745,7 @@ encoding algorithms to do fuzzy string matching.") `(;; It supports Python 3, but Python 3 can already do Unicode CSV. #:python ,python-2)) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-unittest2" ,python2-unittest2))) + `(("python2-unittest2" ,python2-unittest2))) (home-page "https://github.com/jdunck/python-unicodecsv") (synopsis "Unicode CSV module for Python 2") (description "Unicodecsv is a drop-in replacement for Python 2.7's CSV @@ -9814,15 +9755,13 @@ module, adding support for Unicode strings.") (define-public python-rarfile (package (name "python-rarfile") - (version "2.7") + (version "2.8") (source (origin (method url-fetch) (uri (pypi-uri "rarfile" version)) (sha256 (base32 - "0d8n1dlpiz7av8dmbp0vclrwl9cnxizr4f2c9xvj1h5nvn480527")) - ;; https://github.com/markokr/rarfile/pull/17/ - (patches (search-patches "python-rarfile-fix-tests.patch")))) + "0qfad483kcbga0bn4qmcz953xjk16r52fahiy46zzn56v80y89ra")))) (build-system python-build-system) (arguments '(#:phases @@ -9892,8 +9831,6 @@ is made as zipfile like as possible.") port) (close-port port) #t)))))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (inputs ;; python-magic needs to be able to find libmagic.so. `(("file" ,file))) @@ -9928,9 +9865,7 @@ the same purpose: to provide Python bindings for libmagic.") ;; s3cmd is written for python2 only and contains no tests. `(#:python ,python-2 #:tests? #f)) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) - (inputs + (propagated-inputs `(("python2-dateutil" ,python2-dateutil) ;; The python-file package also provides a magic.py module. ;; This is an unfortunate state of affairs; however, s3cmd @@ -9963,17 +9898,13 @@ CloudFront content delivery network.") "1pw0kmvc57sjmaxi6c54fqsnihqj6hvhc9y1vaz36axafzqam7bh")))) (build-system python-build-system) (native-inputs - `(("python-nose" ,python-nose) - ("python-setuptools" ,python-setuptools))) + `(("python-nose" ,python-nose))) (inputs `(("pkg-config" ,pkg-config))) (arguments `(;; Tests fail with "ValueError: _type_ 'v' not supported" on Python 3, ;; and on Python 2 they need the dl module deprecated since Python 2.6. #:tests? #f - ;; Prevent creation of the egg. This works around - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 . - #:configure-flags '("--single-version-externally-managed" "--root=/") ;; Hard-code the path to pkg-config. #:phases (modify-phases %standard-phases @@ -10024,8 +9955,6 @@ development version of CPython that are not available in older releases.") (strip-python2-variant python-bz2file)))) (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:python ,python-2 #:phases @@ -10058,15 +9987,10 @@ development version of CPython that are not available in older releases.") "@code{python-future} is the missing compatibility layer between Python 2 and Python 3. It allows you to use a single, clean Python 3.x-compatible codebase to support both Python 2 and Python 3 with minimal overhead.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-future)))))) + (license license:expat))) (define-public python2-future - (let ((base (package-with-python2 - (strip-python2-variant python-future)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools)))))) + (package-with-python2 python-future)) (define-public python-cysignals (package @@ -10082,7 +10006,6 @@ to support both Python 2 and Python 3 with minimal overhead.") (build-system python-build-system) (native-inputs `(("python-cython" ,python-cython) - ("python-setuptools" ,python-setuptools) ("python-sphinx" ,python-sphinx))) (inputs `(("pari-gp" ,pari-gp))) @@ -10144,7 +10067,6 @@ respectively.") " line += ' -L" pcre "/lib" " -L " libgc "/lib'"))) #t)))))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))) (inputs `(("pcre" ,pcre) ("libgc" ,libgc))) (home-page "https://shedskin.github.io/") @@ -10170,8 +10092,7 @@ Python. It generates C++ code and a Makefile.")) `(#:python ,python-2)) (build-system python-build-system) (native-inputs - `(("python2-unittest2" ,python2-unittest2) - ("python2-setuptools" ,python2-setuptools))) + `(("python2-unittest2" ,python2-unittest2))) (home-page "https://github.com/python-rope/rope") (synopsis "Refactoring library for Python") (description "Rope is a refactoring library for Python. It facilitates @@ -10192,8 +10113,6 @@ to occurences in strings and comments.") (base32 "0i283z1pivmir61z8kbiycigc94l61v33ygzkhczf1ifq7cppyds")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/ultrabug/py3status") (synopsis "Extensible i3status wrapper written in Python") (description "py3status is an i3status wrapper which extends i3status @@ -10225,7 +10144,6 @@ own code, responding to click events and updating clock every second.") (zero? (system* "py.test" "-vv" "tests" "README.rst"))))))) (native-inputs `(("python-pytest" ,python-pytest) - ("python-setuptools" ,python-setuptools) ("python-six" ,python-six))) (home-page "https://github.com/ionelmc/python-tblib") (synopsis "Traceback serialization library") @@ -10267,8 +10185,7 @@ multiple processes (imagine multiprocessing, billiard, futures, celery etc). (system* "2to3" "--no-diff" "-wn" "sqlparse" "tests")) (zero? (system* "py.test"))))))) (native-inputs - `(("python-pytest" ,python-pytest) - ("python-setuptools" ,python-setuptools))) + `(("python-pytest" ,python-pytest))) (home-page "https://github.com/andialbrecht/sqlparse") (synopsis "Non-validating SQL parser") (description "Sqlparse is a non-validating SQL parser for Python. It @@ -10281,16 +10198,14 @@ provides support for parsing, splitting and formatting SQL statements.") (define-public python-greenlet (package (name "python-greenlet") - (version "0.4.9") + (version "0.4.11") (source (origin (method url-fetch) (uri (pypi-uri "greenlet" version)) (sha256 (base32 - "04h0m54dyqg49vyarq26mry6kbivnpl47rnmmrk9qn8wpfxviybr")))) + "1xhik26j4f3kc4qw9xmj0c567rb5h1zryb4ijwqnqwwjvfhbv59h")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://greenlet.readthedocs.io/") (synopsis "Lightweight in-process concurrent programming") (description @@ -10327,8 +10242,7 @@ are synchronized with data exchanges on \"channels\".") (propagated-inputs `(("python-greenlet" ,python-greenlet))) (native-inputs - `(("python-setuptools" ,python-setuptools) - ("python-six" ,python-six))) + `(("python-six" ,python-six))) (inputs `(("c-ares" ,c-ares) ("libev" ,libev))) @@ -10353,8 +10267,6 @@ to provide a high-level synchronous API on top of the libev event loop.") (base32 "0ydxrp9myw1mvsz3qfzx5579y5llmqa82pxvqchgp5syczffi450")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-zope-interface" ,python-zope-interface))) (home-page "https://twistedmatrix.com/") @@ -10397,30 +10309,23 @@ network support library.") (define-public python-ply (package (name "python-ply") - (version "3.8") + (version "3.9") (source (origin (method url-fetch) - (uri (string-append - "https://pypi.python.org/packages/" - "96/e0/430fcdb6b3ef1ae534d231397bee7e9304be14a47a267e82ebcb3323d0b5" - "/ply-" version ".tar.gz")) + (uri (pypi-uri "ply" version)) (sha256 (base32 - "1f70ipynmiy09k6px2j7v4w5cdrc21za3xs2k6f1bsvb0bzvvlg7")))) + "0gpl0yli3w03ipyqfrp3w5nf0iawhsq65anf5wwm2wf5p502jzhd")))) (build-system python-build-system) (home-page "http://www.dabeaz.com/ply/") (synopsis "Python Lex & Yacc") (description "PLY is a @code{lex}/@code{yacc} implemented purely in Python. It uses LR parsing and does extensive error checking.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-ply)))))) + (license license:bsd-3))) (define-public python2-ply - (package - (inherit (package-with-python2 - (strip-python2-variant python-ply))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-ply)) (define-public python-tabulate (package @@ -10441,8 +10346,7 @@ It uses LR parsing and does extensive error checking.") (("from common") "from nose.tools"))))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ;; For testing + `(;; For testing ("python-nose" ,python-nose))) (home-page "https://bitbucket.org/astanin/python-tabulate") (synopsis "Pretty-print tabular data") @@ -10467,8 +10371,6 @@ data in Python.") "10pb864if9qi2pq9lfb9m8f7z7ss6rml80gf1d9h64lap5crjnjj")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; XXX: needs zookeeper - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-six" ,python-six))) (home-page "https://kazoo.readthedocs.org") @@ -10497,8 +10399,6 @@ programming errors.") "1id6sr159p6aa13bxcqyr9gln8sqg1l0ddzns5iws8kk5q1p5cfv")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; XXX: needs zookeeper, kafka, etc. - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-gevent" ,python-gevent) ("python-kazoo" ,python-kazoo) @@ -10538,14 +10438,10 @@ wide-character codes. It is useful for those implementing a terminal emulator, or programs that carefully produce output to be interpreted by one. It is a Python implementation of the @code{wcwidth} and @code{wcswidth} C functions specified in POSIX.1-2001 and POSIX.1-2008.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-wcwidth)))))) + (license license:expat))) (define-public python2-wcwidth - (package - (inherit (package-with-python2 - (strip-python2-variant python-wcwidth))) - (native-inputs `(("python2-setuptools" ,python2-setuptools))))) + (package-with-python2 python-wcwidth)) (define-public python2-jsonrpclib (package @@ -10560,8 +10456,6 @@ specified in POSIX.1-2001 and POSIX.1-2008.") (base32 "02vgirw2bcgvpcxhv5hf3yvvb4h5wzd1lpjx8na5psdmaffj6l3z")))) (build-system python-build-system) - (native-inputs - `(("python2-setuptools" ,python2-setuptools))) (arguments `(#:tests? #f #:python ,python-2)) @@ -10585,8 +10479,6 @@ etc.") (base32 "016kf3irrclpkpvcm7q0gmkfibq7jgy30a9v73pp42bq9h9a32bl")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/agoragames/chai") (synopsis "Mocking framework for Python") (description @@ -10609,8 +10501,7 @@ objects, patterned after the Mocha library for Ruby.") "1bz7hkdgpqcjs866y58z8jywpy7al0f4rxdr00bh2l5qddyw245j")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ;; For testing + `(;; For testing ("python-chai" ,python-chai) ("python-simplejson" ,python-simplejson))) (propagated-inputs @@ -10637,8 +10528,6 @@ datetime type.") (base32 "1jhnxgnw8y3mbzjssixh6qkc7a3afc4fygajhqrqalnilyvpzshq")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://github.com/jpvanhal/inflection") (synopsis "Python string transformation library") (description @@ -10661,8 +10550,6 @@ underscored string.") (base32 "1hz1x9blsbxya1y9nnhnwwdnqmakxi9mc0jkwj0rn6b1h44i0f86")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://github.com/toastdriven/pylev") (synopsis "Levenshtein distance implementation in Python") (description "Pure Python Levenshtein implementation, based off the @@ -10685,8 +10572,7 @@ Wikipedia code samples at "1k2dcl6mqpn5bljyl6w42rqyd9mb3y9kh2mg7m2x3kfjwvg0rpva")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ;; For testing + `(;; For testing ("python-mock" ,python-mock) ("python-pytest" ,python-pytest))) (propagated-inputs @@ -10713,8 +10599,6 @@ docstring and colored output.") (base32 "0s22aqqkdscyh8sjspyyax7qa1aiz8p4midrnyf39717fhfczm6x")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/ionelmc/python-lazy-object-proxy") (synopsis "Lazy object proxy for python") (description @@ -10738,8 +10622,6 @@ until the object is actually required, and caches the result of said call.") "0jr4v2pd90i6l1xxbss2m05psbjaxvyvvvpq44wycijpfgjqln8i")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; XXX: requires internet access - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "http://www.dnspython.org") (synopsis "DNS toolkit for Python") (description @@ -10770,8 +10652,6 @@ It supports TSIG authenticated messages and EDNS0.") (substitute* "setup.py" (("dnspython3") "dnspython")) #t))))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-dnspython" ,python-dnspython) ("python-idna" ,python-idna))) @@ -10795,8 +10675,6 @@ It supports TSIG authenticated messages and EDNS0.") (base32 "1jwg9z4rz51mcka1821rwgycsd0mcicyp1kiwjfa2kvg8bm9p2qd")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/hamstah/ukpostcodeparser") (synopsis "UK Postcode parser for Python") (description @@ -10819,8 +10697,7 @@ parsing UK postcodes.") "0vs0dkmg0dlaxf8w6q2i3k0i03gmp56ablldv7ci9x3nbadkn71g")))) (build-system python-build-system) (native-inputs - `(("python-setuptools" ,python-setuptools) - ;; For testing + `(;; For testing ("python-email-validator" ,python-email-validator) ("python-mock" ,python-mock) ("python-ukpostcodeparser" ,python-ukpostcodeparser))) @@ -10855,8 +10732,6 @@ addresses, and phone numbers.") (base32 "1f5m28vkh4ksq3d80d8mmd2z8wxvc3mgy2pmrv2751dm2xgznm4w")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-pyyaml" ,python-pyyaml))) (home-page "https://github.com/mk-fg/pretty-yaml") @@ -10880,8 +10755,6 @@ YAML-serialized data.") (base32 "0arc6njvs6i9v9hgvzk5m50296g7zy5m9d7pyb43vdsdgxrci5gy")))) (build-system python-build-system) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://flexmock.readthedocs.org") (synopsis "Testing library for Python") (description @@ -10904,8 +10777,6 @@ mocks, stubs and fakes.") "1li49irsqha17nrda4nsb48biyy0rarp9pphf0jpqwm5zr8hv569")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; no tests - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-arrow" ,python-arrow) ("python-blinker" ,python-blinker) @@ -10935,20 +10806,21 @@ implementation for Python.") (define-public python-prompt-toolkit (package (name "python-prompt-toolkit") - (version "1.0.7") + (version "1.0.9") (source (origin (method url-fetch) (uri (pypi-uri "prompt_toolkit" version ".tar.gz")) (sha256 (base32 - "1vyjd0b7wciv55i19l44zy0adx8q7ss79lhy2r9d1rwz2y4822zg")))) + "172r15k9kwdw2lnajvpz1632dd16nqz1kcal1p0lq5ywdarj6rfd")))) (build-system python-build-system) (arguments '(#:tests? #f)) ; The test suite uses some Windows-specific data types. - (inputs `(("python-wcwidth" ,python-wcwidth) - ("python-pygments" ,python-pygments))) - (native-inputs `(("python-six" ,python-six))) + (propagated-inputs + `(("python-wcwidth" ,python-wcwidth) + ("python-six" ,python-six) + ("python-pygments" ,python-pygments))) (home-page "https://github.com/jonathanslenders/python-prompt-toolkit") (synopsis "Library for building command line interfaces in Python") (description @@ -10957,16 +10829,10 @@ interfaces in Python. It's like GNU Readline but it also features syntax highlighting while typing, out-of-the-box multi-line input editing, advanced code completion, incremental search, support for Chinese double-width characters, mouse support, and auto suggestions.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-prompt-toolkit)))))) + (license license:bsd-3))) (define-public python2-prompt-toolkit - (let ((base (package-with-python2 (strip-python2-variant python-prompt-toolkit)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-prompt-toolkit)) (define-public python-jedi (package @@ -10985,16 +10851,10 @@ characters, mouse support, and auto suggestions.") "Autocompletion for Python that can be used for text editors") (description "Jedi is an autocompletion tool for Python that can be used for text editors.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-jedi)))))) + (license license:expat))) (define-public python2-jedi - (let ((base (package-with-python2 (strip-python2-variant python-jedi)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-jedi)) (define-public ptpython (package @@ -11007,12 +10867,11 @@ characters, mouse support, and auto suggestions.") (base32 "1mmbiyzf0n8hm7z2a562x7w5cbl6jc0zsk6vp40q1z4cyblv1k13")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-docopt" ,python-docopt) ("python-jedi" ,python-jedi) ("python-prompt-toolkit" ,python-prompt-toolkit) - ("python-pygments" ,python-pygments) - ("python-setuptools" ,python-setuptools))) + ("python-pygments" ,python-pygments))) (home-page "https://github.com/jonathanslenders/ptpython") (synopsis "Python Read-Eval-Print-Loop with nice IDE-like features") (description @@ -11052,7 +10911,7 @@ etc.") (native-inputs `(("python-requests-mock" ,python-requests-mock) ("python-mock" ,python-mock))) - (inputs + (propagated-inputs `(("python-oauthlib" ,python-oauthlib) ("python-requests" ,python-requests))) (home-page @@ -11062,27 +10921,22 @@ etc.") (description "Requests-OAuthlib uses the Python Requests and OAuthlib libraries to provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients.") - (license license:isc) - (properties `((python2-variant . ,(delay python2-requests-oauthlib)))))) + (license license:isc))) (define-public python2-requests-oauthlib - (let ((base (package-with-python2 (strip-python2-variant python-requests-oauthlib)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-requests-oauthlib)) (define-public python-stem (package (name "python-stem") - (version "1.4.1b") + (version "1.5.3") (source (origin (method url-fetch) - (uri (pypi-uri "stem" version ".tar.bz2")) + (uri (pypi-uri "stem" version)) (sha256 (base32 - "09a3amp1y351nwz088ckiibbp666qi2lxwkyknavswfm400s0ns7")))) + "0fm67dfx6qaj0mg80r4yw2i72birpzn7cnbyz4p1857max3zfc97")))) (build-system python-build-system) (arguments `(#:phases @@ -11094,8 +10948,6 @@ provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients." `(("python-mock" ,python-mock) ("python-pep8" ,python-pep8) ("python-pyflakes" ,python-pyflakes))) - (inputs - `(("python-pycrypto" ,python-pycrypto))) (home-page "https://stem.torproject.org/") (synopsis "Python controller library that allows applications to interact with Tor") @@ -11126,16 +10978,10 @@ relays publish about themselves.") (description "@code{pyserial} provide serial port bindings for Python. It supports different byte sizes, stop bits, parity and flow control with RTS/CTS and/or Xon/Xoff. The port is accessed in RAW mode.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-pyserial)))))) + (license license:bsd-3))) (define-public python2-pyserial - (let ((base (package-with-python2 (strip-python2-variant python-pyserial)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pyserial)) (define-public python-kivy (package @@ -11162,10 +11008,10 @@ and/or Xon/Xoff. The port is accessed in RAW mode.") "/include/SDL2")) #t))))) (native-inputs - `(("pkg-config" ,pkg-config))) + `(("pkg-config" ,pkg-config) + ("python-cython" ,python-cython))) (inputs - `(("python-cython" ,python-cython) - ("gstreamer" ,gstreamer) + `(("gstreamer" ,gstreamer) ("mesa" ,mesa) ("sdl-union" ,(sdl-union (list sdl2 sdl2-image sdl2-mixer sdl2-ttf))))) @@ -11212,7 +11058,7 @@ hardware-accelerated multitouch applications.") (base32 "1j4f51dxic39mdwf6alj7gd769wy6mhk916v031wjali51xkh3xb")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-chardet" ,python-chardet) ("python-hypothesis" ,python-hypothesis))) (home-page "https://github.com/audreyr/binaryornot") @@ -11225,12 +11071,9 @@ binary or text.") (define-public python2-binaryornot (let ((base (package-with-python2 (strip-python2-variant python-binaryornot)))) (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base))) - (inputs + (propagated-inputs `(("python2-enum34" ,python2-enum34) - ,@(package-inputs base)))))) + ,@(package-propagated-inputs base)))))) (define-public python-nltk (package @@ -11253,15 +11096,10 @@ binary or text.") resources such as WordNet, along with a suite of text processing libraries for classification, tokenization, stemming, tagging, parsing, and semantic reasoning, wrappers for natural language processing libraries.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-nltk)))))) + (license license:asl2.0))) (define-public python2-nltk - (let ((base (package-with-python2 (strip-python2-variant python-nltk)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-nltk)) (define-public python-pymongo (package @@ -11274,20 +11112,15 @@ reasoning, wrappers for natural language processing libraries.") (base32 "07mra6w86wjqy4lx5fvimidjhhfzd562gfjn8grsnbv2q8pk0i9x")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-certifi" ,python-certifi))) (home-page "http://github.com/mongodb/mongo-python-driver") (synopsis "Python driver for MongoDB") (description "Python driver for MongoDB.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-pymongo)))))) + (license license:asl2.0))) (define-public python2-pymongo - (let ((base (package-with-python2 (strip-python2-variant python-pymongo)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pymongo)) (define-public python-sh (package @@ -11306,15 +11139,10 @@ reasoning, wrappers for natural language processing libraries.") (synopsis "Python subprocess interface") (description "Abstracts process invocation by providing a function interface for programs.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-sh)))))) + (license license:expat))) (define-public python2-sh - (let ((base (package-with-python2 (strip-python2-variant python-sh)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-sh)) (define-public python-consul (package @@ -11329,8 +11157,9 @@ interface for programs.") "0rfyxcy4cr3x848vhx876ifalxd5ghq6l5x813m49h4vq2d4jiq8")))) (build-system python-build-system) (native-inputs - `(("python-pytest" ,python-pytest) - ("python-requests" ,python-requests) + `(("python-pytest" ,python-pytest))) + (propagated-inputs + `(("python-requests" ,python-requests) ("python-six" ,python-six))) (home-page "https://github.com/cablehead/python-consul") (synopsis "Python client for Consul") @@ -11340,11 +11169,7 @@ discovery, monitoring and configuration.") (license license:expat))) (define-public python2-consul - (let ((consul (package-with-python2 python-consul))) - (package (inherit consul) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs consul)))))) + (package-with-python2 python-consul)) (define-public python-schematics (package @@ -11360,7 +11185,7 @@ discovery, monitoring and configuration.") (base32 "19v1i69bf3bzarfxmbv0v6ivpcn758x3shvbiy9l2hy0lvqwnp6l")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-six" ,python-six))) (arguments `(#:tests? #f)) ; requires a bunch of not very nice packages with fixed @@ -11368,15 +11193,10 @@ discovery, monitoring and configuration.") (home-page "https://github.com/schematics/schematics") (synopsis "Python Data Structures for Humans") (description "Python Data Structures for Humans.") - (license license:bsd-3) - (properties `((python2-variant . ,(delay python2-schematics)))))) + (license license:bsd-3))) (define-public python2-schematics - (let ((base (package-with-python2 (strip-python2-variant python-schematics)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-schematics)) (define-public python-publicsuffix (package @@ -11395,15 +11215,10 @@ discovery, monitoring and configuration.") (synopsis "Get suffix for a domain name") (description "Get a public suffix for a domain name using the Public Suffix List.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-nltk)))))) + (license license:expat))) (define-public python2-publicsuffix - (let ((base (package-with-python2 (strip-python2-variant python-publicsuffix)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-publicsuffix)) (define-public python-publicsuffix2 (package @@ -11423,15 +11238,10 @@ List.") (synopsis "Get a public suffix for a domain name using the Public Suffix List") (description "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package.") - (license (list license:expat license:mpl2.0)) - (properties `((python2-variant . ,(delay python2-publicsuffix2)))))) + (license (list license:expat license:mpl2.0)))) (define-public python2-publicsuffix2 - (let ((base (package-with-python2 (strip-python2-variant python-publicsuffix2)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-publicsuffix2)) (define-public python-url (package @@ -11444,7 +11254,7 @@ List. Forked from and using the same API as the publicsuffix package.") (base32 "0v879yadcz9qxfl41ak6wkga1kimp9cflla9ddz03hjjvgkqy5ki")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-publicsuffix" ,python-publicsuffix))) (native-inputs `(("python-coverage" ,python-coverage) @@ -11460,31 +11270,28 @@ List. Forked from and using the same API as the publicsuffix package.") (define-public python2-url (let ((base (package-with-python2 (strip-python2-variant python-url)))) (package (inherit base) - (inputs - `(("python2-publicsuffix" ,python2-publicsuffix))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (propagated-inputs + `(("python2-publicsuffix" ,python2-publicsuffix)))))) (define-public python-freezegun (package (name "python-freezegun") - (version "0.3.7") + (version "0.3.8") (source (origin (method url-fetch) (uri (pypi-uri "freezegun" version)) (sha256 (base32 - "14l19x06v5jkq4rdwbmfyw4x9lrjb2300afrk21r1ash7y1y9a0w")))) + "1sf38d3ibv1jhhvr52x7dhrsiyqk1hm165dfv8w8wh0fhmgxg151")))) (build-system python-build-system) (native-inputs `(("python-mock" ,python-mock) ("python-nose" ,python-nose) - ("python-coverage" ,python-coverage) + ("python-coverage" ,python-coverage))) + (propagated-inputs + `(("python-six" ,python-six) ("python-dateutil-2" ,python-dateutil-2))) - (inputs - `(("python-six" ,python-six))) (arguments `(#:phases (modify-phases %standard-phases ;; The tests are normally executed via `make test`, but the PyPi @@ -11500,11 +11307,8 @@ time by mocking the datetime module.") (license license:asl2.0))) (define-public python2-freezegun - (let ((base (package-with-python2 (strip-python2-variant python-freezegun)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-freezegun)) + (define-public python-odfpy (package @@ -11581,15 +11385,10 @@ Python to manipulate OpenDocument 1.2 files.") (synopsis "The httplib2 caching algorithms for use with requests") (description "CacheControl is a port of the caching algorithms in @code{httplib2} for use with @code{requests} session objects.") - (license license:asl2.0) - (properties `((python2-variant . ,(delay python2-cachecontrol)))))) + (license license:asl2.0))) (define-public python2-cachecontrol - (let ((base (package-with-python2 (strip-python2-variant python-cachecontrol)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-cachecontrol)) (define-public python-lit (package @@ -11608,16 +11407,10 @@ Python to manipulate OpenDocument 1.2 files.") (description "@code{lit} is a portable tool for executing LLVM and Clang style test suites, summarizing their results, and providing indication of failures.") - (license license:ncsa) - (properties `((python2-variant . ,(delay python2-lit)))))) + (license license:ncsa))) (define-public python2-lit - (let ((base (package-with-python2 (strip-python2-variant python-lit)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-lit)) (define-public python-pytest-pep8 (package @@ -11631,10 +11424,7 @@ failures.") "06032agzhw1i9d9qlhfblnl3dw5hcyxhagn7b120zhrszbjzfbh3")))) (build-system python-build-system) (arguments - `(#:tests? #f ; Fails with recent pytest and pep8. See upstream issues #8 and #12. - ;; Prevent creation of the egg. This works around - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 . - #:configure-flags '("--single-version-externally-managed" "--root=/"))) + `(#:tests? #f)) ; Fails with recent pytest and pep8. See upstream issues #8 and #12. (native-inputs `(("python-pytest" ,python-pytest))) (propagated-inputs @@ -11642,15 +11432,10 @@ failures.") (home-page "https://bitbucket.org/pytest-dev/pytest-pep8") (synopsis "Py.test plugin to check PEP8 requirements") (description "Pytest plugin for checking PEP8 compliance.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-pep8)))))) + (license license:expat))) (define-public python2-pytest-pep8 - (let ((base (package-with-python2 (strip-python2-variant python-pytest-pep8)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pytest-pep8)) (define-public python-pytest-flakes (package @@ -11664,14 +11449,14 @@ failures.") "0flag3n33kbhyjrhzmq990rvg4yb8hhhl0i48q9hw0ll89jp28lw")))) (build-system python-build-system) (arguments - `(;; Prevent creation of the egg. This works around - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 . - #:configure-flags '("--single-version-externally-managed" "--root=/") - #:phases + `(#:phases (modify-phases %standard-phases (delete 'check) (add-after 'install 'check - (lambda _ ; It's easier to run tests after install. + (lambda* (#:key outputs inputs #:allow-other-keys) + ;; It's easier to run tests after install. + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) (zero? (system* "py.test" "-vv"))))))) (native-inputs `(("python-coverage" ,python-coverage) @@ -11683,15 +11468,10 @@ failures.") (home-page "https://github.com/fschulze/pytest-flakes") (synopsis "Py.test plugin to check source code with pyflakes") (description "Pytest plugin for checking Python source code with pyflakes.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-pytest-flakes)))))) + (license license:expat))) (define-public python2-pytest-flakes - (let ((base (package-with-python2 (strip-python2-variant python-pytest-flakes)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-pytest-flakes)) (define-public python-natsort (package @@ -11736,8 +11516,7 @@ functionality in the command line.") (let ((base (package-with-python2 (strip-python2-variant python-natsort)))) (package (inherit base) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-pathlib" ,python2-pathlib) + `(("python2-pathlib" ,python2-pathlib) ("python2-mock" ,python2-mock) ("python2-enum34" ,python2-enum34) ,@(package-native-inputs base)))))) @@ -11754,7 +11533,7 @@ functionality in the command line.") (base32 "11jbq40g8alsbirnd4kiagznqg270247i0m8qhi48ldf2i5xppxg")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-psutil" ,python-psutil))) (home-page "https://github.com/nicolargo/glances") @@ -11764,16 +11543,10 @@ functionality in the command line.") "Glances is a curses-based monitoring tool for a wide variety of platforms. Glances uses the PsUtil library to get information from your system. It monitors CPU, load, memory, network bandwidth, disk I/O, disk use, and more.") - (license license:lgpl3+) - (properties `((python2-variant . ,(delay python2-glances)))))) + (license license:lgpl3+))) (define-public python2-glances - (let ((base (package-with-python2 (strip-python2-variant python-glances)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-glances)) (define-public python-graphql-core (package @@ -11800,7 +11573,7 @@ CPU, load, memory, network bandwidth, disk I/O, disk use, and more.") `(("python-gevent" ,python-gevent) ("python-mock" ,python-mock) ("python-pytest-mock" ,python-pytest-mock))) - (inputs + (propagated-inputs `(("python-promise" ,python-promise) ("python-six" ,python-six))) (home-page "https://github.com/graphql-python/graphql-core") @@ -11810,32 +11583,26 @@ CPU, load, memory, network bandwidth, disk I/O, disk use, and more.") runtime designed and used to request and deliver data to mobile and web apps. This library is a port of @url{https://github.com/graphql/graphql-js,graphql-js} to Python.") - (properties `((python2-variant . ,(delay python2-graphql-core)))) (license license:expat))) (define-public python2-graphql-core - (let ((base (package-with-python2 - (strip-python2-variant python-graphql-core)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-graphql-core)) (define-public python-graphql-relay (package (name "python-graphql-relay") - (version "0.4.4") + (version "0.4.5") (source (origin (method url-fetch) (uri (pypi-uri "graphql-relay" version)) (sha256 (base32 - "04wr9ayshxjjdcg2v21c7ffbz36kif1wjl3604fqd3qignb3fbxi")))) + "1nv5dxcj59zv31qvl8bd142njmxcmymny2dz3br1l2cpbljbf5i7")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest))) - (inputs + (propagated-inputs `(("python-graphql-core" ,python-graphql-core) ("python-promise" ,python-promise) ("python-six" ,python-six))) @@ -11847,16 +11614,10 @@ using the GraphQL Python reference implementation of a GraphQL server. It should be noted that the code is a exact port of the original @url{https://github.com/graphql/graphql-relay-js,graphql-relay js implementation} from Facebook.") - (properties `((python2-variant . ,(delay python2-graphql-relay)))) (license license:expat))) (define-public python2-graphql-relay - (let ((base (package-with-python2 - (strip-python2-variant python-graphql-relay)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-graphql-relay)) (define-public python-graphene (package @@ -11876,7 +11637,7 @@ from Facebook.") ("python-psycopg2" ,python-psycopg2) ("python-pytest-django" ,python-pytest-django) ("python-sqlalchemy-utils" ,python-sqlalchemy-utils))) - (inputs + (propagated-inputs `(("python-graphql-core" ,python-graphql-core) ("python-graphql-relay" ,python-graphql-relay) ("python-iso8601" ,python-iso8601) @@ -11896,8 +11657,7 @@ with an associated set of resolve methods that know how to fetch data.") (strip-python2-variant python-graphene)))) (package (inherit base) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ("python2-sqlalchemy" ,python2-sqlalchemy) + `(("python2-sqlalchemy" ,python2-sqlalchemy) ,@(package-native-inputs base)))))) (define-public python-nautilus @@ -11913,23 +11673,18 @@ with an associated set of resolve methods that know how to fetch data.") "01hwzjc1zshk4vvxrcghm398fpy4jls66dyz06g07mrwqif8878p")))) (build-system python-build-system) (arguments `(#:tests? #f)) ; fails to import test modules - (native-inputs - `(("python-setuptools" ,python-setuptools))) - (inputs + (propagated-inputs `(("python-bcrypt" ,python-bcrypt) ("python-click" ,python-click) ("python-consul" ,python-consul) - ("python-graphql-core" ,python-graphql-core) - ("python-graphql-relay" ,python-graphql-relay) ("python-graphene" ,python-graphene) ("python-jinja2" ,python-jinja2) - ("python-nose2" ,python-nose2) ("python-peewee" ,python-peewee) ("python-pika" ,python-pika) - ("python-pycparser" ,python-pycparser) - ("python-requests" ,python-requests) ("python-tornado" ,python-tornado) ("python-wtforms" ,python-wtforms))) + (native-inputs + `(("python-nose2" ,python-nose2))) (home-page "https://github.com/AlecAivazis/nautilus") (synopsis "Library for creating microservice applications") (description @@ -11938,6 +11693,74 @@ provide extendible implementations of common aspects of a cloud so that you can focus on building massively scalable web applications.") (license license:expat))) +(define-public python-snowballstemmer + (package + (name "python-snowballstemmer") + (version "1.2.1") + (source (origin + (method url-fetch) + (uri (pypi-uri "snowballstemmer" version)) + (sha256 + (base32 + "0a0idq4y5frv7qsg2x62jd7rd272749xk4x99misf5rcifk2d7wi")))) + (build-system python-build-system) + (arguments + `(;; No tests exist + #:tests? #f)) + (home-page "https://github.com/shibukawa/snowball_py") + (synopsis "Snowball stemming library collection for Python") + (description "This package provides 16 word stemmer algorithms generated +from Snowball algorithms. It includes the 15 original ones plus the Poerter +English stemmer.") + (license license:bsd-3))) + +(define-public python2-snowballstemmer + (package-with-python2 python-snowballstemmer)) + +(define-public python-sphinx-cloud-sptheme + (package + (name "python-sphinx-cloud-sptheme") + (version "1.7.1") + (source (origin + (method url-fetch) + (uri (pypi-uri "cloud_sptheme" version)) + (sha256 + (base32 + "0zm9ap4p5dzln8f1m2immadaxv2xpg8jg4w53y52rhfl7pdb58vy")))) + (build-system python-build-system) + (native-inputs + `(("python-sphinx" ,python-sphinx))) + (home-page "https://bitbucket.org/ecollins/cloud_sptheme") + (synopsis "'Cloud' theme for Sphinx documenter") + (description "This package contains the \"Cloud\" theme for Sphinx and some +related extensions.") + (license license:bsd-3))) + +(define-public python2-sphinx-cloud-sptheme + (package-with-python2 python-sphinx-cloud-sptheme)) + +(define-public python-sphinx-alabaster-theme + (package + (name "python-sphinx-alabaster-theme") + (version "0.7.9") + (source (origin + (method url-fetch) + (uri (pypi-uri "alabaster" version)) + (sha256 + (base32 + "027anxzcb951gjlcc43y3rbn9qrw36d16vj9wd2smv5410xx9bs7")))) + (build-system python-build-system) + (propagated-inputs + `(("python-pygments" ,python-pygments))) + (home-page "https://alabaster.readthedocs.io/") + (synopsis "Configurable sidebar-enabled Sphinx theme") + (description "Alabaster is a visually (c)lean, responsive, configurable +theme for the Sphinx documentation system. It's the default theme of Sphinx.") + (license license:bsd-3))) + +(define-public python2-sphinx-alabaster-theme + (package-with-python2 python-sphinx-alabaster-theme)) + (define-public python-betamax (package (name "python-betamax") @@ -11953,33 +11776,27 @@ focus on building massively scalable web applications.") (arguments '(;; Many tests fail because they require networking. #:tests? #f)) - (inputs + (propagated-inputs `(("python-requests" ,python-requests))) (home-page "https://github.com/sigmavirus24/betamax") (synopsis "Record HTTP interactions with python-requests") (description "Betamax will record your test suite's HTTP interactions and replay them during future tests. It is designed to work with python-requests.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-betamax)))))) + (license license:expat))) (define-public python2-betamax - (let ((base (package-with-python2 (strip-python2-variant python-betamax)))) - (package - (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-betamax)) (define-public python-s3transfer (package (name "python-s3transfer") - (version "0.1.8") + (version "0.1.10") (source (origin (method url-fetch) (uri (pypi-uri "s3transfer" version)) (sha256 (base32 - "1jivjkp3xqif9gzr5fiq28jsskmh50vzzd7ldsb4rbyiw1iyv3hy")))) + "1h8g9bknvxflxkpbnxyfxmk8pvgykbbk9ljdvhqh6z4vjc2926ms")))) (build-system python-build-system) (arguments `(#:phases @@ -11993,7 +11810,7 @@ replay them during future tests. It is designed to work with python-requests.") `(("python-docutils" ,python-docutils) ("python-mock" ,python-mock) ("python-nose" ,python-nose))) - (inputs + (propagated-inputs `(("python-botocore" ,python-botocore))) (synopsis "Amazon S3 Transfer Manager") (description "S3transfer is a Python library for managing Amazon S3 @@ -12008,7 +11825,6 @@ transfers.") (inherit base) (native-inputs `(("python2-futures" ,python2-futures) - ("python2-setuptools" ,python2-setuptools) ,@(package-native-inputs base)))))) (define-public python-setproctitle @@ -12108,16 +11924,10 @@ is used by PostgreSQL and the OpenSSH Server for example.") The schema format is based on the JSON Schema proposal (http://json-schema.org), so combined with json the library is also useful as a validator for JSON data.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-validictory)))))) + (license license:expat))) (define-public python2-validictory - (let ((base (package-with-python2 - (strip-python2-variant python-validictory)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-validictory)) (define-public python-aniso8601 (package @@ -12271,15 +12081,10 @@ useful as a validator for JSON data.") (description "This package allows determination of image size from PNG, JPEG, JPEG2000 and GIF files in pure Python.") - (license license:expat) - (properties `((python2-variant . ,(delay python2-imagesize)))))) + (license license:expat))) (define-public python2-imagesize - (let ((base (package-with-python2 (strip-python2-variant python-imagesize)))) - (package - (inherit base) - (native-inputs `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs base)))))) + (package-with-python2 python-imagesize)) (define-public python-axolotl-curve25519 (package @@ -12300,8 +12105,6 @@ PNG, JPEG, JPEG2000 and GIF files in pure Python.") `(;; Prevent creation of the egg. This works around ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 #:configure-flags '("--root=/"))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (home-page "https://github.com/tgalal/python-axolotl-curve25519") (synopsis "Python wrapper for curve25519 library") (description "This is a python wrapper for the curve25519 library @@ -12340,8 +12143,6 @@ python-axolotl.") ;; Prevent creation of the egg. This works around ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765 #:configure-flags '("--root=/"))) - (native-inputs - `(("python-setuptools" ,python-setuptools))) (propagated-inputs `(("python-axolotl-curve25519" ,python-axolotl-curve25519) ("python-dateutil" ,python-dateutil) @@ -12437,3 +12238,101 @@ the Flask web framework in Python. It is similar to package @code{python-flask-restful} but supports the @code{python-swagger} documentation builder.") (license license:expat))) + +(define-public python-sadisplay + (package + (name "python-sadisplay") + (version "0.4.6") + (source + (origin + (method url-fetch) + (uri (pypi-uri "sadisplay" version)) + (sha256 + (base32 + "0zqad2fl7q26p090qmqgmxbm6iwgf9zij1w8da1g3wdgjj72ql05")))) + (build-system python-build-system) + (propagated-inputs + `(("python-sqlalchemy" ,python-sqlalchemy))) + (native-inputs + `(("python-nose" ,python-nose))) + (home-page "https://bitbucket.org/estin/sadisplay") + (synopsis "SQLAlchemy schema displayer") + (description "This package provides a program to build Entity +Relationship diagrams from a SQLAlchemy model (or directly from the +database).") + (license license:bsd-3))) + +(define-public python2-sadisplay + (package-with-python2 python-sadisplay)) + +(define-public python-flask-restful-swagger + (package + (name "python-flask-restful-swagger") + (version "0.19") + (source + (origin + (method url-fetch) + (uri (pypi-uri "flask-restful-swagger" version)) + (sha256 + (base32 + "16msl8hd5xjmj833bpy264v98cpl5hkw5bgl5gf5vgndxbv3rm6v")))) + (build-system python-build-system) + (propagated-inputs + `(("python-flask-restful" ,python-flask-restful))) + (home-page "https://github.com/rantav/flask-restful-swagger") + (synopsis "Extract Swagger specs from Flask-Restful projects") + (description "This package lets you extract Swagger API documentation +specs from your Flask-Restful projects.") + (license license:expat))) + +(define-public python2-flask-restful-swagger + (package-with-python2 python-flask-restful-swagger)) + +(define-public python-argcomplete + (package + (name "python-argcomplete") + (version "1.7.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "argcomplete" version)) + (sha256 + (base32 + "11bwiw6j0nilgz81xnw6f1npyga3prp8asjqrm87cdr3ria5l03x")))) + (build-system python-build-system) + (home-page "https://github.com/kislyuk/argcomplete") + (synopsis "Shell tab completion for Python argparse") + (description "argcomplete provides extensible command line tab completion +of arguments and options for Python scripts using @code{argparse}. It's +particularly useful for programs with many options or sub-parsers that can +dynamically suggest completions; for example, when browsing resources over the +network.") + (license license:asl2.0))) + +(define-public python2-argcomplete + (package-with-python2 python-argcomplete)) + +(define-public python-xopen + (package + (name "python-xopen") + (version "0.1.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "xopen" version)) + (sha256 + (base32 + "1wx6mylzcsyhjl19ycb83qq6iqpmr927lz62njfsar6ldsj0qcni")) + (file-name (string-append name "-" version ".tar.gz")))) + (build-system python-build-system) + (home-page "https://github.com/marcelm/xopen/") + (synopsis "Open compressed files transparently") + (description "This module provides an @code{xopen} function that works like +Python's built-in @code{open} function, but can also deal with compressed files. +Supported compression formats are gzip, bzip2 and, xz, and are automatically +recognized by their file extensions. The focus is on being as efficient as +possible on all supported Python versions.") + (license license:expat))) + +(define-public python2-xopen + (package-with-python2 python-xopen)) diff --git a/gnu/packages/qemu.scm b/gnu/packages/qemu.scm index e429c04244..4c47a09902 100644 --- a/gnu/packages/qemu.scm +++ b/gnu/packages/qemu.scm @@ -69,17 +69,14 @@ (define-public qemu (package (name "qemu") - (version "2.7.0") + (version "2.8.0") (source (origin (method url-fetch) (uri (string-append "http://wiki.qemu-project.org/download/qemu-" version ".tar.bz2")) (sha256 (base32 - "0lqyz01z90nvxpc3nx4djbci7hx62cwvs5zwd6phssds0sap6vij")) - (patches (search-patches "qemu-CVE-2016-8576.patch" - "qemu-CVE-2016-8577.patch" - "qemu-CVE-2016-8578.patch")))) + "0qjy3rcrn89n42y5iz60kgr0rrl29hpnj8mq2yvbc1wrcizmvzfs")))) (build-system gnu-build-system) (arguments '(;; Running tests in parallel can occasionally lead to failures, like: @@ -106,6 +103,8 @@ (apply system* `("./configure" ,(string-append "--cc=" (which "gcc")) + ;; Some architectures insist on using HOST_CC + ,(string-append "--host-cc=" (which "gcc")) "--disable-debug-info" ; save build space "--enable-virtfs" ; just to be sure ,(string-append "--prefix=" out) @@ -124,7 +123,7 @@ (add-before 'check 'make-gtester-verbose (lambda _ ;; Make GTester verbose to facilitate investigation upon failure. - (setenv "V" "1"))) + (setenv "V" "1") #t)) (add-before 'check 'disable-test-qga (lambda _ (substitute* "tests/Makefile.include" @@ -230,10 +229,10 @@ server and embedded PowerPC, and S390 guests.") ("pci.ids" ,(origin (method url-fetch) - (uri "http://pciids.sourceforge.net/v2.2/pci.ids") + (uri "https://raw.githubusercontent.com/pciutils/pciids/f9477789526f9d380bc57aa92e357c521738d5dd/pci.ids") (sha256 (base32 - "0h8v0lrlrxkfnjiwnwiq86zyvb8qa2n3844dp1m01lh2nb2fliqw")))) + "0g6dbwlamagxqxvng67xng3w2x56c0np4md1v1p1jn32qw518az0")))) ("usb.ids" ,(origin (method url-fetch) @@ -394,8 +393,9 @@ three libraries: (which "nosetests") "\""))) #t))))) (inputs - `(("libvirt" ,libvirt) - ("python-lxml" ,python-lxml))) + `(("libvirt" ,libvirt))) + (propagated-inputs + `(("python-lxml" ,python-lxml))) (native-inputs `(("pkg-config" ,pkg-config) ("python-nose" ,python-nose))) @@ -423,6 +423,7 @@ virtualization library.") (build-system python-build-system) (arguments `(#:python ,python-2 + #:use-setuptools? #f ; Uses custom distutils 'install' command. ;; Some of the tests seem to require network access to install virtual ;; machines. #:tests? #f diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm index b442356530..15beb8037e 100644 --- a/gnu/packages/qt.scm +++ b/gnu/packages/qt.scm @@ -35,6 +35,7 @@ #:use-module (gnu packages compression) #:use-module (gnu packages cups) #:use-module (gnu packages databases) + #:use-module (gnu packages documentation) #:use-module (gnu packages fontutils) #:use-module (gnu packages flex) #:use-module (gnu packages freedesktop) @@ -59,6 +60,38 @@ #:use-module (gnu packages xorg) #:use-module (gnu packages xml)) +(define-public grantlee + (package + (name "grantlee") + (version "5.1.0") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/steveire/grantlee/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 "1lf9rkv0i0kd7fvpgg5l8jb87zw8dzcwd1liv6hji7g4wlpmfdiq")))) + (native-inputs + `(("doxygen" ,doxygen))) + (inputs + `(("qtbase" ,qtbase) + ("qtscript" ,qtscript))) + (build-system cmake-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (zero? (system* "ctest" ;; exclude 2 tests which require a display + "-E" "htmlbuildertest|plainmarkupbuildertest"))))))) + (home-page "https://github.com/steveire/grantlee") + (synopsis "Libraries for text templating with Qt") + (description "Grantlee Templates can be used for theming and generation of +other text such as code. The syntax uses the syntax of the Django template +system, and the core design of Django is reused in Grantlee.") + (license license:lgpl2.0+))) + (define-public qt (package (name "qt") @@ -315,7 +348,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtbase (package (name "qtbase") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -324,7 +357,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0ip6xnizsn269r4s1nq9lkx8cdxkjqr1fidwrj3sa8xb7h96syry")) + "0zjmcrmnnmaz1lr9wc5i6y565hsvl8ycn790ivqaz62dv54zbkgd")) (modules '((guix build utils))) (snippet '(begin @@ -498,7 +531,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtsvg (package (inherit qtbase) (name "qtsvg") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -507,7 +540,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "10fqrlqkiq83xhx79g8d2sjy7hjdnp28067z8f4byj7db81rzy51")))) + "0irr9h566hl9nx8p919rz276zbfvvd6vqdb6i9g6b3piikdigw5h")))) (propagated-inputs `()) (native-inputs `(("perl" ,perl))) (inputs @@ -532,7 +565,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtimageformats (package (inherit qtsvg) (name "qtimageformats") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -541,14 +574,15 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "1rb27x7i2pmvsck6wax2cg31gqpzaakciy45wm5l3lcl86j48czg")) + "1x3p1xmw7spxa4bwriyrwsfrq31jabsdjsi5fras9y39naia55sg")) (modules '((guix build utils))) (snippet '(begin (delete-file-recursively "src/3rdparty"))))) (native-inputs `()) (inputs - `(("libmng" ,libmng) + `(("jasper" ,jasper) + ("libmng" ,libmng) ("libtiff" ,libtiff) ("libwebp" ,libwebp) ("mesa" ,mesa) @@ -558,7 +592,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtx11extras (package (inherit qtsvg) (name "qtx11extras") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -567,7 +601,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "1yrkn8pqdbvbqykas3wx1vdfimhjkgx3s5jgdxib9dgmgyx6vjzw")))) + "09z49jm70f5i0gcdz9a16z00pg96x8pz7vri5wpirh3fqqn0qnjz")))) (native-inputs `(("perl" ,perl))) (inputs `(("mesa" ,mesa) @@ -576,7 +610,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtxmlpatterns (package (inherit qtsvg) (name "qtxmlpatterns") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -585,14 +619,14 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "02z2qxamslg6sphnaykjcjfpypq4b69pb586s43vw4fplm72m21q")))) + "1rgqnpg64gn5agmvjwy0am8hp5fpxl3cdkixr1yrsdxi5a6961d8")))) (native-inputs `(("perl" ,perl))) (inputs `(("qtbase" ,qtbase))))) (define-public qtdeclarative (package (inherit qtsvg) (name "qtdeclarative") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -601,7 +635,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "1x7rij423g5chlfd2kix54f393vxwjvdfsn1c7sybqmfycwn5pl6")))) + "0mjxfwnplpx60jc6y94krg00isddl9bfwc7dayl981njb4qds4zx")))) (native-inputs `(("perl" ,perl) ("pkg-config" ,pkg-config) @@ -615,7 +649,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtconnectivity (package (inherit qtsvg) (name "qtconnectivity") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -624,7 +658,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "00r7lc1w3snfp2qfqmviqzv0cw16zd8m1sfpvxvpl65yqmzcli4q")))) + "0rmr7bd4skby7bax9hpj2sid2bq3098nkw7xm02mdp04hc3bks5k")))) (native-inputs `(("perl" ,perl) ("pkg-config" ,pkg-config) @@ -636,7 +670,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtwebsockets (package (inherit qtsvg) (name "qtwebsockets") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -645,7 +679,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0hwb2l7iwf4wf7l95dli8j3b7h0nffp56skfg1x810kzj0df26vl")))) + "1laj0slwibs0bg69kgrdhc9k1s6yisq3pcsr0r9rhbkzisv7aajw")))) (native-inputs `(("perl" ,perl) ("qtdeclarative" ,qtdeclarative))) @@ -654,7 +688,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtsensors (package (inherit qtsvg) (name "qtsensors") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -663,7 +697,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "1gii6wg2xd3bkb86y5hgpmwcpl04xav030zscpl6fhscl9kcqg98")))) + "041v1x8pwfzpyk6y0sy5zgm915pi15xdhiy18fd5wqayvcp99cyc")))) (native-inputs `(("perl" ,perl) ("qtdeclarative" ,qtdeclarative))) @@ -672,7 +706,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtmultimedia (package (inherit qtsvg) (name "qtmultimedia") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -681,7 +715,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0ndmhiflmyr144nq8drd5njsdi282ixsm4730q5n0ji2v9dp1bh5")) + "1vvxmgmvjnz9w1h2ph1j2fy77ij141ycx5fric60lq02pxzifax5")) (modules '((guix build utils))) (snippet '(begin @@ -701,7 +735,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtwayland (package (inherit qtsvg) (name "qtwayland") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -710,7 +744,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "04dynjcr6gxi3hcqdf688a4hkabi2l17slpcx9k0f3dxygwcgf96")))) + "1iq1c89y4ggq0dxjlf62jyhh8a9l3x7y914x84w5pby8h3hwagzj")))) (native-inputs `(("glib" ,glib) ("perl" ,perl) @@ -732,7 +766,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtserialport (package (inherit qtsvg) (name "qtserialport") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -741,7 +775,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0rc2l14s59qskp16wqlkizfai32s41qlm7a86r3qahx28gc51qaw")))) + "09jsryc0z49cz9783kq48rkn42f10c6krzivp812ddwjsfdy3mbn")))) (native-inputs `(("perl" ,perl))) (inputs `(("qtbase" ,qtbase) @@ -750,7 +784,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtwebchannel (package (inherit qtsvg) (name "qtwebchannel") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -759,7 +793,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "05lqfidlh1ahdd1j9y20p2037qbcq51zkdzj2m8fwhn7ghbwvd1s")))) + "16rij92dxy4k5231l3dpmhy7cnz0cjkn50cpzaf014zrdz3kmav3")))) (native-inputs `(("perl" ,perl) ("qtdeclarative" ,qtdeclarative) @@ -769,7 +803,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtlocation (package (inherit qtsvg) (name "qtlocation") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -778,7 +812,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0rd898gndn41jrp78203lxd94ybfv693l0qg0myag4r46ikk69vh")))) + "17zkzffzwbg6aqhsggs23cmwzq4y45m938842lsc423hfm7fdsgr")))) (native-inputs `(("perl" ,perl) ("qtdeclarative" ,qtdeclarative) @@ -789,7 +823,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qttools (package (inherit qtsvg) (name "qttools") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -798,7 +832,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "004m9l7bgh7qnncbyl3d5fkggdrqx58ib21xv4hflvvarxrssibg")))) + "1b6zqa5690b8lqms7rrhb8rcq0xg5hp117v3m08qngbcd0i706b4")))) (native-inputs `(("perl" ,perl) ("qtdeclarative" ,qtdeclarative))) @@ -809,7 +843,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtscript (package (inherit qtsvg) (name "qtscript") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -818,7 +852,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0040890p5ilyrmcpndz1hhp08x2ms5gw4lp4n5iax2a957yy2i4w")))) + "09m41n95448pszr7inlg03ycb66s1a9hzfylaka92382acf1myav")))) (native-inputs `(("perl" ,perl) ("qttools" ,qttools))) @@ -828,7 +862,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtquickcontrols (package (inherit qtsvg) (name "qtquickcontrols") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -837,7 +871,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0cpcrmz9n5b4bgmshmk093lirl9xwqb23inchnai1zqg21vrmqfq")))) + "17cyfyqzjbm9dhq9pjscz36y84y16rmxwk6h826gjfprddrimsvg")))) (inputs `(("qtbase" ,qtbase) ("qtdeclarative" ,qtdeclarative))))) @@ -845,7 +879,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtquickcontrols2 (package (inherit qtsvg) (name "qtquickcontrols2") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -854,7 +888,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "0i8h933vhvx1bmniqdx0idg6vk82w9byd3dq0bb2phwjg5vv1xb3")))) + "1v77ydy4k15lksp3bi2kgha2h7m79g4n7c2qhbr09xnvpb8ars7j")))) (inputs `(("qtbase" ,qtbase) ("qtdeclarative" ,qtdeclarative))))) @@ -862,7 +896,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public qtgraphicaleffects (package (inherit qtsvg) (name "qtgraphicaleffects") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) (uri (string-append "https://download.qt.io/official_releases/qt/" @@ -871,7 +905,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") version ".tar.xz")) (sha256 (base32 - "1rwdjg5mk6xpadmxfq64xfp573zp5lrj9illb9105ra5wff565n8")))) + "1j2drnx7zp3w6cgvy7bn00fyk5v7vw1j1hidaqcg78lzb6zgls1c")))) (inputs `(("qtbase" ,qtbase) ("qtdeclarative" ,qtdeclarative))))) @@ -879,7 +913,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") (define-public python-sip (package (name "python-sip") - (version "4.18") + (version "4.18.1") (source (origin (method url-fetch) @@ -888,7 +922,7 @@ developers using C++ or QML, a CSS & JavaScript like language.") "sip-" version "/sip-" version ".tar.gz")) (sha256 (base32 - "1dlw4kyiwd9bzmd1djm79c121r219abaz86lvizdk6ksq20mrp7i")))) + "1452zy3g0qv4fpd9c0y4gq437kn0xf7bbfniibv5n43zpwnpmklv")))) (build-system gnu-build-system) (native-inputs `(("python" ,python-wrapper))) @@ -942,7 +976,7 @@ module provides support functions to the automatically generated code.") (define-public python-pyqt (package (name "python-pyqt") - (version "5.6") + (version "5.7") (source (origin (method url-fetch) @@ -952,14 +986,28 @@ module provides support functions to the automatically generated code.") version ".tar.gz")) (sha256 (base32 - "1qgh42zsr9jppl9k7fcdbhxcd1wrb7wyaj9lng9nxfa19in1lj1f")) + "01avscn1bir0h8zzfh1jvpljgwg6qkax5nk142xrm63rbyx969l9")) (patches (search-patches "pyqt-configure.patch")))) (build-system gnu-build-system) (native-inputs `(("python-sip" ,python-sip) ("qtbase" ,qtbase))) ; for qmake (inputs - `(("python" ,python-wrapper))) + `(("python" ,python-wrapper) + ("qtbase" ,qtbase) + ("qtconnectivity" ,qtconnectivity) + ("qtdeclarative" ,qtdeclarative) + ("qtlocation" ,qtlocation) + ("qtmultimedia" ,qtmultimedia) + ("qtsensors" ,qtsensors) + ("qtserialport" ,qtserialport) + ("qtsvg" ,qtsvg) + ("qttools" ,qttools) + ("qtwebchannel" ,qtwebchannel) + ("qtwebkit" ,qtwebkit) + ("qtwebsockets" ,qtwebsockets) + ("qtx11extras" ,qtx11extras) + ("qtxmlpatterns" ,qtxmlpatterns))) (arguments `(#:modules ((srfi srfi-1) ,@%gnu-build-system-modules) @@ -982,13 +1030,19 @@ module provides support functions to the automatically generated code.") ".")) (lib (string-append out "/lib/python" python-major+minor - "/site-packages"))) + "/site-packages")) + (stubs (string-append lib "/PyQt5"))) (zero? (system* "python" "configure.py" "--confirm-license" "--bindir" bin "--destdir" lib "--designer-plugindir" designer "--qml-plugindir" qml + ; Where to install the PEP 484 Type Hints stub + ; files. Without this the stubs are tried to be + ; installed into the python package's + ; site-package directory, which is read-only. + "--stubsdir" stubs "--sipdir" sip)))))))) (home-page "https://www.riverbankcomputing.com/software/pyqt/intro") (synopsis "Python bindings for Qt") @@ -1005,34 +1059,8 @@ contain over 620 classes.") `(("python-sip" ,python2-sip) ("qtbase" ,qtbase))) (inputs - `(("python" ,python-2))))) - -(define-public python-pyqt-5.5 - (package (inherit python-pyqt) - (version "5.5") - (source - (origin - (method url-fetch) - (uri - (string-append "mirror://sourceforge/pyqt/PyQt5/" - "PyQt-" version "/PyQt-gpl-" - version ".tar.gz")) - (sha256 - (base32 - "056qmkv02wdcfblqdaxiswrgn4wa88sz22i1x58dpb1iniavplfd")) - (patches (search-patches "pyqt-configure.patch")))) - (native-inputs - `(("python-sip" ,python-sip) - ("qt" ,qt))))) - -(define-public python2-pyqt-5.5 - (package (inherit python-pyqt-5.5) - (name "python2-pyqt") - (native-inputs - `(("python-sip" ,python2-sip) - ("qt" ,qt))) - (inputs - `(("python" ,python-2))))) + `(("python" ,python-2) + ,@(alist-delete "python" (package-inputs python-pyqt)))))) (define-public python-pyqt-4 (package (inherit python-pyqt) @@ -1051,38 +1079,38 @@ contain over 620 classes.") (native-inputs `(("python-sip" ,python-sip) ("qt" ,qt-4))) + (inputs `(("python" ,python-wrapper))) (arguments `(#:tests? #f ; no check target #:modules ((srfi srfi-1) ,@%gnu-build-system-modules) #:phases - (alist-replace - 'configure - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (bin (string-append out "/bin")) - (sip (string-append out "/share/sip")) - (python (assoc-ref inputs "python")) - (python-version - (last (string-split python #\-))) - (python-major+minor - (string-join - (take (string-split python-version #\.) 2) - ".")) - (lib (string-append out "/lib/python" - python-major+minor - "/site-packages"))) - (zero? (system* "python" "configure.py" - "--confirm-license" - "--bindir" bin - "--destdir" lib - "--sipdir" sip)))) - %standard-phases))) + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) + (sip (string-append out "/share/sip")) + (python (assoc-ref inputs "python")) + (python-version + (last (string-split python #\-))) + (python-major+minor + (string-join + (take (string-split python-version #\.) 2) + ".")) + (lib (string-append out "/lib/python" + python-major+minor + "/site-packages"))) + (zero? (system* "python" "configure.py" + "--confirm-license" + "--bindir" bin + "--destdir" lib + "--sipdir" sip)))))))) (license (list license:gpl2 license:gpl3)))) ; choice of either license (define-public python2-pyqt-4 (package (inherit python-pyqt-4) - (name "python2-pyqt-4") + (name "python2-pyqt") (native-inputs `(("python-sip" ,python2-sip) ("qt" ,qt-4))) @@ -1175,7 +1203,7 @@ different kinds of sliders, and much more.") (define-public qtwebkit (package (name "qtwebkit") - (version "5.7.0") + (version "5.7.1") (source (origin (method url-fetch) @@ -1187,7 +1215,7 @@ different kinds of sliders, and much more.") ;; <http://lists.qt-project.org/pipermail/development/2016-May/025923.html>. (sha256 (base32 - "1prlpl3zslzpr1iv7m3irvxjxn3v8nlxh21v9k2kaq4fpwy2b8y7")))) + "00szgcra6pf2myfjrdbsr1gmrxycpbjqlzkplna5yr1rjg4gfv54")))) (build-system gnu-build-system) (native-inputs `(("perl" ,perl) diff --git a/gnu/packages/rdf.scm b/gnu/packages/rdf.scm index d0a362c3a0..1dd23c28e3 100644 --- a/gnu/packages/rdf.scm +++ b/gnu/packages/rdf.scm @@ -315,11 +315,10 @@ ideal (e.g. in LV2 implementations or embedded applications).") (base32 "0kvaf332cqbi47rqzlpdx4mbkvw12mkrzkj8n9l19wk713d4py9w")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-html5lib" ,python-html5lib) ("python-isodate" ,python-isodate) - ("python-pyparsing" ,python-pyparsing) - ("python-setuptools" ,python-setuptools))) + ("python-pyparsing" ,python-pyparsing))) (home-page "https://github.com/RDFLib/rdflib") (synopsis "Python RDF library") diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm index 43817791b5..16a31afd73 100644 --- a/gnu/packages/readline.scm +++ b/gnu/packages/readline.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,7 +25,8 @@ #:use-module (gnu packages perl) #:use-module (guix packages) #:use-module (guix download) - #:use-module (guix build-system gnu)) + #:use-module (guix build-system gnu) + #:use-module (guix utils)) (define-public readline (let ((post-install-phase @@ -61,8 +63,18 @@ ;; cross-compiling, so provide the correct answer. ,@(if (%current-target-system) '("bash_cv_wcwidth_broken=no") + '()) + ;; MinGW: ncurses provides the termcap api. + ,@(if (target-mingw?) + '("bash_cv_termcap_lib=ncurses") '())) + ,@(if (target-mingw?) + ;; MinGW: termcap in ncurses + ;; some SIG_* #defined in _POSIX + '(#:make-flags '("TERMCAP_LIB=-lncurses" + "CPPFLAGS=-D_POSIX -D'chown(f,o,g)=0'")) + '()) #:phases (alist-cons-after 'install 'post-install ,post-install-phase diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm index baae553992..50dde3f48c 100644 --- a/gnu/packages/ruby.scm +++ b/gnu/packages/ruby.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015 Pjotr Prins <pjotr.guix@thebird.nl> -;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2014, 2015 David Thompson <davet@gnu.org> ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> @@ -47,8 +47,7 @@ (define-public ruby (package (name "ruby") - (replacement ruby-2.3.3) - (version "2.3.1") + (version "2.3.3") (source (origin (method url-fetch) @@ -57,9 +56,8 @@ "/ruby-" version ".tar.xz")) (sha256 (base32 - "0f3395q7pd2hrl2gv26bib80038sjawxgmhl9zn22fjs9m9va9b7")) + "1p0rfk0blrbfjcnv0vb0ha4hxflgkfhv9zbzp4vvld2pi31ahkqs")) (modules '((guix build utils))) - (patches (search-patches "ruby-symlinkfix.patch")) (snippet `(begin ;; Remove bundled libffi (delete-file-recursively "ext/fiddle/libffi-3.2.1") @@ -102,27 +100,9 @@ a focus on simplicity and productivity.") (home-page "https://ruby-lang.org") (license license:ruby))) -(define ruby-2.3.3 - (package - (inherit ruby) - (version "2.3.3") - (source - (origin - (method url-fetch) - (uri (string-append "http://cache.ruby-lang.org/pub/ruby/" - (version-major+minor version) - "/ruby-" version ".tar.xz")) - (sha256 - (base32 - "1p0rfk0blrbfjcnv0vb0ha4hxflgkfhv9zbzp4vvld2pi31ahkqs")) - (modules '((guix build utils))) - (snippet `(begin - ;; Remove bundled libffi - (delete-file-recursively "ext/fiddle/libffi-3.2.1") - #t)))))) - (define-public ruby-2.2 (package (inherit ruby) + (replacement #f) (version "2.2.6") (source (origin @@ -136,6 +116,7 @@ a focus on simplicity and productivity.") (define-public ruby-2.1 (package (inherit ruby) + (replacement #f) (version "2.1.10") (source (origin @@ -169,6 +150,7 @@ a focus on simplicity and productivity.") (define-public ruby-1.8 (package (inherit ruby) + (replacement #f) (version "1.8.7-p374") (source (origin @@ -198,13 +180,13 @@ a focus on simplicity and productivity.") (define-public ruby-hoe (package (name "ruby-hoe") - (version "3.15.2") + (version "3.16.0") (source (origin (method url-fetch) (uri (rubygems-uri "hoe" version)) (sha256 (base32 - "1riyf9j9vp7dzgpw5xj9xx1vqkdmg6lr7qiprmn91hcdp81kaszp"))) ) + "03r8nsw4n4mnia9iqiqk9kqhvrl96m2i81j4yg8cpnppd8vk7vlb")))) (build-system ruby-build-system) (synopsis "Ruby project management helper") (description @@ -1444,8 +1426,8 @@ conversion to (X)HTML.") (add-before 'check 'use-latest-redcarpet (lambda _ (substitute* "mocha.gemspec" - (("<redcarpet>, \\[\"~> 1\"\\]") - "<redcarpet>, [\">= 3\"]")) + (("<redcarpet>.freeze, \\[\"~> 1\"\\]") + "<redcarpet>.freeze, [\">= 3\"]")) #t)) (add-before 'check 'hardcode-version (lambda _ @@ -1497,13 +1479,13 @@ with processes on remote servers, via SSH2.") (define-public ruby-minitest (package (name "ruby-minitest") - (version "5.7.0") + (version "5.10.1") (source (origin (method url-fetch) (uri (rubygems-uri "minitest" version)) (sha256 (base32 - "0rxqfakp629mp3vwda7zpgb57lcns5znkskikbfd0kriwv8i1vq8")))) + "1yk2m8sp0p5m1niawa3ncg157a4i0594cg7z91rzjxv963rzrwab")))) (build-system ruby-build-system) (native-inputs `(("ruby-hoe" ,ruby-hoe))) @@ -1930,13 +1912,13 @@ to reproduce user environments.") (define-public ruby-nokogiri (package (name "ruby-nokogiri") - (version "1.6.8") + (version "1.7.0.1") (source (origin (method url-fetch) (uri (rubygems-uri "nokogiri" version)) (sha256 (base32 - "17pjhvm4yigriizxbbpx266nnh6nckdm33m3j4ws9dcg99daz91p")))) + "10xahg0fwydh27psm8bv429mdja2ks6x83vxizq26ib8wvs05mv3")))) (build-system ruby-build-system) (arguments ;; Tests fail because Nokogiri can only test with an installed extension, @@ -2222,28 +2204,27 @@ current line in an external editor.") (define-public ruby-sdoc (package (name "ruby-sdoc") - (version "0.4.1") + (version "0.4.2") (source (origin (method url-fetch) (uri (rubygems-uri "sdoc" version)) (sha256 (base32 - "16xyfair1j4irfkd6sxvmdcak957z71lwkvhglrznfpkalfnqyqp")))) + "0qhvy10vnmrqcgh8494m13kd5ag9c3sczzhfasv8j0294ylk679n")))) (build-system ruby-build-system) (arguments `(#:phases (modify-phases %standard-phases - (add-after 'build 'relax-minitest-requirement + (add-before 'check 'set-rubylib (lambda _ - (substitute* "sdoc.gemspec" - (("<minitest>, \\[\"~> 4\\.0\"\\]") - "<minitest>, [\">= 4.0\"]")) + (setenv "RUBYLIB" "lib") #t))))) (propagated-inputs `(("ruby-json" ,ruby-json))) (native-inputs `(("bundler" ,bundler) - ("ruby-minitest" ,ruby-minitest))) + ("ruby-minitest" ,ruby-minitest) + ("ruby-hoe" ,ruby-hoe))) (synopsis "Generate searchable RDoc documentation") (description "SDoc is an RDoc documentation generator to build searchable HTML @@ -3511,7 +3492,7 @@ support to both Ruby and JRuby. It uses @code{unf_ext} on CRuby and "Bundler::GemHelper.gemspec.version")) ;; Loosen unnecessarily strict test-unit version specification. (substitute* "domain_name.gemspec" - (("<test-unit>, \\[\\\"~> 2.5.5") "<test-unit>, [\">0")) + (("<test-unit>.freeze, \\[\\\"~> 2.5.5") "<test-unit>, [\">0")) #t))))) (propagated-inputs `(("ruby-unf" ,ruby-unf))) diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm new file mode 100644 index 0000000000..97d0d7cb0d --- /dev/null +++ b/gnu/packages/rust.scm @@ -0,0 +1,322 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; Copyright © 2016 Eric Le Bihan <eric.le.bihan.dev@free.fr> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages rust) + #:use-module (gnu packages base) + #:use-module (gnu packages bootstrap) + #:use-module (gnu packages cmake) + #:use-module (gnu packages compression) + #:use-module (gnu packages curl) + #:use-module (gnu packages elf) + #:use-module (gnu packages gcc) + #:use-module (gnu packages jemalloc) + #:use-module (gnu packages llvm) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages ssh) + #:use-module (gnu packages tls) + #:use-module (gnu packages version-control) + #:use-module (guix build-system cargo) + #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (ice-9 match) + #:use-module (srfi srfi-26)) + +;; Should be one less than the current released version. +(define %rust-bootstrap-binaries-version "1.13.0") + +(define %rust-bootstrap-binaries + (origin + (method url-fetch) + (uri (string-append + "https://static.rust-lang.org/dist/" + "rust-" %rust-bootstrap-binaries-version + "-i686-unknown-linux-gnu.tar.gz")) + (sha256 + (base32 + "0fcl7xgm2m21sjv1f27i3v692aa91lk8r867hl8d6l377w8k95r3")))) + +(define (increment-rust-version rust-version major patch) + (match (string-split rust-version #\.) + (("1" minor _) + (string-append (number->string major) "." + (number->string (+ (string->number minor) 1)) "." + (number->string patch))))) + +(define* (cargo-version rustc-version #:optional (patch 0)) + ;; Computes the cargo version that matches the rustc version. + ;; https://github.com/rust-lang/cargo#Releases + (increment-rust-version rustc-version 0 patch)) + +(define* (rustc-version bootstrap-version #:optional (patch 0)) + ;; Computes the rustc version that can be compiled from a given + ;; other rustc version. The patch argument is for selecting + ;; a stability or security fix. 1.11.0 -> 1.12.1 -> 1.13.0 + (increment-rust-version bootstrap-version 1 patch)) + +(define rustc-bootstrap + (package + (name "rustc-bootstrap") + (version %rust-bootstrap-binaries-version) + (source %rust-bootstrap-binaries) + (build-system gnu-build-system) + (native-inputs + `(("patchelf" ,patchelf))) + (inputs + `(("gcc:lib" ,(canonical-package gcc) "lib") + ("zlib" ,zlib))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #:system "i686-linux" + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (zlib (assoc-ref inputs "zlib")) + (ld-so (string-append libc + ,(glibc-dynamic-linker "i686-linux"))) + (rpath (string-append out "/lib:" zlib "/lib:" + libc "/lib:" gcc:lib "/lib")) + (rustc (string-append out "/bin/rustc")) + (rustdoc (string-append out "/bin/rustdoc"))) + (system* "bash" "install.sh" + (string-append "--prefix=" out) + (string-append "--components=rustc," + "rust-std-i686-unknown-linux-gnu")) + (for-each (lambda (file) + (system* "patchelf" "--set-rpath" rpath file)) + (cons* rustc rustdoc (find-files out "\\.so$"))) + (for-each (lambda (file) + (system* "patchelf" "--set-interpreter" ld-so file)) + (list rustc rustdoc)))))))) + (supported-systems '("i686-linux" "x86_64-linux")) + (home-page "https://www.rust-lang.org") + (synopsis "Prebuilt rust compiler") + (description "This package provides a pre-built @command{rustc} compiler, +which can in turn be used to build the final Rust compiler.") + (license license:asl2.0))) + +(define cargo-bootstrap + (package + (name "cargo-bootstrap") + (version (cargo-version %rust-bootstrap-binaries-version)) + (source %rust-bootstrap-binaries) + (build-system gnu-build-system) + (native-inputs + `(("patchelf" ,patchelf))) + (inputs + `(("gcc:lib" ,(canonical-package gcc) "lib"))) + (arguments + `(#:tests? #f + #:strip-binaries? #f + #:system "i686-linux" + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (gcc:lib (assoc-ref inputs "gcc:lib")) + (libc (assoc-ref inputs "libc")) + (ld-so (string-append libc + ,(glibc-dynamic-linker "i686-linux"))) + (rpath (string-append out "/lib:" libc "/lib:" + gcc:lib "/lib")) + (cargo (string-append out "/bin/cargo"))) + (system* "bash" "install.sh" + (string-append "--prefix=" out) + "--components=cargo") + (system* "patchelf" + "--set-interpreter" ld-so + "--set-rpath" rpath + cargo))))))) + (supported-systems '("i686-linux" "x86_64-linux")) + (home-page "https://www.rust-lang.org") + (synopsis "Prebuilt cargo package manager") + (description "This package provides a pre-built @command{cargo} package +manager, which is required to build itself.") + (license license:asl2.0))) + +(define rust-bootstrap + (package + (name "rust-bootstrap") + (version %rust-bootstrap-binaries-version) + (source #f) + (build-system trivial-build-system) + (propagated-inputs + `(("rustc-bootstrap" ,rustc-bootstrap) + ("cargo-bootstrap" ,cargo-bootstrap) + ("gcc" ,(canonical-package gcc)))) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (let ((out (assoc-ref %outputs "out")) + (gcc (assoc-ref %build-inputs "gcc"))) + (mkdir-p (string-append out "/bin")) + ;; Rust requires a C toolchain for linking. The prebuilt + ;; binaries expect a compiler called cc. Thus symlink gcc + ;; to cc. + (symlink (string-append gcc "/bin/gcc") + (string-append out "/bin/cc")))))) + (home-page "https://www.rust-lang.org") + (synopsis "Rust bootstrapping meta package") + (description "Meta package for a rust environment. Provides pre-compiled +rustc-bootstrap and cargo-bootstrap packages.") + (license license:asl2.0))) + +(define-public rustc + (package + (name "rustc") + (version (rustc-version %rust-bootstrap-binaries-version)) + (source (origin + (method url-fetch) + (uri (string-append + "https://static.rust-lang.org/dist/" + "rustc-" version "-src.tar.gz")) + (sha256 + (base32 + "0srvmhhdbbcl21nzg9m9zni7k10h88lsy8k1ljz03g8mx79fv467")))) + (build-system gnu-build-system) + (native-inputs + `(("cmake" ,cmake) + ("git" ,git) + ("python-2" ,python-2) + ("rust-bootstrap" ,rust-bootstrap) + ("which" ,which))) + (inputs + `(("jemalloc" ,jemalloc) + ("llvm" ,llvm))) + (arguments + ;; FIXME: Test failure with llvm 3.8; Update llvm. + ;; https://github.com/rust-lang/rust/issues/36835 + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-configure + (lambda _ + ;; Detect target CPU correctly. + (substitute* "configure" + (("/usr/bin/env") (which "env"))) + ;; Avoid curl as a build dependency. + (substitute* "configure" + (("probe_need CFG_CURL curl") "")))) + (add-after 'unpack 'set-env + (lambda _ + (setenv "SHELL" (which "sh")) + (setenv "CONFIG_SHELL" (which "sh")))) + (add-after 'unpack 'patch-lockfile-test + (lambda _ + (substitute* "src/tools/tidy/src/main.rs" + (("^.*cargo.*::check.*$") "")))) + (replace 'configure + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (gcc (assoc-ref inputs "gcc")) + (python (assoc-ref inputs "python-2")) + (rustc (assoc-ref inputs "rustc-bootstrap")) + (llvm (assoc-ref inputs "llvm")) + (jemalloc (assoc-ref inputs "jemalloc")) + (flags (list + (string-append "--prefix=" out) + (string-append "--datadir=" out "/share") + (string-append "--infodir=" out "/share/info") + (string-append "--default-linker=" gcc "/bin/gcc") + (string-append "--default-ar=" gcc "/bin/ar") + (string-append "--python=" python "/bin/python2") + (string-append "--local-rust-root=" rustc) + (string-append "--llvm-root=" llvm) + (string-append "--jemalloc-root=" jemalloc "/lib") + "--release-channel=stable" + "--enable-rpath" + "--enable-local-rust" + ;;"--enable-rustbuild" + "--disable-manage-submodules"))) + ;; Rust uses a custom configure script (no autoconf). + (zero? (apply system* "./configure" flags)))))))) + (synopsis "Compiler for the Rust progamming language") + (description "Rust is a systems programming language that provides memory +safety and thread safety guarantees.") + (home-page "https://www.rust-lang.org") + ;; Dual licensed. + (license (list license:asl2.0 license:expat)))) + +(define-public cargo + (package + (name "cargo") + (version (cargo-version (rustc-version %rust-bootstrap-binaries-version))) + (source (origin + (method url-fetch) + ;; Use a cargo tarball with vendored dependencies and a cargo + ;; config file. + (uri (string-append + "https://github.com/dvc94ch/cargo" + "/archive/" version "-cargo-vendor.tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0hpix5hwz10pm1wh65gimhsy9nxjvy7yikgbpw8afwglqr3bl856")))) + (build-system cargo-build-system) + (propagated-inputs + `(("cmake" ,cmake) + ("pkg-config" ,pkg-config))) + (inputs + `(("curl" ,curl) + ("libgit2" ,libgit2) + ("libssh2" ,libssh2) + ("openssl" ,openssl) + ("python-2" ,python-2) + ("zlib" ,zlib))) + (arguments + `(#:cargo ,cargo-bootstrap + #:tests? #f ; FIXME + #:phases + (modify-phases %standard-phases + ;; Avoid cargo complaining about missmatched checksums. + (delete 'patch-source-shebangs) + (delete 'patch-generated-file-shebangs) + (delete 'patch-usr-bin-file) + ;; Set CARGO_HOME to use the vendored dependencies. + (add-after 'unpack 'set-cargo-home + (lambda* (#:key inputs #:allow-other-keys) + (let* ((gcc (assoc-ref inputs "gcc")) + (cc (string-append gcc "/bin/gcc"))) + (setenv "CARGO_HOME" (string-append (getcwd) "/cargohome")) + (setenv "CMAKE_C_COMPILER" cc) + (setenv "CC" cc)) + #t))))) + (home-page "https://github.com/rust-lang/cargo") + (synopsis "Build tool and package manager for Rust") + (description "Cargo is a tool that allows Rust projects to declare their +dependencies and ensures a reproducible build.") + ;; Cargo is dual licensed Apache and MIT. Also contains + ;; code from openssl which is GPL2 with linking exception. + (license (list license:asl2.0 license:expat license:gpl2)))) diff --git a/gnu/packages/samba.scm b/gnu/packages/samba.scm index 1706ec3030..b2309f4b51 100644 --- a/gnu/packages/samba.scm +++ b/gnu/packages/samba.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2013, 2015 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -98,14 +99,14 @@ anywhere.") (define-public samba (package (name "samba") - (version "4.5.1") + (version "4.5.3") (source (origin (method url-fetch) (uri (string-append "https://download.samba.org/pub/samba/stable/" "samba-" version ".tar.gz")) (sha256 (base32 - "11ghsfvqxzfv8gnl62jfnpil9cwd04gak8sx5qcg6zv7d7h079xh")))) + "1jif95684swssqwp9v3i2r08cn3r2iddf6ly68db4wmvl5ac8vgh")))) (build-system gnu-build-system) (arguments '(#:phases @@ -121,11 +122,16 @@ anywhere.") ;; XXX: heimdal not packaged. "--bundled-libraries=com_err" (string-append "--prefix=" out) + "--sysconfdir=/etc" ;; Install public and private libraries into ;; a single directory to avoid RPATH issues. (string-append "--libdir=" libdir) - (string-append "--with-privatelibdir=" libdir))))))) - + (string-append "--with-privatelibdir=" libdir)))))) + (add-before 'install 'disable-etc-samba-directory-creation + (lambda _ + (substitute* "dynconfig/wscript" + (("bld\\.INSTALL_DIRS\\(\"\",[[:blank:]]{1,}\"\\$\\{CONFIGDIR\\}[[:blank:]]{1,}") + "bld.INSTALL_DIRS(\"\", \""))))) ;; XXX: The test infrastructure attempts to set password with ;; smbpasswd, which fails with "smbpasswd -L can only be used by root." ;; So disable tests until there's a workaround. diff --git a/gnu/packages/scanner.scm b/gnu/packages/scanner.scm index 76817b389f..7bdbf35f05 100644 --- a/gnu/packages/scanner.scm +++ b/gnu/packages/scanner.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 John Darrington <jmd@gnu.org> ;;; Copyright © 2015 Andy Wingo <wingo@igalia.com> +;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca> ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,24 +21,32 @@ (define-module (gnu packages scanner) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix utils) #:use-module (guix build-system gnu) #:use-module (gnu packages pkg-config) #:use-module (gnu packages libusb) #:use-module ((guix licenses) #:prefix licence:)) -(define-public sane-backends +(define-public sane-backends-minimal (package - (name "sane-backends") + (name "sane-backends-minimal") (version "1.0.25") (source (origin (method url-fetch) (uri (string-append "https://alioth.debian.org/frs/download.php/file/4146/" - name "-" version ".tar.gz")) + "sane-backends-" version ".tar.gz")) (sha256 (base32 - "0b3fvhrxl4l82bf3v0j47ypjv6a0k5lqbgknrq1agpmjca6vmmx4")))) + "0b3fvhrxl4l82bf3v0j47ypjv6a0k5lqbgknrq1agpmjca6vmmx4")) + (modules '((guix build utils))) + (snippet + ;; Generated HTML files and udev rules normally embed a + ;; timestamp. Work around that to build things reproducibly. + '(substitute* "tools/sane-desc.c" + (("asctime \\(localtime \\(¤t_time\\)\\)") + "\"1970-01-01\""))))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) @@ -47,6 +56,10 @@ `(#:tests? #f #:phases (modify-phases %standard-phases + (add-before 'configure 'disable-backends + (lambda _ + (setenv "BACKENDS" " ") + #t)) (add-after 'install 'install-udev-rules (lambda* (#:key outputs #:allow-other-keys) @@ -67,9 +80,48 @@ ;; **** File generated for html-backends-split mode is different from reference ;; Makefile:501: recipe for target 'check.local' failed (home-page "http://www.sane-project.org") - (synopsis "Raster image scanner library and drivers") + (synopsis + "Raster image scanner library and drivers, without scanner support") (description "SANE stands for \"Scanner Access Now Easy\" and is an API proving access to any raster image scanner hardware (flatbed scanner, hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The -package contains the library and drivers.") +package contains the library, but no drivers.") (license licence:gpl2+))) ; plus linking exception + +;; This variant links in the hpaio backend, provided by hplip, which adds +;; support for HP scanners whose backends are not maintained by +;; 'sane-backends'. It also builds all of those backends. +(define-public sane-backends + (package + (inherit sane-backends-minimal) + (name "sane-backends") + (inputs + `(("hplip" ,(@ (gnu packages cups) hplip)) + ,@(package-inputs sane-backends-minimal))) + (arguments + (substitute-keyword-arguments (package-arguments sane-backends-minimal) + ((#:phases phases) + `(modify-phases ,phases + (delete 'disable-backends) + (add-after 'unpack 'add-backends + (lambda _ + (substitute* "backend/dll.conf.in" + (("hp5590" all) (format #f "~a~%~a" all "hpaio"))) + #t)) + (add-after 'install 'install-hpaio + (lambda* (#:key inputs outputs #:allow-other-keys) + (define hplip (string-append (assoc-ref inputs "hplip") + "/lib/sane")) + (define out (string-append (assoc-ref outputs "out") + "/lib/sane")) + (for-each + (lambda (file) + (symlink file (string-append out "/" (basename file)))) + (find-files hplip)) + #t)))))) + (synopsis + "Raster image scanner library and drivers, with scanner support") + (description "SANE stands for \"Scanner Access Now Easy\" and is an API +proving access to any raster image scanner hardware (flatbed scanner, +hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The +package contains the library and drivers."))) diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm index 16b1b5586c..2756805f3d 100644 --- a/gnu/packages/scheme.scm +++ b/gnu/packages/scheme.scm @@ -323,20 +323,24 @@ mashups, office (web agendas, mail clients, ...), etc.") (define-public chicken (package (name "chicken") - (version "4.11.0") + (version "4.11.1") (source (origin - (method url-fetch) - (uri (string-append "http://code.call-cc.org/releases/" - version "/chicken-" version ".tar.gz")) - (sha256 - (base32 - "12ddyiikqknpr8h6llsxbg2fz75xnayvcnsvr1cwv8xnjn7jpp73")))) + (method url-fetch) + (uri (string-append "http://code.call-cc.org/releases/" + version "/chicken-" version ".tar.gz")) + (uri (string-append "http://code.call-cc.org/dev-snapshots/" + "2016/09/12/chicken-" version ".tar.gz")) + (sha256 + (base32 + "1rwymbbmnwdyhdzilv9w75an989xw9kjf3x52iqdng3nphpflcga")) + (patches + (search-patches "chicken-CVE-2016-6830+CVE-2016-6831.patch")))) (build-system gnu-build-system) (arguments `(#:modules ((guix build gnu-build-system) (guix build utils) (srfi srfi-1)) - + ;; No `configure' script; run "make check" after "make install" as ;; prescribed by README. #:phases @@ -344,14 +348,7 @@ mashups, office (web agendas, mail clients, ...), etc.") (delete 'configure) (delete 'check) (add-after 'install 'check - (assoc-ref %standard-phases 'check)) - (add-after 'unpack 'disable-broken-tests - (lambda _ - ;; The port tests fail with this error: - ;; Error: (line 294) invalid escape-sequence '\x o' - (substitute* "tests/runtests.sh" - (("\\$interpret -s port-tests\\.scm") "")) - #t))) + (assoc-ref %standard-phases 'check))) #:make-flags (let ((out (assoc-ref %outputs "out"))) (list "PLATFORM=linux" @@ -578,7 +575,7 @@ mixed.") (list (string-append "PREFIX=" out) (string-append "LDFLAGS=-Wl,-rpath=" out "/lib"))) #:test-target "test")) - (home-page "https://code.google.com/p/chibi-scheme/") + (home-page "https://github.com/ashinn/chibi-scheme") (synopsis "Small embeddable Scheme implementation") (description "Chibi-Scheme is a very small library with no external dependencies diff --git a/gnu/packages/sdl.scm b/gnu/packages/sdl.scm index bb4ad1c90b..cb0af1ceed 100644 --- a/gnu/packages/sdl.scm +++ b/gnu/packages/sdl.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2015 David Thompson <dthompson2@worcester.edu> +;;; Copyright © 2013, 2015, 2017 David Thompson <dthompson2@worcester.edu> ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com> ;;; Copyright © 2015 Alex Kost <alezost@gmail.com> @@ -29,8 +29,11 @@ #:use-module (guix build-system gnu) #:use-module (guix build-system trivial) #:use-module (gnu packages audio) + #:use-module (gnu packages fcitx) #:use-module (gnu packages fontutils) + #:use-module (gnu packages glib) #:use-module (gnu packages guile) + #:use-module (gnu packages ibus) #:use-module (gnu packages image) #:use-module (gnu packages linux) #:use-module (gnu packages mp3) @@ -97,6 +100,16 @@ joystick, and graphics hardware.") (sha256 (base32 "11c75qj1qxmx67iwkvf9z4x69phk301pdn86zzr6jncnap7kh824")))) + (inputs + ;; SDL2 needs to be built with ibus support otherwise some systems + ;; experience a bug where input events are doubled. + ;; + ;; For more information, see: https://dev.solus-project.com/T1721 + (append `(("dbus" ,dbus) + ("fcitx" ,fcitx) ; helps with CJK input + ("glib" ,glib) + ("ibus" ,ibus)) + (package-inputs sdl))) (license bsd-3))) (define-public libmikmod diff --git a/gnu/packages/security-token.scm b/gnu/packages/security-token.scm index 8f58c589d9..e1b87adff9 100644 --- a/gnu/packages/security-token.scm +++ b/gnu/packages/security-token.scm @@ -93,15 +93,15 @@ the low-level development kit for the Yubico YubiKey authentication device.") (define-public pcsc-lite (package (name "pcsc-lite") - (version "1.8.18") + (version "1.8.20") (source (origin (method url-fetch) (uri (string-append - "https://alioth.debian.org/frs/download.php/file/4179/" + "https://alioth.debian.org/frs/download.php/file/4203/" "pcsc-lite-" version ".tar.bz2")) (sha256 (base32 - "0189s10xsgcmdvc2sixakncwlv47cg6by6m9vdm038gn32q34bdj")))) + "1ckb0jf4n585a4j26va3jm2nrv3c1y38974514f8qy3c04a02zgc")))) (build-system gnu-build-system) (arguments `(#:configure-flags '("--enable-usbdropdir=/var/lib/pcsc/drivers"))) diff --git a/gnu/packages/serialization.scm b/gnu/packages/serialization.scm index 31444509f1..8db81c581c 100644 --- a/gnu/packages/serialization.scm +++ b/gnu/packages/serialization.scm @@ -154,7 +154,7 @@ serialization.") (define-public jsoncpp (package (name "jsoncpp") - (version "1.7.7") + (version "1.8.0") (source (origin (method url-fetch) (uri (string-append @@ -163,9 +163,11 @@ serialization.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "15wg14480lrbrhc2myk9rwpwb2gzix9bk80p4y7gxg3zrzml0xh8")))) + "1g35ci93s03wph4kabi46iz42wgyfbn2763cklf15h7hrdi29ssx")))) (build-system cmake-build-system) (home-page "https://github.com/open-source-parsers/jsoncpp") + (arguments + `(#:configure-flags '("-DBUILD_SHARED_LIBS:BOOL=YES"))) (synopsis "C++ library for interacting with JSON") (description "JsonCpp is a C++ library that allows manipulating JSON values, including serialization and deserialization to and from strings. It can also diff --git a/gnu/packages/shells.scm b/gnu/packages/shells.scm index f3350ef501..960cb1f2a2 100644 --- a/gnu/packages/shells.scm +++ b/gnu/packages/shells.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2014 Kevin Lemonnier <lemonnierk@ulrar.net> ;;; Copyright © 2015 Jeff Mickey <j@codemac.net> ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2016 Stefan Reichör <stefan@xsteve.at> ;;; ;;; This file is part of GNU Guix. ;;; @@ -174,6 +175,7 @@ has a small feature set similar to a traditional Bourne shell.") (define-public tcsh (package (name "tcsh") + (replacement tcsh/fixed) (version "6.18.01") (source (origin (method url-fetch) @@ -231,6 +233,15 @@ command-line editor, programmable word completion, spelling correction, a history mechanism, job control and a C-like syntax.") (license bsd-4))) +(define tcsh/fixed + (package + (inherit tcsh) + (name "tcsh") + (source (origin + (inherit (package-source tcsh)) + (patches (cons (search-patch "tcsh-fix-out-of-bounds-read.patch") + (origin-patches (package-source tcsh)))))))) + (define-public zsh (package (name "zsh") @@ -288,21 +299,21 @@ ksh, and tcsh.") (define-public xonsh (package (name "xonsh") - (version "0.4.7") + (version "0.5.1") (source (origin (method url-fetch) (uri (pypi-uri "xonsh" version)) (sha256 (base32 - "04b0z41mxiwsp5rl21fzrixcdmx2kndjlh4gn3582qfga9hihf20")) + "1a3jkvfh1xc6aw557y8zjn498q89bapyx4dxc3md7qwrmnj9pkv3")) (modules '((guix build utils))) (snippet `(begin ;; Delete bundled ply. (delete-file-recursively "xonsh/ply") (substitute* '("setup.py") - (("'xonsh\\.ply',") "")) + (("'xonsh\\.ply\\.ply',") "")) #t)))) (build-system python-build-system) (arguments @@ -316,8 +327,8 @@ ksh, and tcsh.") (synopsis "Python-ish shell") (description "Xonsh is a Python-ish, BASHwards-looking shell language and command -prompt. The language is a superset of Python 3.4+ with additional shell -primitives that you are used to from Bash and IPython. It works on all major -systems including Linux, Mac OSX, and Windows. Xonsh is meant for the daily +prompt. The language is a superset of Python 3.4+ with additional shell +primitives that you are used to from Bash and IPython. It works on all major +systems including Linux, Mac OSX, and Windows. Xonsh is meant for the daily use of experts and novices alike.") (license bsd-2))) diff --git a/gnu/packages/shellutils.scm b/gnu/packages/shellutils.scm index 894ec7804a..c9a35ca3b6 100644 --- a/gnu/packages/shellutils.scm +++ b/gnu/packages/shellutils.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com> -;;; Copyright © 2016 Alex Griffin <a@ajgrf.com> +;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com> ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net> ;;; ;;; This file is part of GNU Guix. @@ -58,14 +58,14 @@ between various shells or commands.") (define-public trash-cli (package (name "trash-cli") - (version "0.12.9.14") + (version "0.17.1.1") (source (origin (method url-fetch) (uri (pypi-uri "trash-cli" version)) (sha256 (base32 - "1p4v2qx0sy47d9c9axszq04wns63s4b7rrhmsavg948sklqdaf54")))) + "019sjab29jkps8zkf8icihhf3ng4lx9y4p1lxjd3wbnnynphc4is")))) (build-system python-build-system) (arguments `(#:python ,python-2 @@ -94,7 +94,7 @@ are already there.") (define-public direnv (package (name "direnv") - (version "2.9.0") + (version "2.10.0") (source (origin (method url-fetch) (uri (string-append "https://github.com/direnv/" name @@ -102,7 +102,7 @@ are already there.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "04v3v2sz9m6ivgbxcplxscj1dsvpaqpqnxgls4060naj3iz9sg82")))) + "1h5ywn0glw1kmxs3jwjv9fvnhha942c6k740p5ghvyns05ds9cqf")))) (build-system gnu-build-system) (arguments '(#:test-target "test" diff --git a/gnu/packages/speech.scm b/gnu/packages/speech.scm index 39a940dfde..1d903520e7 100644 --- a/gnu/packages/speech.scm +++ b/gnu/packages/speech.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Thompson <davet@gnu.org> ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> +;;; Copyright © 2017 Leo Famulari <leo@famulari.name> ;;; ;;; This file is part of GNU Guix. ;;; @@ -92,3 +93,36 @@ stable and well documented interface.") ;; festival_client.{c,h} carries an expat-style license. "See src/modules/festival_client.c in the distribution.") license:gpl3+)))) ; doc/texinfo.tex -- with TeX exception. + +(define-public sonic + (package + (name "sonic") + (version "0.2.0") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/waywardgeek/sonic/archive/" + "release-" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "11a0q9wkgbb9ymf52v7dvybfhj8hprgr67zs1xcng143fvjpr0n7")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; No test suite. + #:make-flags + (list (string-append "DESTDIR=" (assoc-ref %outputs "out"))) + #:phases + (modify-phases %standard-phases + (delete 'configure)))) ; No ./configure script. + (synopsis "Speed up or slow down speech") + (description "Sonic implements a simple algorithm for speeding up or slowing +down speech. However, it's optimized for speed ups of over 2X, unlike previous +algorithms for changing speech rate. Sonic is a C library designed to be easily +integrated into streaming voice applications such as text-to-speech (TTS) back +ends. + +The primary motivation behind Sonic is to enable the blind and visually impaired +to improve their productivity with speech engines, like eSpeak. Sonic can also +be used by the sighted.") + (home-page "https://github.com/waywardgeek/sonic") + (license license:asl2.0))) diff --git a/gnu/packages/spice.scm b/gnu/packages/spice.scm index c0e8d240cf..805f47a600 100644 --- a/gnu/packages/spice.scm +++ b/gnu/packages/spice.scm @@ -217,7 +217,7 @@ which allows users to view a desktop computing environment.") (inputs `(("cyrus-sasl" ,cyrus-sasl) ("glib" ,glib) - ("libjpeg" ,libjpeg) + ("libjpeg-turbo" ,libjpeg-turbo) ("lz4" ,lz4) ("opus" ,opus) ("zlib" ,zlib))) diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm index 65f118f5ca..5b6800346c 100644 --- a/gnu/packages/ssh.scm +++ b/gnu/packages/ssh.scm @@ -112,7 +112,7 @@ a server that supports the SSH-2 protocol.") (define-public openssh (package (name "openssh") - (version "7.3p1") + (version "7.4p1") (source (origin (method url-fetch) (uri (let ((tail (string-append name "-" version ".tar.gz"))) @@ -122,9 +122,8 @@ a server that supports the SSH-2 protocol.") tail) (string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/" tail)))) - (patches (search-patches "openssh-memory-exhaustion.patch")) (sha256 (base32 - "1k5y1wi29d47cgizbryxrhc1fbjsba2x8l5mqfa9b9nadnd9iyrz")))) + "1l8r3x4fr2kb6xm95s7kjdif1wp6f94d4kljh4qjj9109shw87qv")))) (build-system gnu-build-system) (inputs `(("groff" ,groff) ("openssl" ,openssl) diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm index 700a8957cc..40a511b6ed 100644 --- a/gnu/packages/statistics.scm +++ b/gnu/packages/statistics.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl> ;;; Copyright © 2016 Roel Janssen <roel@gnu.org> ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com> +;;; Copyright © 2016 Raoul Bonnal <ilpuccio.febo@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -101,7 +102,7 @@ be output in text, PostScript, PDF or HTML.") (define-public r (package (name "r") - (version "3.3.1") + (version "3.3.2") (source (origin (method url-fetch) (uri (string-append "mirror://cran/src/base/R-" @@ -109,7 +110,7 @@ be output in text, PostScript, PDF or HTML.") version ".tar.gz")) (sha256 (base32 - "1qm9znh8akfy9fkzzi6f1vz2w1dd0chsr6qn7kw80lqzhgjrmi9x")))) + "0k2i9qdd83g09fcpls2198q4ykxkii5skczb514gnx7mx4hsv56j")))) (build-system gnu-build-system) (arguments `(#:make-flags @@ -205,16 +206,63 @@ publication-quality data plots. A large amount of 3rd-party packages are available, greatly increasing its breadth and scope.") (license license:gpl3+))) +(define-public r-bit + (package + (name "r-bit") + (version "1.1-12") + (source + (origin + (method url-fetch) + (uri (cran-uri "bit" version)) + (sha256 + (base32 + "0a6ig6nnjzq80r2ll4hc74za3xwzbzig6wlyb4dby0knzf3iqa6f")))) + (build-system r-build-system) + (home-page "http://ff.r-forge.r-project.org") + (synopsis "Class for vectors of 1-bit booleans") + (description + "This package provides bitmapped vectors of booleans (no @code{NA}s), +coercion from and to logicals, integers and integer subscripts, fast boolean +operators and fast summary statistics. With @code{bit} class vectors of true +binary booleans, @code{TRUE} and @code{FALSE} can be stored with 1 bit only.") + (license license:gpl2))) + +(define-public r-bit64 + (package + (name "r-bit64") + (version "0.9-5") + (source + (origin + (method url-fetch) + (uri (cran-uri "bit64" version)) + (sha256 + (base32 + "0fz5m3fhvxgwjl76maag7yn0zdw24rx34gy6v77378fajag9yllg")))) + (build-system r-build-system) + (propagated-inputs + `(("r-bit" ,r-bit))) + (home-page "http://ff.r-forge.r-project.org/") + (synopsis "S3 class for vectors of 64 bit integers") + (description + "The bit64 package provides serializable S3 atomic 64 bit (signed) +integers that can be used in vectors, matrices, arrays and @code{data.frames}. +Methods are available for coercion from and to logicals, integers, doubles, +characters and factors as well as many elementwise and summary functions. +Many fast algorithmic operations such as @code{match} and @code{order} support +interactive data exploration and manipulation and optionally leverage +caching.") + (license license:gpl2))) + (define-public r-colorspace (package (name "r-colorspace") - (version "1.2-7") + (version "1.3-2") (source (origin (method url-fetch) (uri (cran-uri "colorspace" version)) (sha256 - (base32 "0flw97iwwpkxy6si9cn982jhl61wb1rxi3r0nz2xxf0c3fzw18d5")))) + (base32 "0d1ya7hx4y58n5ivwmdmq2zgh0g2sbv7ykh13n85c1355csd57yx")))) (build-system r-build-system) (home-page "http://cran.r-project.org/web/packages/colorspace") (synopsis "Color space manipulation") @@ -276,13 +324,13 @@ OpenSSL should be used.") (define-public r-estimability (package (name "r-estimability") - (version "1.1-1") + (version "1.2") (source (origin (method url-fetch) (uri (cran-uri "estimability" version)) (sha256 (base32 - "049adh8i0ad0m0qln2ylqdxcs5v2q9zfignn2a50r5f93ip2ay6w")))) + "13b80bpnbrarazjvnpnk91ljjsqgfm2fm3gy66aj09cmmsmv199h")))) (build-system r-build-system) (home-page "http://cran.r-project.org/web/packages/estimability") (synopsis "Tools for assessing estimability of linear predictions") @@ -394,13 +442,13 @@ Munsell colour system.") (define-public r-rcpp (package (name "r-rcpp") - (version "0.12.7") + (version "0.12.8") (source (origin (method url-fetch) (uri (cran-uri "Rcpp" version)) (sha256 - (base32 "1ipid4yfqp1k5c70f7bz7izzq63srmrcxhiqrnyilk2wgrvd7ypb")))) + (base32 "0is1vql1q82g7yakad4skx707ip0fx3rgdwv9a8mi8259gly2qji")))) (build-system r-build-system) (home-page "http://www.rcpp.org") (synopsis "Seamless R and C++ Integration") @@ -440,14 +488,14 @@ and operations on them using LAPACK and SuiteSparse.") (define-public r-mgcv (package (name "r-mgcv") - (version "1.8-15") + (version "1.8-16") (source (origin (method url-fetch) (uri (cran-uri "mgcv" version)) (sha256 (base32 - "05xzmsx51y92c0r0yihac8m9d3v1sqnn8ahcgm3q75j8z6zybsjs")))) + "0pj31gdwra7nv8spys4pfcbmsik99q1y1d0d2g37ywc3sz5s0rlj")))) (build-system r-build-system) (home-page "http://cran.r-project.org/web/packages/mgcv") (synopsis "Mixed generalised additive model computation") @@ -638,13 +686,13 @@ using just two functions: melt and dcast (or acast).") (define-public r-scales (package (name "r-scales") - (version "0.4.0") + (version "0.4.1") (source (origin (method url-fetch) (uri (cran-uri "scales" version)) (sha256 - (base32 "19y6q4j8vpmc73dnn4ncp5wj44gri7m77ys3z2rn3crrcc9zc7l5")))) + (base32 "1lqccfmqdwrw0cjyqvw2zvgpk2jvnqrfb303l1raqyyf3zxqhav4")))) (build-system r-build-system) (propagated-inputs `(("r-dichromat" ,r-dichromat) @@ -664,22 +712,22 @@ legends.") (define-public r-ggplot2 (package (name "r-ggplot2") - (version "2.1.0") + (version "2.2.1") (source (origin (method url-fetch) (uri (cran-uri "ggplot2" version)) (sha256 - (base32 "0s9rvp0f736ji6p9xpxq54agxf95pjkql4sj7ag0hv2xhnp27hzj")))) + (base32 "0543782ddv2hp6s0l702mnxfg8n7a6qlbm8bm55x22hnqgz8kg2z")))) (build-system r-build-system) (propagated-inputs `(("r-digest" ,r-digest) ("r-gtable" ,r-gtable) ("r-plyr" ,r-plyr) - ("r-proto" ,r-proto) + ("r-lazyeval" ,r-lazyeval) + ("r-tibble" ,r-tibble) ("r-reshape2" ,r-reshape2) - ("r-scales" ,r-scales) - ("r-svglite" ,r-svglite))) + ("r-scales" ,r-scales))) (home-page "http://ggplot2.org") (synopsis "An implementation of the grammar of graphics") (description @@ -694,14 +742,14 @@ aesthetic attributes.") (define-public r-gdtools (package (name "r-gdtools") - (version "0.1.1") + (version "0.1.3") (source (origin (method url-fetch) (uri (cran-uri "gdtools" version)) (sha256 (base32 - "1l9d759x9s4ddz51sls8kcjps2i9kwfbc72dnagrdavh82h0al8n")))) + "1prh814lw3qkgnf0760cvpic1k68jhlkpcxlksv8chjkvsrnnf09")))) (build-system r-build-system) (native-inputs `(("r-rcpp" ,r-rcpp) @@ -720,14 +768,14 @@ and to generate base64 encoded string from raster matrix.") (define-public r-svglite (package (name "r-svglite") - (version "1.1.0") + (version "1.2.0") (source (origin (method url-fetch) (uri (cran-uri "svglite" version)) (sha256 (base32 - "11ryicjglfi6jvkk4jgg5kra42qbs5z2zid7jjhlslpjcljfwc70")))) + "1s1gvmlmmna5y4jsn9h6438pg5b86fl4nwfvkgm6n4h6ljfgqyx3")))) (build-system r-build-system) (native-inputs `(("r-rcpp" ,r-rcpp))) (propagated-inputs @@ -803,13 +851,13 @@ R/DBMS implementations.") (define-public r-bh (package (name "r-bh") - (version "1.60.0-2") + (version "1.62.0-1") (source (origin (method url-fetch) (uri (cran-uri "BH" version)) (sha256 (base32 - "136497fng9bcvrf8favpj8inz96pxdwp1rrb2k00sxjxjbgawhg4")))) + "01vfdpfznd4ynqql33z238xr262mvy3i80lyi8l3a3p3hi0a262p")))) (build-system r-build-system) (home-page "https://github.com/eddelbuettel/bh") (synopsis "R package providing subset of Boost headers") @@ -926,13 +974,13 @@ syntax that can be converted to XHTML or other formats.") (define-public r-yaml (package (name "r-yaml") - (version "2.1.13") + (version "2.1.14") (source (origin (method url-fetch) (uri (cran-uri "yaml" version)) (sha256 (base32 - "18kz5mfn7qpif5pn91w4vbrc5bkycsj85vwm5wxwzjlb02i9mxi6")))) + "0x88xicrf7vwp77xgan27mnpdljhpkn0pz5kphnwqi3ddy25k9a1")))) (build-system r-build-system) (home-page "https://cran.r-project.org/web/packages/yaml/") (synopsis "Methods to convert R data to YAML and back") @@ -944,18 +992,17 @@ emitter (http://pyyaml.org/wiki/LibYAML) for R.") (define-public r-knitr (package (name "r-knitr") - (version "1.14") + (version "1.15.1") (source (origin (method url-fetch) (uri (cran-uri "knitr" version)) (sha256 (base32 - "1v0s0knb294p7a2xkwy35bhg0w8p3qcgyphd748sj86hh8a30vds")))) + "1pbxd3k7kv5sa1a5gxm0zc2bhjxdgx2nfch9xap5k85djmgsfqc1")))) (build-system r-build-system) (propagated-inputs `(("r-evaluate" ,r-evaluate) ("r-digest" ,r-digest) - ("r-formatr" ,r-formatr) ("r-highr" ,r-highr) ("r-markdown" ,r-markdown) ("r-stringr" ,r-stringr) @@ -1323,13 +1370,13 @@ and density estimation.") (define-public r-chron (package (name "r-chron") - (version "2.3-47") + (version "2.3-48") (source (origin (method url-fetch) (uri (cran-uri "chron" version)) (sha256 (base32 - "1xj50kk8b8mbjpszp8i0wbripb5a4b36jcscwlbyap8n4487g34s")))) + "1q1d0p2wq19w3mpfqnrg8nmspxqmhv4ap52r393s6y3abl36ccac")))) (build-system r-build-system) (home-page "http://cran.r-project.org/web/packages/chron") (synopsis "Chronological R objects which can handle dates and times") @@ -1341,16 +1388,14 @@ times.") (define-public r-data-table (package (name "r-data-table") - (version "1.9.6") + (version "1.10.0") (source (origin (method url-fetch) (uri (cran-uri "data.table" version)) (sha256 (base32 - "0vi3zplpxqbg78z9ifjfs1kl2i8qhkqxr7l9ysp2663kq54w6x3g")))) + "1168arn4wjd1jj7kgr4sb8xd52hr8p8iqp85g5jwp3mkz4p76qfg")))) (build-system r-build-system) - (propagated-inputs - `(("r-chron" ,r-chron))) (home-page "https://github.com/Rdatatable/data.table/wiki") (synopsis "Enhanced version of data.frame R object") (description @@ -1394,13 +1439,7 @@ and fast file reading.") (arguments `(#:phases (modify-phases %standard-phases - (replace 'check (lambda _ (zero? (system* "nosetests" "-v")))) - (add-after 'unpack 'prevent-generation-of-egg-archive - (lambda _ - (substitute* "setup.py" - (("from setuptools import setup") - "from distutils.core import setup")) - #t))))) + (replace 'check (lambda _ (zero? (system* "nosetests" "-v"))))))) (propagated-inputs `(("python-numpy" ,python-numpy) ("python-scipy" ,python-scipy) @@ -1416,15 +1455,10 @@ building design matrices.") ;; The majority of the code is distributed under BSD-2. The module ;; patsy.compat contains code derived from the Python standard library, ;; and is covered by the PSFL. - (license (list license:bsd-2 license:psfl)) - (properties `((python2-variant . ,(delay python2-patsy)))))) + (license (list license:bsd-2 license:psfl)))) (define-public python2-patsy - (let ((patsy (package-with-python2 (strip-python2-variant python-patsy)))) - (package (inherit patsy) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs patsy)))))) + (package-with-python2 python-patsy)) (define-public python-statsmodels (package @@ -1455,11 +1489,13 @@ building design matrices.") line))) #t)) (add-after 'install 'check - (lambda _ - (with-directory-excursion "/tmp" - (zero? (system* "nosetests" - "--stop" - "-v" "statsmodels")))))))) + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Make installed package available for running the tests + (add-installed-pythonpath inputs outputs) + (with-directory-excursion "/tmp" + (zero? (system* "nosetests" + "--stop" + "-v" "statsmodels")))))))) (propagated-inputs `(("python-numpy" ,python-numpy) ("python-scipy" ,python-scipy) @@ -1487,24 +1523,19 @@ inference for statistical models.") ("python2-scipy" ,python2-scipy) ("python2-pandas" ,python2-pandas) ("python2-patsy" ,python2-patsy) - ("python2-matplotlib" ,python2-matplotlib))) - (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ,@(package-native-inputs stats)))))) + ("python2-matplotlib" ,python2-matplotlib)))))) (define-public r-coda (package (name "r-coda") - (version "0.18-1") + (version "0.19-1") (source (origin (method url-fetch) (uri (cran-uri "coda" version)) (sha256 (base32 - "03sc780734zj2kqcm8lkyvf76fql0jbfhkblpn8l58zmb6cqi958")))) + "14a4a8df4ygj05h37chmdn8kzcqs07fpbflxfrq530563mrza7yl")))) (build-system r-build-system) - (propagated-inputs - `(("r-lattice" ,r-lattice))) (home-page "http://cran.r-project.org/web/packages/coda") (synopsis "This is a package for Output Analysis and Diagnostics for MCMC") (description "This package provides functions for summarizing and plotting @@ -1516,14 +1547,14 @@ chain.") (define-public r-ade4 (package (name "r-ade4") - (version "1.7-4") + (version "1.7-5") (source (origin (method url-fetch) (uri (cran-uri "ade4" version)) (sha256 (base32 - "17sbicash7z4b63dlrbaf8xx2pbwh62vykzvhdjs43h8jkl881y7")))) + "0aaqbnydm5fb37nrvqj4bx6hxax7255j426cwh2lh88nyvznbq37")))) (build-system r-build-system) (home-page "http://pbil.univ-lyon1.fr/ADE-4") (synopsis "Multivariate data analysis and graphical display") @@ -1788,14 +1819,14 @@ collation, and NAMESPACE files.") (define-public r-openssl (package (name "r-openssl") - (version "0.9.5") + (version "0.9.6") (source (origin (method url-fetch) (uri (cran-uri "openssl" version)) (sha256 (base32 - "1lal8mmcwjhhln10mfi96ipv3d364k0wiviiln220wvhddcpr9pp")))) + "0ffwllii8xl6sa2v66134g0fwaw1y3zn3mvaa4nrc120vv5d3mkd")))) (build-system r-build-system) (inputs `(("openssl" ,openssl))) @@ -1845,13 +1876,13 @@ functions make it easy to control additional request components.") (define-public r-git2r (package (name "r-git2r") - (version "0.15.0") + (version "0.18.0") (source (origin (method url-fetch) (uri (cran-uri "git2r" version)) (sha256 (base32 - "1rpdf85wy9fp456ypvbhl3p9whkb7kgl0n7rkqxd2bhvyzkvjak8")))) + "0bgzdsdi9n6l8pchivs6a2g4ksa56qs8hygpyv2c0ndqmx4jxcwi")))) (build-system r-build-system) ;; This R package contains modified sources of libgit2. This modified ;; version of libgit2 is built as the package is built. Hence libgit2 is @@ -1938,14 +1969,14 @@ were originally a part of the r-devtools package.") (define-public r-hms (package (name "r-hms") - (version "0.2") + (version "0.3") (source (origin (method url-fetch) (uri (cran-uri "hms" version)) (sha256 (base32 - "0ln1dc26mkl5pc26vvyf01d35x75q6cjaj39cccxp67chbwbdlds")))) + "127znf522r5mn3k6frhdd7pqh063bs3l85gn9h7cx50hpjf2as4k")))) (build-system r-build-system) (home-page "https://github.com/rstats-db/hms") (synopsis "Pretty time of day") @@ -1982,13 +2013,13 @@ disk (or a connection).") (define-public r-plotrix (package (name "r-plotrix") - (version "3.6-3") + (version "3.6-4") (source (origin (method url-fetch) (uri (cran-uri "plotrix" version)) (sha256 (base32 - "0h97jra8zqssi9j4i0psa6c7ya49ya8jd2qc18lc61a4s2yn8w91")))) + "1wxzjnzvkl3aga51ad2xhv4s7v46kvnp4z0nz4cb9cn10057sfw8")))) (build-system r-build-system) (home-page "http://cran.r-project.org/web/packages/plotrix") (synopsis "Various plotting functions") @@ -2061,13 +2092,13 @@ well as additional utilities such as panel and axis annotation functions.") (define-public r-rcpparmadillo (package (name "r-rcpparmadillo") - (version "0.7.500.0.0") + (version "0.7.600.1.0") (source (origin (method url-fetch) (uri (cran-uri "RcppArmadillo" version)) (sha256 (base32 - "06qb6877c5qd8lvnc4b27z8fwb5r5pyylkj0g6kj1rn868zkh5ps")) + "0k1wniip184j0ckcg9kcjy2q4mcfj5jpd1nkk4l0ab75ad8znywv")) (modules '((guix build utils))) ;; Remove bundled armadillo sources (snippet @@ -2142,27 +2173,50 @@ ENVI binary files, fast calculation of AUC, LogitBoost classifier, base64 encoder/decoder, round-off-error-free sum and cumsum, etc.") (license license:gpl3+))) +(define-public r-rprojroot + (package + (name "r-rprojroot") + (version "1.1") + (source + (origin + (method url-fetch) + (uri (cran-uri "rprojroot" version)) + (sha256 + (base32 + "04ywfpar4d2hyi4rh4fbixrbzd665gpa2jhx67g8857cr70pp0nh")))) + (build-system r-build-system) + (propagated-inputs + `(("r-backports" ,r-backports))) + (home-page "https://github.com/krlmlr/rprojroot") + (synopsis "Finding files in project subdirectories") + (description + "This package helps accessing files relative to a project root. It +provides helpers for robust, reliable and flexible paths to files below a +project root. The root of a project is defined as a directory that matches a +certain criterion, e.g., it contains a certain regular file.") + (license license:gpl3))) + (define-public r-rmarkdown (package (name "r-rmarkdown") - (version "1.1") + (version "1.3") (source (origin (method url-fetch) (uri (cran-uri "rmarkdown" version)) (sha256 (base32 - "1czvkaz1ji3jyj6qrvbswisqs9d05ljqc4vjkfdrf6hygix7azd0")))) + "1vvxyf3zhyxx6k697lia299456hryp8nh3zr0fc27f3107a8mcjf")))) (properties `((upstream-name . "rmarkdown"))) (build-system r-build-system) (propagated-inputs `(("r-catools" ,r-catools) ("r-evaluate" ,r-evaluate) - ("r-tibble" ,r-tibble) ("r-htmltools" ,r-htmltools) ("r-jsonlite" ,r-jsonlite) ("r-base64enc" ,r-base64enc) ("r-knitr" ,r-knitr) + ("r-rprojroot" ,r-rprojroot) ("r-yaml" ,r-yaml) ("ghc-pandoc" ,ghc-pandoc))) (home-page "http://rmarkdown.rstudio.com") @@ -2215,20 +2269,44 @@ grobs.") and draw tables.") (license license:gpl2+))) +(define-public r-plogr + (package + (name "r-plogr") + (version "0.1-1") + (source + (origin + (method url-fetch) + (uri (cran-uri "plogr" version)) + (sha256 + (base32 + "13zliqlbkl8b04k9ga0sx5jsh7k867gracgl84l2a9kcqy9mqx92")))) + (build-system r-build-system) + (home-page "https://github.com/krlmlr/plogr") + (synopsis "R bindings for the plog C++ logging library") + (description + "This package provides the header files for a stripped-down version of +the plog header-only C++ logging library, and a method to log to R's standard +error stream.") + (license license:expat))) + (define-public r-rsqlite (package (name "r-rsqlite") - (version "1.0.0") + (version "1.1-1") (source (origin (method url-fetch) (uri (cran-uri "RSQLite" version)) (sha256 (base32 - "08b1syv8z887gxiw8i09dpqh0zisfb6ihq6qqr01zipvkahzq34f")))) + "11vnzds5gidgakdmsbdn0bvnsz064ym1savwb7l6gc1bjn7xa2k4")))) (properties `((upstream-name . "RSQLite"))) (build-system r-build-system) (propagated-inputs - `(("r-dbi" ,r-dbi))) + `(("r-dbi" ,r-dbi) + ("r-bh" ,r-bh) + ("r-memoise" ,r-memoise) + ("r-plogr" ,r-plogr) + ("r-rcpp" ,r-rcpp))) (home-page "https://github.com/rstats-db/RSQLite") (synopsis "SQLite interface for R") (description @@ -2271,20 +2349,18 @@ ldap, and also supports cookies, redirects, authentication, etc.") (define-public r-xml (package (name "r-xml") - (version "3.98-1.4") + (version "3.98-1.5") (source (origin (method url-fetch) (uri (cran-uri "XML" version)) (sha256 (base32 - "09hiy5a875v2fhsgrsfymrwccn9249wnnsr6ck2slrig65svq2lw")))) + "0dcdj7ryn8lm7wmv4hqhh9jxa5k97l6ad8xyvb932yfkwj1g1byy")))) (properties `((upstream-name . "XML"))) (build-system r-build-system) (inputs `(("libxml2" ,libxml2))) - (propagated-inputs - `(("r-rcurl" ,r-rcurl))) (home-page "http://www.omegahat.org/RSXML") (synopsis "Tools for parsing and generating XML within R") (description @@ -2432,13 +2508,13 @@ worker processes and collect and return the results on the master.") (define-public r-sparsem (package (name "r-sparsem") - (version "1.72") + (version "1.74") (source (origin (method url-fetch) (uri (cran-uri "SparseM" version)) (sha256 (base32 - "0zpb1swn9xjkb22sky10ixff7vqfiz9m36nkbc1qqbm9frcldnka")))) + "1fpfhld887y5lyb8jydprmv5krqm1fk6n53z942b4g4z1v4g04j7")))) (properties `((upstream-name . "SparseM"))) (inputs @@ -2966,13 +3042,13 @@ maintenance for package developers.") (define-public r-r-utils (package (name "r-r-utils") - (version "2.4.0") + (version "2.5.0") (source (origin (method url-fetch) (uri (cran-uri "R.utils" version)) (sha256 (base32 - "0cn0wlmgwclmqak05825wrk9q894xa4qjqa7rn0i9p4ss7k6vifj")))) + "17q3w5dlly5xl2srrzsmf9s7vs5d576vqbcs6sr2p5x4qvqa1q8s")))) (properties `((upstream-name . "R.utils"))) (build-system r-build-system) (propagated-inputs @@ -3014,13 +3090,13 @@ persistent (on the file system).") (define-public r-r-rsp (package (name "r-r-rsp") - (version "0.30.0") + (version "0.40.0") (source (origin (method url-fetch) (uri (cran-uri "R.rsp" version)) (sha256 (base32 - "1ssykygqkxzx9qblxhavxlf2z6r5bhk0s47yw1dllfiyc8zy7jv2")))) + "1hz5fnxz30m3cc7x7ha1swx4pn8c2244z6ka6v9m3l5lpdgc1367")))) (properties `((upstream-name . "R.rsp"))) (build-system r-build-system) (propagated-inputs @@ -3216,13 +3292,13 @@ features present in other programming languages.") (define-public r-plotly (package (name "r-plotly") - (version "4.5.2") + (version "4.5.6") (source (origin (method url-fetch) (uri (cran-uri "plotly" version)) (sha256 (base32 - "08shs0qhy9js0fpj3d4rzfbwmw11ki3z5vg8jszfm6m69mfkgzw1")))) + "09yw977yxlcxv57kni3q899zrxyxa6pznr06cylr9lqkyr7llfhx")))) (build-system r-build-system) (propagated-inputs `(("r-base64enc" ,r-base64enc) @@ -3272,6 +3348,128 @@ noncentral hypergeometric distribution (also called extended hypergeometric distribution).") (license license:gpl3+))) +(define-public r-rematch + (package + (name "r-rematch") + (version "1.0.1") + (source + (origin + (method url-fetch) + (uri (cran-uri "rematch" version)) + (sha256 + (base32 + "0y3mshvpvz9csmq8hk8jbabx4nxlv5sckvfzvm6920ndg34xw2d4")))) + (build-system r-build-system) + (home-page "https://github.com/MangoTheCat/rematch") + (synopsis "Match regular expressions with a nicer API") + (description + "This package provides a small wrapper on @code{regexpr} to extract the +matches and captured groups from the match of a regular expression to a +character vector.") + (license license:expat))) + +(define-public r-cellranger + (package + (name "r-cellranger") + (version "1.1.0") + (source + (origin + (method url-fetch) + (uri (cran-uri "cellranger" version)) + (sha256 + (base32 + "16fgi3annn34c3cxi0pxf62mmmmxi21hp0zzlv7bkfsjqy4g4f2x")))) + (build-system r-build-system) + (propagated-inputs + `(("r-rematch" ,r-rematch) + ("r-tibble" ,r-tibble))) + (home-page "https://github.com/rsheets/cellranger") + (synopsis "Translate spreadsheet cell ranges to rows and columns") + (description + "This package provides helper functions to work with spreadsheets and the +@code{A1:D10} style of cell range specification.") + (license license:expat))) + +(define-public r-googlesheets + (package + (name "r-googlesheets") + (version "0.2.1") + (source + (origin + (method url-fetch) + (uri (cran-uri "googlesheets" version)) + (sha256 + (base32 + "0ps13h1cv7fj5dh8s4nvwi64wnnyqdsadcaa4iizq1c5s615cwk3")))) + (build-system r-build-system) + (propagated-inputs + `(("r-cellranger" ,r-cellranger) + ("r-dplyr" ,r-dplyr) + ("r-httr" ,r-httr) + ("r-jsonlite" ,r-jsonlite) + ("r-purrr" ,r-purrr) + ("r-readr" ,r-readr) + ("r-stringr" ,r-stringr) + ("r-tidyr" ,r-tidyr) + ("r-xml2" ,r-xml2))) + (home-page "https://github.com/jennybc/googlesheets") + (synopsis "Manage Google spreadsheets from R") + (description "This package provides tools to interact with Google Sheets +from within R.") + (license license:expat))) + +(define-public r-spams + (package + (name "r-spams") + (version "2.5-svn2014-07-04") + (source + (origin + (method url-fetch) + (uri (string-append "https://gforge.inria.fr/frs/download.php/33815/" + "spams-R-v" version ".tar.gz")) + (sha256 + (base32 + "1k459jg9a334slkw31w63l4d39xszjzsng7dv5j1mp78zifz7hvx")))) + (build-system r-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'chdir + (lambda _ (chdir "spams") #t)) + ;; Since R 3.3.0 including R headers inside of an extern "C" block + ;; causes C headers to be included, which results in a lot of + ;; duplicate definitions. This can be avoided by defining + ;; NO_C_HEADERS before including the R headers. + (add-after 'chdir 'patch-use-of-R-headers + (lambda _ + (substitute* "src/spams.cpp" + (("#include <R.h>" line) + (string-append "#define NO_C_HEADERS\n" line))) + #t)) + ;; This looks like a syntax error. + (add-after 'chdir 'patch-isnan + (lambda _ + (substitute* '"src/spams/linalg/linalg.h" + (("if isnan\\(lambda\\) \\{") + "if (isnan(lambda)) {")) + #t))))) + (home-page "http://spams-devel.gforge.inria.fr") + (synopsis "Toolbox for solving sparse estimation problems") + (description "SPAMS (SPArse Modeling Software) is an optimization toolbox +for solving various sparse estimation problems. It includes tools for the +following problems: + +@enumerate +@item Dictionary learning and matrix factorization (NMF, sparse @dfn{principle + component analysis} (PCA), ...) +@item Solving sparse decomposition problems with LARS, coordinate descent, + OMP, SOMP, proximal methods +@item Solving structured sparse decomposition problems (l1/l2, l1/linf, sparse + group lasso, tree-structured regularization, structured sparsity with + overlapping groups,...). +@end enumerate\n") + (license license:gpl3+))) + (define-public r-rpart (package (name "r-rpart") @@ -3311,40 +3509,59 @@ definition of Surv objects, Kaplan-Meier and Aalen-Johansen (multi-state) curves, Cox models, and parametric accelerated failure time models.") (license license:lgpl2.0+))) +(define-public r-base64 + (package + (name "r-base64") + (version "2.0") + (source + (origin + (method url-fetch) + (uri (cran-uri "base64" version)) + (sha256 + (base32 + "1labh0ycdm2xcjssj8bhnyjvbk44mcdsi0rb2p8rfqa428mrq9cf")))) + (build-system r-build-system) + (propagated-inputs + `(("r-openssl" ,r-openssl))) + (home-page "http://cran.r-project.org/web/packages/base64") + (synopsis "Base64 encoder and decoder") + (description + "This package is a compatibility wrapper to replace the orphaned package +by Romain Francois. New applications should use the openssl or base64enc +package instead.") + (license license:expat))) + (define-public r-hmisc (package (name "r-hmisc") - (version "4.0-0") + (version "4.0-2") (source (origin (method url-fetch) (uri (cran-uri "Hmisc" version)) (sha256 (base32 - "0azxmg9h9c456biydc0wpi9xhljmd37m8bv0zaadbvc93g7x0l4b")))) + "1lg9k0kj803wsm3h0a991q9l2lrgsqryzfv2z79b88kjbfapqpqr")))) (properties `((upstream-name . "Hmisc"))) (build-system r-build-system) (native-inputs `(("gfortran" ,gfortran))) (propagated-inputs `(("r-acepack" ,r-acepack) - ("r-cluster" ,r-cluster) + ("r-base64" ,r-base64) + ("r-base64enc" ,r-base64enc) ("r-data-table" ,r-data-table) - ("r-foreign" ,r-foreign) ("r-formula" ,r-formula) ("r-ggplot2" ,r-ggplot2) ("r-gridextra" ,r-gridextra) ("r-gtable" ,r-gtable) - ("r-lattice" ,r-lattice) ;; Hmisc needs survival >= 2.40.1, so it cannot use the survival - ;; package that comes with R 3.3.1. + ;; package that comes with R 3.3.2. ("r-survival" ,r-survival) ("r-latticeextra" ,r-latticeextra) ("r-htmltable" ,r-htmltable) ("r-htmltools" ,r-htmltools) - ("r-viridis" ,r-viridis) - ("r-nnet" ,r-nnet) - ("r-rpart" ,r-rpart))) + ("r-viridis" ,r-viridis))) (home-page "http://biostat.mc.vanderbilt.edu/Hmisc") (synopsis "Miscellaneous data analysis and graphics functions") (description @@ -3375,6 +3592,224 @@ conversion of R objects to LaTeX code, and recoding variables.") framework, with additional code inspection and report generation tools.") (license license:gpl2+))) +(define-public r-dynamictreecut + (package + (name "r-dynamictreecut") + (version "1.63-1") + (source + (origin + (method url-fetch) + (uri (cran-uri "dynamicTreeCut" version)) + (sha256 + (base32 + "1fadbql7g5r2vvlkr89nlrjxwp4yx4xrdqmv077qvmnx9vv0f4w3")))) + (properties `((upstream-name . "dynamicTreeCut"))) + (build-system r-build-system) + (home-page + "http://www.genetics.ucla.edu/labs/horvath/CoexpressionNetwork/BranchCutting/") + (synopsis "Detect clusters in hierarchical clustering dendrograms") + (description + "This package contains methods for the detection of clusters in +hierarchical clustering dendrograms.") + (license license:gpl2+))) + +(define-public r-preprocesscore + (package + (name "r-preprocesscore") + (version "1.36.0") + (source + (origin + (method url-fetch) + (uri (bioconductor-uri "preprocessCore" version)) + (sha256 + (base32 + "1n8y12q7145f385gm2k3c6y3vwvin7jlb47la4mnl7mar6pq9kmp")))) + (properties + `((upstream-name . "preprocessCore"))) + (build-system r-build-system) + (home-page "https://github.com/bmbolstad/preprocessCore") + (synopsis "Collection of pre-processing functions") + (description + "This package provides a library of core pre-processing and normalization +routines.") + (license license:lgpl2.0+))) + +(define-public r-fastcluster + (package + (name "r-fastcluster") + (version "1.1.22") + (source + (origin + (method url-fetch) + (uri (cran-uri "fastcluster" version)) + (sha256 + (base32 + "006k9isra5biyavqwci61avladw19mhp6kmkjj3777rl1r4r8b9z")))) + (build-system r-build-system) + (home-page "http://danifold.net/fastcluster.html") + (synopsis "Fast hierarchical clustering routines") + (description + "This package implements fast hierarchical, agglomerative clustering +routines. Part of the functionality is designed as drop-in replacement for +existing routines: @code{linkage()} in the SciPy package +@code{scipy.cluster.hierarchy}, @code{hclust()} in R's @code{stats} package, +and the @code{flashClust} package. It provides the same functionality with +the benefit of a much faster implementation. Moreover, there are +memory-saving routines for clustering of vector data, which go beyond what the +existing packages provide.") + (license license:bsd-2))) + +(define-public r-sfsmisc + (package + (name "r-sfsmisc") + (version "1.1-0") + (source + (origin + (method url-fetch) + (uri (cran-uri "sfsmisc" version)) + (sha256 + (base32 + "0580piv4n1nispl3pa8nfjjfnb8iwaqky2dzdy0aqnxrxgrhqhvz")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/sfsmisc") + (synopsis "Utilities from \"Seminar fuer Statistik\" ETH Zurich") + (description + "This package provides useful utilities from Seminar fuer Statistik ETH +Zurich, including many that are related to graphics.") + (license license:gpl2+))) + +(define-public r-gtools + (package + (name "r-gtools") + (version "3.5.0") + (source + (origin + (method url-fetch) + (uri (cran-uri "gtools" version)) + (sha256 + (base32 + "1xknwk9xlsj027pg0nwiizigcrsc84hdrig0jn0cgcyxj8dabdl6")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/gtools") + (synopsis "Various R programming tools") + (description + "This package contains a collection of various functions to assist in R +programming, such as tools to assist in developing, updating, and maintaining +R and R packages, calculating the logit and inverse logit transformations, +tests for whether a value is missing, empty or contains only @code{NA} and +@code{NULL} values, and many more.") + (license license:gpl2))) + +(define-public r-gdata + (package + (name "r-gdata") + (version "2.17.0") + (source + (origin + (method url-fetch) + (uri (cran-uri "gdata" version)) + (sha256 + (base32 + "0kiy3jbcszlpmarg311spdsfi5pn89wgy742dxsbzxk8907fr5w0")))) + (build-system r-build-system) + (inputs + `(("perl" ,perl))) + (propagated-inputs + `(("r-gtools" ,r-gtools))) + (home-page "http://cran.r-project.org/web/packages/gdata") + (synopsis "Various R programming tools for data manipulation") + (description + "This package provides various R programming tools for data manipulation, +including: + +@itemize +@item medical unit conversions +@item combining objects +@item character vector operations +@item factor manipulation +@item obtaining information about R objects +@item manipulating MS-Excel formatted files +@item generating fixed-width format files +@item extricating components of date and time objects +@item operations on columns of data frames +@item matrix operations +@item operations on vectors and data frames +@item value of last evaluated expression +@item wrapper for @code{sample} that ensures consistent behavior for + both scalar and vector arguments +@end itemize\n") + (license license:gpl2+))) + +(define-public r-gplots + (package + (name "r-gplots") + (version "3.0.1") + (source + (origin + (method url-fetch) + (uri (cran-uri "gplots" version)) + (sha256 + (base32 + "02nb8n3s7c1zxq2s7ycaq2ys72y7mzirxrwj954h6gdc4x1zhg9l")))) + (build-system r-build-system) + (propagated-inputs + `(("r-catools" ,r-catools) + ("r-gdata" ,r-gdata) + ("r-gtools" ,r-gtools) + ("r-kernsmooth" ,r-kernsmooth))) + (home-page "http://cran.r-project.org/web/packages/gplots") + (synopsis "Various R programming tools for plotting data") + (description + "This package provides various R programming tools for plotting data, +including: + +@itemize +@item calculating and plotting locally smoothed summary function +@item enhanced versions of standard plots +@item manipulating colors +@item calculating and plotting two-dimensional data summaries +@item enhanced regression diagnostic plots +@item formula-enabled interface to @code{stats::lowess} function +@item displaying textual data in plots +@item baloon plots +@item plotting \"Venn\" diagrams +@item displaying Open-Office style plots +@item plotting multiple data on same region, with separate axes +@item plotting means and confidence intervals +@item spacing points in an x-y plot so they don't overlap +@end itemize\n") + (license license:gpl2+))) + +(define-public r-rocr + (package + (name "r-rocr") + (version "1.0-7") + (source + (origin + (method url-fetch) + (uri (cran-uri "ROCR" version)) + (sha256 + (base32 + "1jay8cm7lgq56i967vm5c2hgaxqkphfpip0gn941li3yhh7p3vz7")))) + (properties `((upstream-name . "ROCR"))) + (build-system r-build-system) + (propagated-inputs + `(("r-gplots" ,r-gplots))) + (home-page "http://rocr.bioinf.mpi-sb.mpg.de/") + (synopsis "Visualizing the performance of scoring classifiers") + (description + "ROCR is a flexible tool for creating cutoff-parameterized 2D performance +curves by freely combining two from over 25 performance measures (new +performance measures can be added using a standard interface). Curves from +different cross-validation or bootstrapping runs can be averaged by different +methods, and standard deviations, standard errors or box plots can be used to +visualize the variability across the runs. The parameterization can be +visualized by printing cutoff values at the corresponding curve positions, or +by coloring the curve according to cutoff. All components of a performance +plot can be quickly adjusted using a flexible parameter dispatching +mechanism.") + (license license:gpl2+))) + (define-public r-kernsmooth (package (name "r-kernsmooth") @@ -3402,16 +3837,14 @@ estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) (define-public r-zoo (package (name "r-zoo") - (version "1.7-13") + (version "1.7-14") (source (origin (method url-fetch) (uri (cran-uri "zoo" version)) (sha256 (base32 - "0m67bnrg7r1jxvs9p7rpa430szp5qfp65r056yb8bivpc16jd98c")))) + "167m142rwwfy8b9hnfc3fi28dcsdjk61g1crqhll6sh5xmgnfn28")))) (build-system r-build-system) - (propagated-inputs - `(("r-lattice" ,r-lattice))) (home-page "http://zoo.R-Forge.R-project.org/") (synopsis "S3 infrastructure for regular and irregular time series") (description "This package contains an S3 class with methods for totally @@ -3439,3 +3872,110 @@ with alternating row colors) in LaTeX and HTML formats easily from @code{glm}, @code{coxph}, @code{nls}, @code{fitdistr}, @code{mytable} and @code{cbind.mytable} objects.") (license license:gpl2+))) + +(define-public r-vipor + (package + (name "r-vipor") + (version "0.4.4") + (source (origin + (method url-fetch) + (uri (cran-uri "vipor" version)) + (sha256 + (base32 + "0p1z9a3fazl78pj8a1i2n62v8hrs8cinq82j9wpawhmfkn3dggss")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/vipor") + (synopsis "Plot categorical data using noise and density estimates") + (description + "This package provides tools to generate a violin point plot, a +combination of a violin/histogram plot and a scatter plot by offsetting points +within a category based on their density using quasirandom noise.") + (license license:gpl2+))) + +(define-public r-beeswarm + (package + (name "r-beeswarm") + (version "0.2.3") + (source (origin + (method url-fetch) + (uri (cran-uri "beeswarm" version)) + (sha256 + (base32 + "0hy89bwv7jixlg91li1fywa77916am2whqp1m1fx1khd45g44581")))) + (build-system r-build-system) + (home-page "http://www.cbs.dtu.dk/~eklund/beeswarm/") + (synopsis "Implementation of bee swarm plots") + (description + "This package provides an implementation of bee swarm plots. The bee +swarm plot is a one-dimensional scatter plot like stripchart, but with +closely-packed, non-overlapping points.") + (license license:artistic2.0))) + +(define-public r-sourcetools + (package + (name "r-sourcetools") + (version "0.1.5") + (source + (origin + (method url-fetch) + (uri (cran-uri "sourcetools" version)) + (sha256 + (base32 + "0jx6kslygfqaic3cmjwag3dy98q1a2dw20cz7z8agsknmmbk6dy2")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/sourcetools") + (synopsis "Tools for reading, tokenizing and parsing R code") + (description + "The sourcetools package provides both an R and C++ interface for the +tokenization of R code, and helpers for interacting with the tokenized +representation of R code.") + (license license:expat))) + +(define-public r-ggbeeswarm + (package + (name "r-ggbeeswarm") + (version "0.5.3") + (source (origin + (method url-fetch) + (uri (cran-uri "ggbeeswarm" version)) + (sha256 + (base32 + "1jgp55rvmzc4agcrlsjn8m5lk85di9c4wj94xzikqkql4lvq3qpd")))) + (build-system r-build-system) + (propagated-inputs + `(("r-beeswarm" ,r-beeswarm) + ("r-ggplot2" ,r-ggplot2) + ("r-vipor" ,r-vipor))) + (home-page "https://github.com/eclarke/ggbeeswarm") + (synopsis "Categorical scatter (violin point) plots") + (description + "This package provides two methods of plotting categorical scatter plots +such that the arrangement of points within a category reflects the density of +data at that region, and avoids over-plotting.") + (license license:gpl2+))) + +(define-public r-statmod + (package + (name "r-statmod") + (version "1.4.27") + (source (origin + (method url-fetch) + (uri (cran-uri "statmod" version)) + (sha256 + (base32 + "14yilq9d3z20hig4rs8bjqyydw3dfx90mhmzvw9w8p16h0s595sn")))) + (build-system r-build-system) + (home-page "http://cran.r-project.org/web/packages/statmod") + (native-inputs + `(("gfortran" ,gfortran))) + (synopsis "Statistical modeling") + (description + "This package provides a collection of algorithms and functions to aid +statistical modeling. It includes growth curve comparisons, limiting dilution +analysis (aka ELDA), mixed linear models, heteroscedastic regression, +inverse-Gaussian probability calculations, Gauss quadrature and a secure +convergence algorithm for nonlinear models. It also includes advanced +generalized linear model functions that implement secure convergence, +dispersion modeling and Tweedie power-law families.") + ;; Statmod is distributed under either license + (license (list license:gpl2 license:gpl3)))) diff --git a/gnu/packages/suckless.scm b/gnu/packages/suckless.scm index 820d550d6e..a00420312d 100644 --- a/gnu/packages/suckless.scm +++ b/gnu/packages/suckless.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2015 Dmitry Bogatov <KAction@gnu.org> ;;; Copyright © 2015 Leo Famulari <leo@famulari.name> ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> +;;; Copyright © 2017 Alex Griffin <a@ajgrf.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -40,16 +41,19 @@ (define-public dwm (package (name "dwm") - (version "6.0") + (version "6.1") (source (origin (method url-fetch) (uri (string-append "http://dl.suckless.org/dwm/dwm-" version ".tar.gz")) (sha256 - (base32 "0mpbivy9j80l1jqq4bd4g4z8s5c54fxrjj44avmfwncjwqylifdj")))) + (base32 "1zkmwb6df6m254shx06ly90c0q4jl70skk1pvkixpb7hcxhwbxn2")))) (build-system gnu-build-system) (arguments `(#:tests? #f + #:make-flags (list (string-append "FREETYPEINC=" + (assoc-ref %build-inputs "freetype") + "/include/freetype2")) #:phases (alist-replace 'configure @@ -65,7 +69,9 @@ (string-append "DESTDIR=" out) "PREFIX=")))) %standard-phases)))) (inputs - `(("libx11" ,libx11) + `(("freetype" ,freetype) + ("libx11" ,libx11) + ("libxft" ,libxft) ("libxinerama" ,libxinerama))) (home-page "http://dwm.suckless.org/") (synopsis "Dynamic window manager") @@ -78,23 +84,28 @@ optimising the environment for the application in use and the task performed.") (define-public dmenu (package (name "dmenu") - (version "4.5") + (version "4.6") (source (origin (method url-fetch) (uri (string-append "http://dl.suckless.org/tools/dmenu-" version ".tar.gz")) (sha256 (base32 - "0l58jpxrr80fmyw5pgw5alm5qry49aw6y049745wl991v2cdcb08")))) + "1cwnvamqqlgczvd5dv5rsgqbhv8kp0ddjnhmavb3q732i8028yja")))) (build-system gnu-build-system) (arguments '(#:tests? #f ; no tests #:make-flags (list "CC=gcc" - (string-append "PREFIX=" %output)) + (string-append "PREFIX=" %output) + (string-append "FREETYPEINC=" + (assoc-ref %build-inputs "freetype") + "/include/freetype2")) #:phases (alist-delete 'configure %standard-phases))) (inputs - `(("libx11" ,libx11) + `(("freetype" ,freetype) + ("libxft" ,libxft) + ("libx11" ,libx11) ("libxinerama" ,libxinerama))) (home-page "http://tools.suckless.org/dmenu/") (synopsis "Dynamic menu") @@ -106,15 +117,14 @@ numbers of user-defined menu items efficiently.") (define-public slock (package (name "slock") - (version "1.3") + (version "1.4") (source (origin (method url-fetch) (uri (string-append "http://dl.suckless.org/tools/slock-" version ".tar.gz")) - (patches (search-patches "slock-CVE-2016-6866.patch")) (sha256 (base32 - "065xa9hl7zn0lv2f7yjxphqsa35rg6dn9hv10gys0sh4ljpa7d5s")))) + "0sif752303dg33f14k6pgwq2jp1hjyhqv6x4sy3sj281qvdljf5m")))) (build-system gnu-build-system) (arguments '(#:tests? #f ; no tests diff --git a/gnu/packages/swig.scm b/gnu/packages/swig.scm index a615796745..acf0529377 100644 --- a/gnu/packages/swig.scm +++ b/gnu/packages/swig.scm @@ -31,7 +31,7 @@ (define-public swig (package (name "swig") - (version "3.0.5") + (version "3.0.10") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/" name "/" name "/" @@ -39,7 +39,7 @@ name "-" version ".tar.gz")) (sha256 (base32 - "0g1a69vrqxgsnr1wkx851ljn73a2x3jqzxa66s2l3w0kyblbjk4z")))) + "0k7ljh07rla6223lhvljgg881b2qr7hmrfgic9a0j1pckpislf99")))) (build-system gnu-build-system) (native-inputs `(("boost" ,boost) ("pcre" ,pcre "bin"))) ;for 'pcre-config' diff --git a/gnu/packages/sxiv.scm b/gnu/packages/sxiv.scm deleted file mode 100644 index 8a81d48f3e..0000000000 --- a/gnu/packages/sxiv.scm +++ /dev/null @@ -1,62 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. - -(define-module (gnu packages sxiv) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module ((guix licenses) #:prefix license:) - #:use-module (gnu packages xorg) - #:use-module (gnu packages image) - #:use-module (gnu packages photo)) - -(define-public sxiv - (package - (name "sxiv") - (version "1.3.2") - (source (origin - (method url-fetch) - (uri (string-append - "https://github.com/muennich/sxiv/archive/v" - version ".tar.gz")) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - "0lxnd33gaw4drhdwbkk94wzrjyhh64d57jq2ps7ffmqgizg6hlwz")))) - (build-system gnu-build-system) - (arguments - '(#:tests? #f ; no check target - #:make-flags (list (string-append "PREFIX=" %output) - "CC=gcc") - #:phases (alist-delete - 'configure ; no configure phase - %standard-phases))) - (inputs - `(("libx11" ,libx11) - ("imlib2" ,imlib2) - ("giflib" ,giflib) - ("libexif" ,libexif))) - (home-page "https://github.com/muennich/sxiv") - (synopsis "Simple X Image Viewer") - (description - "sxiv is an alternative to feh and qiv. Its primary goal is to -provide the most basic features required for fast image viewing. It has -vi key bindings and works nicely with tiling window managers. Its code -base should be kept small and clean to make it easy for you to dig into -it and customize it for your needs.") - (license license:gpl2+))) diff --git a/gnu/packages/owncloud.scm b/gnu/packages/sync.scm index 6b40bd3ada..429fe196de 100644 --- a/gnu/packages/owncloud.scm +++ b/gnu/packages/sync.scm @@ -16,7 +16,7 @@ ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. -(define-module (gnu packages owncloud) +(define-module (gnu packages sync) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix build-system cmake) #:use-module (guix download) @@ -103,3 +103,58 @@ to and a server to synchronize to. You can configure more computers to synchronize to the same server and any change to the files on one computer will silently and reliably flow across to every other.") (license license:gpl2+))) + +(define-public qsyncthingtray + (package + (name "qsyncthingtray") + (version "0.5.7") + (source + (origin + (method url-fetch) + (uri (string-append + "https://github.com/sieren/QSyncthingTray/archive/" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1qzlxgq36sb1dk621nkbjw9k6y3css6q3z8xzx6nv7f327vanvp6")))) + (build-system cmake-build-system) + (arguments + `(#:configure-flags '("-DQST_BUILD_WEBKIT=1") + #:phases + (modify-phases %standard-phases + ;; The program is meant to be run from the git repo or source tarball. + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "QSyncthingTray" bin) + (install-file (string-append + "../QSyncthingTray-" + ,(package-version qsyncthingtray) + "/resources/images/Icon1024.png") + (string-append + out "/share/pixmaps/QSyncthingTray.png")) + #t)))) + #:tests? #f)) ; no test target + (inputs + `(("qtbase" ,qtbase) + ("qtwebkit" ,qtwebkit))) + (home-page "https://github.com/sieren/QSyncthingTray") + (synopsis "Traybar Application for Syncthing") + (description + "A traybar application for syncthing. +@enumerate +@item Shows number of connections at a glance. +@item Traffic statistics about incoming, outgoing and total throughput. +@item Launches Syncthing and Syncthing-iNotifier if specified. +@item Quickly pause Syncthing with one click. +@item Last Synced Files - Quickly see the recently synchronised files and open +their folder. +@item Quick Access to all shared folders. +@item Presents Syncthing UI in a separate view instead of using the browser. +@item Supports authenticated HTTPS connections. +@item Uses System Notifications about current connection status. +@item Toggle for monochrome icon. +@end enumerate\n") + (license license:lgpl3+))) diff --git a/gnu/packages/telephony.scm b/gnu/packages/telephony.scm index 6597d26096..2adf08ce97 100644 --- a/gnu/packages/telephony.scm +++ b/gnu/packages/telephony.scm @@ -2,7 +2,7 @@ ;;; Copyright © 2014 John Darrington <jmd@gnu.org> ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com> -;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org> ;;; Copyright © 2016 Francesco Frassinelli <fraph24@gmail.com> ;;; Copyright © 2016 ng0 <ng0@libertad.pw> @@ -210,6 +210,7 @@ internet.") (method url-fetch) (uri (string-append "https://github.com/cisco/libsrtp/archive/v" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 "1w2g623qkd7gdyydglx2hr4s2y237lg0nszjmy7z8d2iq8hvb9sn")))) @@ -217,7 +218,25 @@ internet.") `(("procps" ,procps))) (build-system gnu-build-system) (arguments - `(#:test-target "runtest")) + '(#:test-target "runtest" + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-mips-variable-in-testsuite + ;; This comes from https://github.com/cisco/libsrtp/pull/151 + (lambda _ + (substitute* "test/srtp_driver.c" + (("mips ") "mips_est ") + (("mips\\)") "mips_est)")) + #t)) + (add-after 'unpack 'patch-dictionary-location + ;; With the above changes, the rtpw_test.sh test finally runs, and fails + (lambda _ + (substitute* "test/rtpw.c" + (("/usr/share/dict/words") + (string-append (assoc-ref %build-inputs "procps") + "/share/doc/procps-ng")) + (("words.txt") "FAQ")) + #t))))) (synopsis "Secure RTP (SRTP) Reference Implementation") (description "This package provides an implementation of the Secure Real-time Transport Protocol (SRTP), the Universal Security Transform (UST), @@ -299,14 +318,14 @@ address of one of the participants.") (define-public mumble (package (name "mumble") - (version "1.2.17") + (version "1.2.18") (source (origin (method url-fetch) (uri (string-append "https://mumble.info/snapshot/" name "-" version ".tar.gz")) (sha256 (base32 - "176br3b0pv5sz3zvgzsz9rxr3n79irlm902h7n1wh4f6vbph2dhw")) + "1ajmdzf2jqbnm4hm53wv8bzazffflzs3z8hhbl70kfci4v4arxz0")) (modules '((guix build utils))) (snippet `(begin diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm index 97dd0a82bd..20897860d2 100644 --- a/gnu/packages/terminals.scm +++ b/gnu/packages/terminals.scm @@ -4,6 +4,8 @@ ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com> ;;; Copyright © 2016 David Craven <david@craven.ch> ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016, 2017 José Miguel Sánchez García <jmi2k@openmailbox.org> +;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr> ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,6 +38,7 @@ #:use-module (gnu packages gnome) #:use-module (gnu packages gtk) #:use-module (gnu packages linux) + #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages wm) @@ -161,8 +164,7 @@ insert mode and command mode where keybindings have different functions.") (("'tput'") (string-append "'" ncurses "/bin/tput'")))) #t))))) - (inputs `(("ncurses" ,ncurses) - ("python-setuptools" ,python-setuptools))) + (inputs `(("ncurses" ,ncurses))) (home-page "https://asciinema.org") (synopsis "Terminal session recorder") (description @@ -262,6 +264,35 @@ multi-seat support, a replacement for @command{mingetty}, and more.") (supported-systems (filter (cut string-suffix? "-linux" <>) %supported-systems)))) +(define-public libtermkey + (package + (name "libtermkey") + (version "0.19") + (source (origin + (method url-fetch) + (uri (string-append "http://www.leonerd.org.uk/code/" + name "/" name "-" version ".tar.gz")) + (sha256 + (base32 "1ds8gdr8p2dfr970z8kxgfz6x7m1jxmmfrb2aafab3wcni6al1f5")))) + (build-system gnu-build-system) + (arguments + '(#:make-flags (list + "CC=gcc" + (string-append "PREFIX=" (assoc-ref %outputs "out"))) + #:phases (modify-phases %standard-phases + (delete 'configure)) + #:test-target "test")) + (inputs `(("ncurses", ncurses))) + (native-inputs `(("libtool", libtool) + ("perl-test-harness" ,perl-test-harness) + ("pkg-config", pkg-config))) + (synopsis "Keyboard entry processing library for terminal-based programs") + (description + "Libtermkey handles all the necessary logic to recognise special keys, UTF-8 +combining, and so on, with a simple interface.") + (home-page "http://www.leonerd.org.uk/code/libtermkey") + (license license:expat))) + (define-public picocom (package (name "picocom") @@ -296,3 +327,38 @@ configuration, testing, and debugging tool. It has also serves well as a low-tech serial communications program to allow access to all types of devices that provide serial consoles.") (license license:gpl2+))) + +(define-public beep + (package + (name "beep") + (version "1.3") + (source (origin + (method url-fetch) + (uri (string-append "http://www.johnath.com/" name "/" + name "-" version ".tar.gz")) + (sha256 + (base32 + "0bgch6jq5cahakk3kbr9549iysf2dik09afixxy5brbxk1xfzb2r")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; no tests. + #:phases + (modify-phases %standard-phases + (delete 'configure) + (add-after 'unpack 'patch-makefile + (lambda* (#:key outputs #:allow-other-keys) + (substitute* "Makefile" (("/usr") (assoc-ref outputs "out"))) + #t)) + (add-before 'install 'create-output-directories + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref %outputs "out"))) + (mkdir-p (string-append out "/bin")) + (mkdir-p (string-append out "/man/man1")))))))) + (synopsis "Linux command-line utility to control the PC speaker") + (description "beep allows the user to control the PC speaker with precision, +allowing different sounds to indicate different events. While it can be run +quite happily on the command line, its intended place of residence is within +scripts, notifying the user when something interesting occurs. Of course, it +has no notion of what's interesing, but it's very good at that notifying part.") + (home-page "http://www.johnath.com/beep") + (license license:gpl2+))) diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm index 9186e4693a..7c84ed7194 100644 --- a/gnu/packages/tex.scm +++ b/gnu/packages/tex.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2016 Thomas Danckaert <post@thomasdanckaert.be> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; 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 perl) #:use-module (guix build-system trivial) #:use-module (guix utils) #:use-module (guix git-download) @@ -50,6 +52,8 @@ #:use-module (gnu packages ruby) #:use-module (gnu packages shells) #:use-module (gnu packages base) + #:use-module (gnu packages web) + #:use-module (gnu packages xml) #:use-module (gnu packages xorg) #:use-module (gnu packages xdisorg) #:use-module (gnu packages zip) @@ -382,6 +386,154 @@ world. This package contains a small working part of the TeX Live distribution."))) +(define-public perl-text-bibtex + (package + (name "perl-text-bibtex") + (version "0.77") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/A/AM/AMBS/Text-BibTeX-" + version ".tar.gz")) + (sha256 + (base32 + "0kkfx8skk763pivz6h2ffy2zdp1lvy6d5sz0kjaj0mdbjffvnnb4")))) + (build-system perl-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'add-output-directory-to-rpath + (lambda* (#:key outputs #:allow-other-keys) + (substitute* "inc/MyBuilder.pm" + (("-Lbtparse" line) + (string-append "-Wl,-rpath=" + (assoc-ref outputs "out") "/lib " line))) + #t)) + (add-after 'unpack 'install-libraries-to-/lib + (lambda* (#:key outputs #:allow-other-keys) + (substitute* "Build.PL" + (("lib64") "lib")) + #t))))) + (native-inputs + `(("perl-capture-tiny" ,perl-capture-tiny) + ("perl-config-autoconf" ,perl-config-autoconf) + ("perl-extutils-libbuilder" ,perl-extutils-libbuilder) + ("perl-module-build" ,perl-module-build))) + (home-page "http://search.cpan.org/dist/Text-BibTeX") + (synopsis "Interface to read and parse BibTeX files") + (description "@code{Text::BibTeX} is a Perl library for reading, parsing, +and processing BibTeX files. @code{Text::BibTeX} gives you access to the data +at many different levels: you may work with BibTeX entries as simple field to +string mappings, or get at the original form of the data as a list of simple +values (strings, macros, or numbers) pasted together.") + (license (package-license perl)))) + +(define-public biber + (package + (name "biber-next") + (version "2.6") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/plk/biber/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "158smzgjhjvyabdv97si5q88zjj5l8j1zbfnddvzy6fkpfhskgkp")))) + (build-system perl-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'wrap-programs + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (perl5lib (getenv "PERL5LIB"))) + (wrap-program (string-append out "/bin/biber") + `("PERL5LIB" ":" prefix + (,(string-append perl5lib ":" out + "/lib/perl5/site_perl"))))) + #t))))) + (inputs + `(("perl-autovivification" ,perl-autovivification) + ("perl-class-accessor" ,perl-class-accessor) + ("perl-data-dump" ,perl-data-dump) + ("perl-data-compare" ,perl-data-compare) + ("perl-data-uniqid" ,perl-data-uniqid) + ("perl-datetime-format-builder" ,perl-datetime-format-builder) + ("perl-datetime-calendar-julian" ,perl-datetime-calendar-julian) + ("perl-file-slurp" ,perl-file-slurp) + ("perl-ipc-cmd" ,perl-ipc-cmd) + ("perl-ipc-run3" ,perl-ipc-run3) + ("perl-list-allutils" ,perl-list-allutils) + ("perl-list-moreutils" ,perl-list-moreutils) + ("perl-mozilla-ca" ,perl-mozilla-ca) + ("perl-regexp-common" ,perl-regexp-common) + ("perl-log-log4perl" ,perl-log-log4perl) + ;; We cannot use perl-unicode-collate here, because otherwise the + ;; hardcoded hashes in the tests would differ. See + ;; https://mail-archive.com/debian-bugs-dist@lists.debian.org/msg1469249.html + ;;("perl-unicode-collate" ,perl-unicode-collate) + ("perl-unicode-normalize" ,perl-unicode-normalize) + ("perl-unicode-linebreak" ,perl-unicode-linebreak) + ("perl-encode-eucjpascii" ,perl-encode-eucjpascii) + ("perl-encode-jis2k" ,perl-encode-jis2k) + ("perl-encode-hanextra" ,perl-encode-hanextra) + ("perl-xml-libxml" ,perl-xml-libxml) + ("perl-xml-libxml-simple" ,perl-xml-libxml-simple) + ("perl-xml-libxslt" ,perl-xml-libxslt) + ("perl-xml-writer" ,perl-xml-writer) + ("perl-sort-key" ,perl-sort-key) + ("perl-text-csv" ,perl-text-csv) + ("perl-text-csv-xs" ,perl-text-csv-xs) + ("perl-text-roman" ,perl-text-roman) + ("perl-uri" ,perl-uri) + ("perl-text-bibtex" ,perl-text-bibtex) + ("perl-libwww" ,perl-libwww) + ("perl-lwp-protocol-https" ,perl-lwp-protocol-https) + ("perl-business-isbn" ,perl-business-isbn) + ("perl-business-issn" ,perl-business-issn) + ("perl-business-ismn" ,perl-business-ismn) + ("perl-lingua-translit" ,perl-lingua-translit))) + (native-inputs + `(("perl-config-autoconf" ,perl-config-autoconf) + ("perl-extutils-libbuilder" ,perl-extutils-libbuilder) + ("perl-module-build" ,perl-module-build) + ;; for tests + ("perl-file-which" ,perl-file-which) + ("perl-test-more" ,perl-test-most) ; FIXME: "more" would be sufficient + ("perl-test-differences" ,perl-test-differences))) + (home-page "http://biblatex-biber.sourceforge.net/") + (synopsis "Backend for the BibLaTeX citation management tool") + (description "Biber is a BibTeX replacement for users of biblatex. Among +other things it comes with full Unicode support.") + (license license:artistic2.0))) + +;; Our version of texlive comes with biblatex 3.4, which is only compatible +;; with biber 2.5 according to the compatibility matrix in the biber +;; documentation. +(define-public biber-2.5 + (package (inherit biber) + (name "biber") + (version "2.5") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/plk/biber/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "163sd343wkrzwnvj2003m2j0kz517jmjr4savw6f8bjxhj8fdrqv")))) + (arguments + (substitute-keyword-arguments (package-arguments biber) + ((#:phases phases) + `(modify-phases ,phases + (add-before 'check 'delete-failing-test + (lambda _ + (delete-file "t/sort-order.t") + #t)))))) + (inputs + `(("perl-date-simple" ,perl-date-simple) + ,@(package-inputs biber))))) (define-public rubber (package diff --git a/gnu/packages/text-editors.scm b/gnu/packages/text-editors.scm new file mode 100644 index 0000000000..4e2324dbea --- /dev/null +++ b/gnu/packages/text-editors.scm @@ -0,0 +1,77 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 José Miguel Sánchez García <jmi2k@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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages text-editors) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix utils) + #:use-module (guix build-system gnu) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (gnu packages) + #:use-module (gnu packages lua) + #:use-module (gnu packages ncurses) + #:use-module (gnu packages terminals)) + +(define-public vis + (package + (name "vis") + (version "0.2") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/martanne/" + name "/archive/v" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 "0bbmkblpndc53pvr8xcfywdn8g351yxfj8c46zp5d744c3bq2nry")))) + (build-system gnu-build-system) + (arguments + `(#:make-flags '("CFLAGS=-pie") + #:tests? #f ; No tests. + #:phases + (modify-phases %standard-phases + (add-after 'install 'wrap-binary + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (lpeg (assoc-ref inputs "lua-lpeg")) + (lua-version ,(version-major+minor (package-version lua))) + (LUA_PATH (string-append lpeg "/share/lua/" + lua-version "/?.lua")) + (LUA_CPATH (string-append lpeg "/lib/lua/" + lua-version "/?.so"))) + (wrap-program (string-append out "/bin/vis") + `("LUA_PATH" ":" prefix (,LUA_PATH)) + `("LUA_CPATH" ":" prefix (,LUA_CPATH))) + #t)))))) + (native-search-paths + (list (search-path-specification + (variable "VIS_PATH") + (files '("share/vis"))))) + (inputs `(("lua", lua) + ("ncurses", ncurses) + ("libtermkey", libtermkey) + ("lua-lpeg", lua-lpeg))) + (synopsis "Vim-like text editor") + (description + "Vis aims to be a modern, legacy free, simple yet efficient vim-like text +editor. It extends vim's modal editing with built-in support for multiple +cursors/selections and combines it with sam's structural regular expression +based command language.") + (home-page "https://github.com/martanne/vis") + (license (list license:isc ; Main distribution. + license:public-domain ; map.[ch] + license:expat)))) ; lexers and libutf.[ch] diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm index 4c19ebe3a4..111942ab1f 100644 --- a/gnu/packages/tls.scm +++ b/gnu/packages/tls.scm @@ -354,7 +354,7 @@ required structures.") (package (inherit openssl) (name "openssl") - (version "1.1.0b") + (version "1.1.0c") (source (origin (method url-fetch) (uri (list (string-append "ftp://ftp.openssl.org/source/" @@ -365,7 +365,7 @@ required structures.") (patches (search-patches "openssl-1.1.0-c-rehash-in.patch")) (sha256 (base32 - "1xznrqvb1dbngv2k2nb6da6fdw00c01sy2i36yjdxr4vpxrf0pd4")))) + "1xfn5ydl14myd9wgxm4nxy5a42cpp1g12ijf3g9m4mz0l90n8hzw")))) (outputs '("out" "doc" ;1.3MiB of man3 pages "static")) ; 5.5MiB of .a files @@ -376,13 +376,42 @@ required structures.") (delete 'patch-tests) ; These two phases are not needed by (delete 'patch-Makefile.org) ; OpenSSL 1.1.0. - (add-after 'configure 'patch-runpath + ;; Override configure phase since -rpath is now a configure option. + (replace 'configure (lambda* (#:key outputs #:allow-other-keys) - (let ((lib (string-append (assoc-ref outputs "out") "/lib"))) - (substitute* "Makefile.shared" - (("\\$\\$\\{SHAREDCMD\\} \\$\\$\\{SHAREDFLAGS\\}") - (string-append "$${SHAREDCMD} $${SHAREDFLAGS}" - " -Wl,-rpath," lib))) + (let* ((out (assoc-ref outputs "out")) + (lib (string-append out "/lib"))) + (zero? + (system* "./config" + "shared" ;build shared libraries + "--libdir=lib" + + ;; The default for this catch-all directory is + ;; PREFIX/ssl. Change that to something more + ;; conventional. + (string-append "--openssldir=" out + "/share/openssl-" ,version) + + (string-append "--prefix=" out) + (string-append "-Wl,-rpath," lib) + + ;; XXX FIXME: Work around a code generation bug in GCC + ;; 4.9.3 on ARM when compiled with -mfpu=neon. See: + ;; <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66917> + ,@(if (and (not (%current-target-system)) + (string-prefix? "armhf" (%current-system))) + '("-mfpu=vfpv3") + '())))))) + + ;; XXX: Duplicate this phase to make sure 'version' evaluates + ;; in the current scope and not the inherited one. + (replace 'remove-miscellany + (lambda* (#:key outputs #:allow-other-keys) + ;; The 'misc' directory contains random undocumented shell and Perl + ;; scripts. Remove them to avoid retaining a reference on Perl. + (let ((out (assoc-ref outputs "out"))) + (delete-file-recursively (string-append out "/share/openssl-" + ,version "/misc")) #t))))))))) (define-public libressl @@ -436,15 +465,6 @@ security, and applying best practice development processes.") (arguments `(#:phases (modify-phases %standard-phases - (add-before 'install 'disable-egg-compression - (lambda _ - ;; Do not compress the egg. - ;; See <http://bugs.gnu.org/20765>. - (let ((port (open-file "setup.cfg" "a"))) - (display "\n[easy_install]\nzip_ok = 0\n" - port) - (close-port port) - #t))) (add-after 'install 'docs (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) @@ -461,7 +481,6 @@ security, and applying best practice development processes.") ("python-sphinx" ,python-sphinx) ("python-sphinxcontrib-programoutput" ,python-sphinxcontrib-programoutput) ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme) - ("python-setuptools" ,python-setuptools) ("texinfo" ,texinfo))) (propagated-inputs `(("python-ndg-httpsclient" ,python-ndg-httpsclient) @@ -680,7 +699,7 @@ number generator") (define-public acme-client (package (name "acme-client") - (version "0.1.14") + (version "0.1.15") (source (origin (method url-fetch) (uri (string-append "https://kristaps.bsd.lv/" name "/" @@ -688,7 +707,7 @@ number generator") version ".tgz")) (sha256 (base32 - "1qq4xk41pn65m3v7nnvkmxg96pr06vz6hzdrm0vcmlp3clzpbahl")))) + "07p723391whrswl4rir0l1k03l457sjscnj0cfaxr8mfnkx4y3wi")))) (build-system gnu-build-system) (arguments '(#:tests? #f ; no test suite @@ -697,7 +716,16 @@ number generator") (string-append "PREFIX=" (assoc-ref %outputs "out"))) #:phases (modify-phases %standard-phases + (add-after 'unpack 'patch-paths + (lambda* (#:key inputs #:allow-other-keys) + (let ((pem (string-append (assoc-ref inputs "libressl") + "/etc/ssl/cert.pem"))) + (substitute* "http.c" + (("/etc/ssl/cert.pem") pem)) + #t))) (delete 'configure)))) ; no './configure' script + (native-inputs + `(("pkg-config" ,pkg-config))) (inputs `(("libbsd" ,libbsd) ("libressl" ,libressl))) diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm index e6fbf6e005..6f26f404be 100644 --- a/gnu/packages/tor.scm +++ b/gnu/packages/tor.scm @@ -39,14 +39,14 @@ (define-public tor (package (name "tor") - (version "0.2.8.9") + (version "0.2.9.8") (source (origin (method url-fetch) (uri (string-append "https://dist.torproject.org/tor-" version ".tar.gz")) (sha256 (base32 - "05jkvhbgyq81fcmk1xpl3yw97ljj5sg9pngl27zlmgl7p0xjfp1z")))) + "0sklgmx4nikcfhqd606kvpwy1l8840w24ikli1xjjx25739k7pgv")))) (build-system gnu-build-system) (native-inputs `(("python" ,python-2))) ; for tests @@ -54,9 +54,6 @@ `(("zlib" ,zlib) ("openssl" ,openssl) ("libevent" ,libevent))) - - ;; TODO: Recommend `torsocks' since `torify' needs it. - (home-page "https://www.torproject.org/") (synopsis "Anonymous network router to improve privacy on the Internet") (description @@ -66,7 +63,12 @@ somebody watching your Internet connection from learning what sites you visit, and it prevents the sites you visit from learning your physical location. Tor works with many of your existing applications, including web browsers, instant messaging clients, remote login, and other -applications based on the TCP protocol.") +applications based on the TCP protocol. + +To @code{torify} applications (to take measures to ensure that an application, +which has not been designed for use with Tor such as ssh, will use only Tor for +internet connectivity, and also ensures that there are no leaks from DNS, UDP or +the application layer) you need to install @code{torsocks}.") (license bsd-3))) (define-public torsocks @@ -138,7 +140,7 @@ networks.") (define-public onionshare (package (name "onionshare") - (version "0.9") + (version "0.9.2") (source (origin (method url-fetch) @@ -147,8 +149,7 @@ networks.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0pc3xbq379415s0i0y6rz02hay20zbvgra1jmg4mgrl9vbdr8zmw")) - (patches (search-patches "onionshare-fix-install-paths.patch")))) + "02iv7dg15da57gy3zvfchnwwpr21n1gva7mqwpwr958ni2034smk")))) (build-system python-build-system) (arguments `(#:phases @@ -157,25 +158,17 @@ networks.") (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (onionshare (string-append out "/share/onionshare"))) - (substitute* - "install/pyinstaller.spec" - ;; inform onionshare where the 'resources' files are installed - (("../resources") onionshare)) - (substitute* - "onionshare/strings.py" + (substitute* "onionshare/strings.py" ;; correct the locale directory (("helpers.get_resource_path\\('locale'\\)") (string-append "'" onionshare "/locale'"))) - (substitute* - "onionshare/helpers.py" + (substitute* "onionshare/helpers.py" ;; correct the location of version.txt - (("/usr") out) (("get_resource_path\\('version.txt'\\)") (string-append "'" onionshare "/version.txt'")) (("get_resource_path\\('wordlist.txt'\\)") (string-append "'" onionshare "/wordlist.txt'"))) - (substitute* - "onionshare/web.py" + (substitute* "onionshare/web.py" ;; fix the location of the html files (("helpers.get_resource_path\\('html/denied.html'\\)") (string-append "'" onionshare "/html/denied.html'")) @@ -183,36 +176,33 @@ networks.") (string-append "'" onionshare "/html/404.html'")) (("helpers.get_resource_path\\('html/index.html'\\)") (string-append "'" onionshare "/html/index.html'"))) - (substitute* - "onionshare_gui/file_selection.py" + (substitute* "onionshare_gui/file_selection.py" + ;; fancy box image in the GUI (("helpers.get_resource_path\\('images/drop_files.png'\\)") (string-append "'" onionshare "/images/drop_files.png'"))) - (substitute* - "onionshare_gui/server_status.py" + (substitute* "onionshare_gui/server_status.py" (("helpers.get_resource_path\\('images/server_stopped.png'\\)") (string-append "'" onionshare "/images/server_stopped.png'")) (("helpers.get_resource_path\\('images/server_working.png'\\)") (string-append "'" onionshare "/images/server_working.png'")) (("helpers.get_resource_path\\('images/server_started.png'\\)") (string-append "'" onionshare "/images/server_started.png'"))) - (substitute* - "onionshare_gui/onionshare_gui.py" + (substitute* "onionshare_gui/onionshare_gui.py" + ;; for the icon on the GUI (("helpers.get_resource_path\\('images/logo.png'\\)") (string-append "'" onionshare "/images/logo.png'"))) - (substitute* - "install/onionshare.desktop" - (("/usr") out)) + (substitute* '("setup.py" "onionshare/helpers.py") + (("sys.prefix,") (string-append "'" out "',"))) + (substitute* "setup.py" + ;; for the nautilus plugin + (("/usr/share/nautilus") "share/nautilus")) #t))) (delete 'check) (add-before 'strip 'tests ;; After all the patching we run the tests after installing. ;; This is also a known issue: ;; https://github.com/micahflee/onionshare/issues/284 - (lambda _ (zero? (system* "nosetests" "test"))))) - ;; can't compress the egg because it expects to find all the resources - ;; inside the egg as though it were a folder. - #:configure-flags '("--single-version-externally-managed" "--root=/") - )) + (lambda _ (zero? (system* "nosetests" "test"))))))) (native-inputs `(("python-nose" ,python-nose))) (inputs diff --git a/gnu/packages/unrtf.scm b/gnu/packages/unrtf.scm index 162dec7525..e11c9445ca 100644 --- a/gnu/packages/unrtf.scm +++ b/gnu/packages/unrtf.scm @@ -23,6 +23,7 @@ #:use-module (guix download) #:use-module (guix build-system gnu) #:use-module (guix gexp) + #:use-module (gnu packages) #:use-module (gnu packages autotools) #:use-module (gnu packages m4) #:use-module (gnu packages base)) @@ -35,6 +36,7 @@ (method url-fetch) (uri (string-append "mirror://gnu/unrtf/unrtf-" version ".tar.gz")) + (patches (search-patches "unrtf-CVE-2016-10091.patch")) (sha256 (base32 "1pcdzf2h1prn393dkvg93v80vh38q0v817xnbwrlwxbdz4k7i8r2")) diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm index e06a611164..7918b90ca6 100644 --- a/gnu/packages/version-control.scm +++ b/gnu/packages/version-control.scm @@ -112,14 +112,14 @@ as well as the classic centralized workflow.") (define-public git (package (name "git") - (version "2.10.2") + (version "2.11.0") (source (origin (method url-fetch) (uri (string-append "mirror://kernel.org/software/scm/git/git-" version ".tar.xz")) (sha256 (base32 - "0wc64dzcxrzgi6kwcljz6y3cwm3ajdgf6aws7g58azbhvl1jk04l")))) + "02zx368id8rys0bh2sjrxz0ln2l2wm5nf1vhp1rj72clsilqszky")))) (build-system gnu-build-system) (native-inputs `(("native-perl" ,perl) @@ -132,7 +132,7 @@ as well as the classic centralized workflow.") version ".tar.xz")) (sha256 (base32 - "0vxaz23vf3ki0q5zgn6mxr9x1hjryqn1hsmgyrgdk6h3yqbs7c43")))))) + "1n18jnpi0z3skwc1ckrm7zdld6i3zvn0g95cg9r9pdn0564fglxk")))))) (inputs `(("curl" ,curl) ("expat" ,expat) @@ -141,6 +141,9 @@ as well as the classic centralized workflow.") ("python" ,python-2) ; CAVEAT: incompatible with python-3 according to INSTALL ("zlib" ,zlib) + ;; For 'gitweb.cgi' + ("perl-cgi" ,perl-cgi) + ;; For 'git-svn'. ("subversion" ,subversion) ("perl-term-readkey" ,perl-term-readkey) @@ -257,6 +260,17 @@ as well as the classic centralized workflow.") "perl-net-smtp-ssl" "perl-io-socket-ssl"))))))) + ;; Tell 'gitweb.cgi' where perl modules are. + (wrap-program (string-append out "/share/gitweb/gitweb.cgi") + `("PERL5LIB" ":" prefix + ,(map (lambda (o) (string-append o "/lib/perl5/site_perl")) + (list + ,@(transitive-input-references + 'inputs + (map (lambda (l) + (assoc l (inputs))) + '("perl-cgi"))))))) + ;; Tell 'git-submodule' where Perl is. (wrap-program git-sm `("PATH" ":" prefix @@ -670,14 +684,14 @@ property manipulation.") (define-public subversion (package (name "subversion") - (version "1.8.16") + (version "1.8.17") (source (origin (method url-fetch) (uri (string-append "https://archive.apache.org/dist/subversion/" "subversion-" version ".tar.bz2")) (sha256 (base32 - "0imkxn25n6sbcgfldrx4z29npjprb1lxjm5fb89q4297161nx3zi")))) + "1450fkj1jmxyphqn6cd95z1ykwsabajm9jw4i412qpwss8w9a4fy")))) (build-system gnu-build-system) (arguments '(#:phases @@ -691,7 +705,8 @@ property manipulation.") ;; nice if this fix ultimately made its way into libtool. (let ((coreutils (assoc-ref inputs "coreutils"))) (substitute* "libtool" - (("\\\\`ls") (string-append "\\`" coreutils "/bin/ls")))))) + (("\\\\`ls") (string-append "\\`" coreutils "/bin/ls"))) + #t))) (add-after 'install 'install-perl-bindings (lambda* (#:key outputs #:allow-other-keys) ;; Follow the instructions from 'subversion/bindings/swig/INSTALL'. @@ -874,16 +889,14 @@ large, complex patch files.") (define-public cssc (package (name "cssc") - (version "1.3.0") + (version "1.4.0") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/" name "/CSSC-" version ".tar.gz")) (sha256 (base32 - "0bkw6fjh20ppvn54smv05461lm1vcwvn02avx941c4acafmkl1cm")) - (patches (search-patches "cssc-gets-undeclared.patch" - "cssc-missing-include.patch")))) + "15191dh8hr46cvssmv4v52gymiiyk6ca9j1bfimlqakcqab6y51h")))) (build-system gnu-build-system) (arguments `(#:phases @@ -1156,8 +1169,7 @@ Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity.") (build-system python-build-system) (arguments `(#:python ,python-2)) (native-inputs - `(("python2-setuptools" ,python2-setuptools) - ;; for the tests + `(;; for the tests ("python2-six" ,python2-six))) (propagated-inputs `(("python2-dateutil" ,python2-dateutil-2) diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm index 3b93f27426..b9f2d69100 100644 --- a/gnu/packages/video.scm +++ b/gnu/packages/video.scm @@ -3,7 +3,7 @@ ;;; Copyright © 2014, 2015, 2016 David Thompson <davet@gnu.org> ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com> -;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2015, 2016, 2017 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2015 Andy Patterson <ajpatter@uwaterloo.ca> ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2015, 2016 Alex Vong <alexvong1995@gmail.com> @@ -13,6 +13,7 @@ ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca> ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> +;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -212,14 +213,14 @@ television and DVD. It is also known as AC-3.") (define-public libx264 (package (name "libx264") - (version "20160220-2245") + (version "20161205-2245") (source (origin (method url-fetch) - (uri (string-append "http://download.videolan.org/pub/x264/snapshots/" + (uri (string-append "https://download.videolan.org/pub/x264/snapshots/" "x264-snapshot-" version ".tar.bz2")) (sha256 (base32 - "12zyzbiihfhamf7yi4qqaj6k0nisnrydvfr36kxadvmsm7dg4sj3")))) + "0jjzdwag59kqlk09bb2pykm1ss8bw3p9q7bsks2kjgdwbj121a44")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) @@ -245,7 +246,7 @@ television and DVD. It is also known as AC-3.") (%current-system))) '("--disable-asm") '())))) - (home-page "http://www.videolan.org/developers/x264.html") + (home-page "https://www.videolan.org/developers/x264.html") (synopsis "H.264 video coding library") (description "libx264 is an advanced encoding library for creating H.264 (MPEG-4 AVC) video streams.") @@ -441,14 +442,14 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).") (define-public ffmpeg (package (name "ffmpeg") - (version "3.2.1") + (version "3.2.2") (source (origin (method url-fetch) (uri (string-append "https://ffmpeg.org/releases/ffmpeg-" version ".tar.xz")) (sha256 (base32 - "1pxsy9s9n2nvz970rid3j3b45w6s7ziwnrbc16rny7k0bpd97kqy")))) + "1z7d5y5crhsl5fm74236rdwbkd4jj5frx1l4iizjfym1w4gvs09z")))) (build-system gnu-build-system) (inputs `(("fontconfig" ,fontconfig) @@ -609,14 +610,14 @@ audio/video codec library.") (define-public ffmpeg-2.8 (package (inherit ffmpeg) - (version "2.8.8") + (version "2.8.10") (source (origin (method url-fetch) (uri (string-append "https://ffmpeg.org/releases/ffmpeg-" version ".tar.xz")) (sha256 (base32 - "1691bmq8j56rcys09xwvzjq16z25m8vczj5a50gdn7ydm9qjykpr")))) + "1ca84kc715xm7wmbnj1z4jfhxj8c7rxhy4cqwrd8cnih0l196j1c")))) (arguments (substitute-keyword-arguments (package-arguments ffmpeg) ((#:configure-flags flags) @@ -833,7 +834,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.") (define-public mpv (package (name "mpv") - (version "0.22.0") + (version "0.23.0") (source (origin (method url-fetch) (uri (string-append @@ -841,11 +842,11 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.") ".tar.gz")) (sha256 (base32 - "1xl2a0nfbkcq00f41m50fmfz9hl7hzpk7cq7j38r38rp1s7sryf0")) + "1629v5l0rmphxra7chmfm7bnn59zc1mp529b9m2zqzaqf1czxvla")) (file-name (string-append name "-" version ".tar.gz")))) (build-system waf-build-system) (native-inputs - `(("perl" ,perl) + `(("perl" ,perl) ; for zsh completion file ("pkg-config" ,pkg-config) ("python-docutils" ,python-docutils))) ;; Missing features: libguess, Wayland, V4L2 @@ -969,7 +970,7 @@ access to mpv's powerful playback capabilities.") (define-public youtube-dl (package (name "youtube-dl") - (version "2016.10.16") + (version "2016.12.15") (source (origin (method url-fetch) (uri (string-append "https://youtube-dl.org/downloads/" @@ -977,7 +978,7 @@ access to mpv's powerful playback capabilities.") version ".tar.gz")) (sha256 (base32 - "0q6cxbp1xx8xmwn3xbxh6gcbgqjxy3slzfca4dbkk9xl2yy9rwqg")))) + "17m3dimgpn6139w95drc7zncfx2mskjx45qvmj74zhdqxnk3gnc5")))) (build-system python-build-system) (arguments ;; The problem here is that the directory for the man page and completion @@ -1398,7 +1399,7 @@ from various services and pipes them into a video playing application.") (define-public mlt (package (name "mlt") - (version "6.2.0") + (version "6.4.1") (source (origin (method url-fetch) (uri (string-append "https://github.com/mltframework/mlt/" @@ -1406,7 +1407,7 @@ from various services and pipes them into a video playing application.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "1zwzfgxrcbwkxnkiwv0a1rzxdnnaly90yyarl9wdw84nx11ffbnx")))) + "10m3ry0b2pvqx3bk34qh5dq337nn8pkc2gzfyhsj4nv9abskln47")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests @@ -1830,3 +1831,31 @@ supported players in addition to this package.") of modern, widely supported codecs.") ;; Most under GPL version 2 or later, and portions under BSD 3 Clause (license (list license:gpl2+ license:bsd-3)))) + +(define-public openh264 + (package + (name "openh264") + (version "1.6.0") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/cisco/" + name "/archive/v" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1ix2fhk62i4q4kbnkl0gfk4x53vxqavsn0pck1pashr566zhglv5")))) + (build-system gnu-build-system) + (native-inputs + `(("nasm" ,nasm) + ("python" ,python))) + (arguments + '(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out"))) + #:test-target "test" + #:phases (modify-phases %standard-phases + ;; no configure script + (delete 'configure)))) + (home-page "http://www.openh264.org/") + (synopsis "H264 decoder library") + (description + "Openh264 is a library which can decode H264 video streams.") + (license license:bsd-2))) diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm index 83c21249b4..0c359967d9 100644 --- a/gnu/packages/vim.scm +++ b/gnu/packages/vim.scm @@ -49,7 +49,7 @@ (define-public vim (package (name "vim") - (version "8.0.0101") + (version "8.0.0133") (source (origin (method url-fetch) (uri (string-append "https://github.com/vim/vim/archive/v" @@ -57,7 +57,7 @@ (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0kzk1p5vnqr8j5jwb3p745zx3dki5jwlsp7rh6nli0ci2w6vg3r8")))) + "1965lb3sq378kz2fxb5swi442bdvzj416znvslb7saapqx3pjj51")))) (build-system gnu-build-system) (arguments `(#:test-target "test" diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm index 6d50304307..0ce51aaf88 100644 --- a/gnu/packages/vpn.scm +++ b/gnu/packages/vpn.scm @@ -3,7 +3,8 @@ ;;; Copyright © 2013, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2015 Jeff Mickey <j@codemac.net> -;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (gnu packages) #:use-module (gnu packages compression) #:use-module (gnu packages gettext) @@ -32,6 +34,7 @@ #:use-module (gnu packages linux) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) #:use-module (gnu packages tls) #:use-module (gnu packages xml)) @@ -116,13 +119,13 @@ Only \"Universal TUN/TAP device driver support\" is needed in the kernel.") (define-public openconnect (package (name "openconnect") - (version "7.07") + (version "7.08") (source (origin (method url-fetch) (uri (string-append "ftp://ftp.infradead.org/pub/openconnect/" "openconnect-" version ".tar.gz")) (sha256 (base32 - "0rl33f1g42hxzqfv2a33gls8cb77q4w432xkims1dnfwhzagrv7k")))) + "00wacb79l2c45f94gxs63b9z25wlciarasvjrb8jb8566wgyqi0w")))) (build-system gnu-build-system) (inputs `(("libxml2" ,libxml2) @@ -149,7 +152,7 @@ and probably others.") (define-public openvpn (package (name "openvpn") - (version "2.3.9") + (version "2.3.14") (source (origin (method url-fetch) (uri (string-append @@ -157,7 +160,7 @@ and probably others.") version ".tar.xz")) (sha256 (base32 - "1hfwmdsp7s34qx34qgwrpp89h30744lbsks6y619cdh27bpnpwaj")))) + "167frlmmg2raffn9h7ww3agdwgfdl0wa5wm9fsgl0i6mz3md187k")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--enable-iproute2=yes"))) @@ -201,3 +204,61 @@ traversing network address translators (NATs) and firewalls.") "Tinc is a VPN that uses tunnelling and encryption to create a secure private network between hosts on the internet.") (license license:gpl2+))) + +(define-public sshuttle + (package + (name "sshuttle") + (version "0.78.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri name version)) + (sha256 + (base32 + "0g1dpqigz02vafzh84z5990lnj9d95raknav0xmf0va7rr41d9q3")))) + (build-system python-build-system) + (native-inputs + `(("python-pytest-runner" ,python-pytest-runner) + ("python-setuptools-scm" ,python-setuptools-scm) + ;; For tests only. + ("python-mock" ,python-mock) + ("python-pytest" ,python-pytest))) + (home-page "https://github.com/sshuttle/sshuttle") + (synopsis "VPN that transparently forwards connections over SSH") + (description "sshuttle creates an encrypted virtual private network (VPN) +connection to any remote server to which you have secure shell (SSH) access. +The only requirement is a suitable version of Python on the server; +administrative privileges are required only on the client. Unlike most VPNs, +sshuttle forwards entire sessions, not packets, using kernel transparent +proxying. This makes it faster and more reliable than SSH's own tunneling and +port forwarding features. It can forward both TCP and UDP traffic, including +DNS domain name queries.") + (license license:lgpl2.0))) ; incorrectly identified as GPL in ‘setup.py’ + +(define-public sshoot + (package + (name "sshoot") + (version "1.2.5") + (source + (origin + (method url-fetch) + (uri (pypi-uri name version)) + (sha256 + (base32 + "0a92lk8790dpp9j64vb6p4sazax0x3nby01lnfll7mxs1hx6n27q")))) + (build-system python-build-system) + (inputs + `(("python-argcomplete" ,python-argcomplete) + ("python-prettytable" ,python-prettytable) + ("python-pyyaml" ,python-pyyaml))) + ;; For tests only. + (native-inputs + `(("python-fixtures" ,python-fixtures) + ("python-pbr" ,python-pbr) + ("python-testtools" ,python-testtools))) + (home-page "https://bitbucket.org/ack/sshoot") + (synopsis "sshuttle VPN session manager") + (description "sshoot provides a command-line interface to manage multiple +@command{sshuttle} virtual private networks. It supports flexible profiles +with configuration options for most of @command{sshuttle}’s features.") + (license license:gpl3+))) diff --git a/gnu/packages/vtk.scm b/gnu/packages/vtk.scm index 13ce2e2ac0..5a5c941270 100644 --- a/gnu/packages/vtk.scm +++ b/gnu/packages/vtk.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> +;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -20,37 +21,64 @@ (define-module (gnu packages vtk) #:use-module (guix packages) #:use-module (guix download) - #:use-module (guix licenses) + #:use-module ((guix licenses) #:select (bsd-3)) + #:use-module (guix utils) #:use-module (guix build-system cmake) #:use-module (gnu packages) - #:use-module (gnu packages xorg) - #:use-module (gnu packages gl)) + #:use-module (gnu packages compression) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages gl) + #:use-module (gnu packages image) + #:use-module (gnu packages maths) + #:use-module (gnu packages serialization) + #:use-module (gnu packages xiph) + #:use-module (gnu packages xml) + #:use-module (gnu packages xorg)) (define-public vtk (package (name "vtk") - (version "6.1.0") + (version "7.1.0") (source (origin (method url-fetch) (uri (string-append "http://www.vtk.org/files/release/" - (substring version 0 - (string-rindex version #\.)) + (version-major+minor version) "/VTK-" version ".tar.gz")) (sha256 (base32 - "0d7shccdkyj4mbh2riilslgx3gd28in4c7xpm0lxa1ln8w5g2zdx")) - (patches (search-patches "vtk-mesa-10.patch")))) + "0yj96z58haan77gzilnqp7xpf8hg5jk11a3jx55p2ksd400s0gjz")))) (build-system cmake-build-system) (arguments - ;; Build without '-g' to save space. - '(#:configure-flags '("-DCMAKE_BUILD_TYPE=Release") + '(#:build-type "Release" ;Build without '-g' to save space. + ;; -DVTK_USE_SYSTEM_NETCDF:BOOL=TRUE requires netcdf_cxx + #:configure-flags '("-DVTK_USE_SYSTEM_EXPAT:BOOL=TRUE" + "-DVTK_USE_SYSTEM_FREETYPE:BOOL=TRUE" + "-DVTK_USE_SYSTEM_HDF5:BOOL=TRUE" + "-DVTK_USE_SYSTEM_JPEG:BOOL=TRUE" + "-DVTK_USE_SYSTEM_JSONCPP:BOOL=TRUE" + "-DVTK_USE_SYSTEM_LIBXML2:BOOL=TRUE" + "-DVTK_USE_SYSTEM_OGGTHEORA:BOOL=TRUE" + "-DVTK_USE_SYSTEM_PNG:BOOL=TRUE" + "-DVTK_USE_SYSTEM_TIFF:BOOL=TRUE" + "-DVTK_USE_SYSTEM_ZLIB:BOOL=TRUE") #:tests? #f)) ;XXX: no "test" target (inputs `(("libXt" ,libxt) ("xproto" ,xproto) ("libX11" ,libx11) + ("libxml2" ,libxml2) ("mesa" ,mesa) - ("glu" ,glu))) + ("glu" ,glu) + ("expat" ,expat) + ("freetype" ,freetype) + ("hdf5" ,hdf5) + ("jpeg" ,libjpeg) + ("jsoncpp" ,jsoncpp) + ("libogg" ,libogg) + ("libtheora" ,libtheora) + ("png" ,libpng) + ("tiff" ,libtiff) + ("zlib" ,zlib))) (home-page "http://www.vtk.org/") (synopsis "Libraries for 3D computer graphics") (description diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm index 753a81625c..5901e0ef6d 100644 --- a/gnu/packages/web.scm +++ b/gnu/packages/web.scm @@ -16,6 +16,7 @@ ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2016 Bake Timmons <b3timmons@speedymail.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -62,6 +63,7 @@ #:use-module (gnu packages gettext) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) + #:use-module (gnu packages gnupg) #:use-module (gnu packages gperf) #:use-module (gnu packages gtk) #:use-module (gnu packages icu4c) @@ -92,7 +94,9 @@ version ".tar.bz2")) (sha256 (base32 - "0n2yx3gjlpr4kgqx845fj6amnmg25r2l6a7rzab5hxnpmar985hc")))) + "0n2yx3gjlpr4kgqx845fj6amnmg25r2l6a7rzab5hxnpmar985hc")) + (patches (search-patches "httpd-CVE-2016-8740.patch")) + (patch-flags '("-p0")))) (build-system gnu-build-system) (native-inputs `(("pcre" ,pcre "bin"))) ;for 'pcre-config' (inputs `(("apr" ,apr) @@ -201,6 +205,68 @@ and as a proxy to reduce the load on back-end HTTP or mail servers.") ;; except for two source files which are bsd-4 licensed. (license (list l:bsd-2 l:expat l:bsd-3 l:bsd-4)))) +(define-public fcgi + (package + (name "fcgi") + (version "2.4.0") + (source + (origin + (method url-fetch) + ;; Upstream has disappeared + (uri (string-append "https://sources.archlinux.org/other/packages/fcgi/" + "fcgi-" version ".tar.gz")) + (sha256 + (base32 + "1f857wnl1d6jfrgfgfpz3zdaj8fch3vr13mnpcpvy8bang34bz36")) + (patches (search-patches "fcgi-2.4.0-poll.patch" + "fcgi-2.4.0-gcc44-fixes.patch")))) + (build-system gnu-build-system) + ;; Parallel building is not supported. + (arguments `(#:parallel-build? #f)) + (home-page "http://www.fastcgi.com") + (synopsis "Language-independent, high-performant extension to CGI") + (description "FastCGI is a language independent, scalable extension to CGI +that provides high performance without the limitations of server specific +APIs.") + ;; This package is released under the Open Market License, a variant of + ;; the Expat license, incompatible with the GPL. + (license (l:non-copyleft "file://LICENSE.TERMS")))) + +(define-public fcgiwrap + (package + (name "fcgiwrap") + (version "1.1.0") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/gnosek/fcgiwrap/" + "archive/" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "07y6s4mm86cv7p1ljz94sxnqa89y9amn3vzwsnbq5hrl4vdy0zac")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; no tests included + #:make-flags (list "CC=gcc") + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'bootstrap + (lambda _ + (zero? (system* "autoreconf" "-vif"))))))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("pkg-config" ,pkg-config))) + (inputs + `(("fcgi" ,fcgi))) + (home-page "https://nginx.localdomain.pl/wiki/FcgiWrap") + (synopsis "Simple server for running CGI applications over FastCGI") + (description "Fcgiwrap is a simple server for running CGI applications +over FastCGI. It hopes to provide clean CGI support to Nginx (and other web +servers that may need it).") + (license l:expat))) + (define-public starman (package (name "starman") @@ -461,7 +527,7 @@ for efficient socket-like bidirectional reliable communication channels.") (define-public libpsl (package (name "libpsl") - (version "0.15.0") + (version "0.16.1") (source (origin (method url-fetch) (uri (string-append "https://github.com/rockdaboot/libpsl/" @@ -469,7 +535,7 @@ for efficient socket-like bidirectional reliable communication channels.") "/libpsl-" version ".tar.gz")) (sha256 (base32 - "0wm9i3qshfdasd5s5nrdihl4f5c6zrd1nkqrqjnh7zhhv1an755m")))) + "1srrd0iyz9p5xgl8q0hrzqg7p8cl9ar0cdb8f54hls4kllf3f80l")))) (build-system gnu-build-system) (inputs `(("icu4c" ,icu4c) @@ -604,6 +670,34 @@ server). It was primarily designed to be used by one person or a small group of people.") (license l:expat))) +(define-public wwwoffle + (package + (name "wwwoffle") + (version "2.9j") + (source (origin + (method url-fetch) + (uri (string-append "https://www.gedanken.org.uk/software/" + "wwwoffle/download/wwwoffle-" + version ".tgz")) + (sha256 + (base32 + "1ihil1xq9dp21hf108khxbw6f3baq0w5c0j3af038y6lkmad4vdi")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags '("--with-gnutls") + #:tests? #f)) ; no test target + (native-inputs `(("flex" ,flex))) + (inputs `(("gnutls" ,gnutls) + ("libcrypt", libgcrypt))) + (home-page "https://www.gedanken.org.uk/software/wwwoffle/") + (synopsis "Caching web proxy optimized for intermittent internet links") + (description "WWWOFFLE is a proxy web server that is especially good for +intermittent internet links. It can cache HTTP, HTTPS, FTP, and finger +protocols, and supports browsing and requesting pages while offline, indexing, +modifying pages and incoming and outgoing headers, monitoring pages for +changes, and much more.") + (license l:gpl2+))) + (define-public libyaml (package (name "libyaml") @@ -827,7 +921,7 @@ language known as SASS.") (define-public perl-apache-logformat-compiler (package (name "perl-apache-logformat-compiler") - (version "0.32") + (version "0.33") (source (origin (method url-fetch) @@ -835,7 +929,7 @@ language known as SASS.") "Apache-LogFormat-Compiler-" version ".tar.gz")) (sha256 (base32 - "0zyx4r2bxc6d48m70fhcq80nw0q9wnfz6qgn1g0r6bigqgdjq4dw")))) + "17blk3zhp05azgypn25ydxf3d7fyfgr9bxyiv7xkchhqma96vwqv")))) (build-system perl-build-system) (native-inputs `(("perl-http-message" ,perl-http-message) @@ -902,26 +996,29 @@ action, which will forward to the first available view.") (define-public perl-catalyst-action-rest (package (name "perl-catalyst-action-rest") - (version "1.17") + (version "1.20") (source (origin (method url-fetch) - (uri (string-append "mirror://cpan/authors/id/F/FR/FREW/" + (uri (string-append "mirror://cpan/authors/id/J/JJ/JJNAPIORK/" "Catalyst-Action-REST-" version ".tar.gz")) (sha256 (base32 - "1rnxmsd9dsqz4xc0g9ynafxi934jwp0nixbg92q3bc2h46xcccy8")))) + "1mpa64p61f3dp24xnhdraswch4sqj5vyv1iivcvvh5h0xi0haiy0")))) (build-system perl-build-system) (native-inputs `(("perl-test-requires" ,perl-test-requires))) (propagated-inputs `(("perl-catalyst-runtime" ,perl-catalyst-runtime) ("perl-class-inspector" ,perl-class-inspector) + ("perl-config-general" ,perl-config-general) + ("perl-cpanel-json-xs" ,perl-cpanel-json-xs) ("perl-libwww" ,perl-libwww) ("perl-moose" ,perl-moose) ("perl-mro-compat" ,perl-mro-compat) ("perl-namespace-autoclean" ,perl-namespace-autoclean) ("perl-params-validate" ,perl-params-validate) - ("perl-uri-find" ,perl-uri-find))) + ("perl-uri-find" ,perl-uri-find) + ("perl-xml-simple" ,perl-xml-simple))) (home-page "http://search.cpan.org/dist/Catalyst-Action-REST") (synopsis "Automated REST Method Dispatching") (description "This Action handles doing automatic method dispatching for @@ -1110,7 +1207,7 @@ Models.") (define-public perl-catalyst-plugin-accesslog (package (name "perl-catalyst-plugin-accesslog") - (version "1.05") + (version "1.10") (source (origin (method url-fetch) @@ -1118,14 +1215,13 @@ Models.") "Catalyst-Plugin-AccessLog-" version ".tar.gz")) (sha256 (base32 - "0hqvckaw91q5yc25a33bp0d4qqxlgkp7rxlvi8n8svxd1406r55s")))) + "0811rj45q4v2y8wka3wb9d5m4vbyhcmkvddf2wz4x69awzjbhgc7")))) (build-system perl-build-system) (propagated-inputs `(("perl-catalyst-runtime" ,perl-catalyst-runtime) ("perl-datetime" ,perl-datetime) ("perl-moose" ,perl-moose) ("perl-namespace-autoclean" ,perl-namespace-autoclean))) - (arguments `(#:tests? #f)) ;Unexpected http responses (home-page "http://search.cpan.org/dist/Catalyst-Plugin-AccessLog") (synopsis "Request logging from within Catalyst") (description "This Catalyst plugin enables you to create \"access logs\" @@ -1251,7 +1347,7 @@ formats.") (define-public perl-catalyst-plugin-session (package (name "perl-catalyst-plugin-session") - (version "0.39") + (version "0.40") (source (origin (method url-fetch) @@ -1259,7 +1355,7 @@ formats.") "Catalyst-Plugin-Session-" version ".tar.gz")) (sha256 (base32 - "0m4a003qgz7848iyckwbigg2vw3kmfxggh1razrnzxrbz3n6x5gi")))) + "171vi9xcl775scjaw4fcfdmqvz0rb1nr0xxg2gb3ng6bjzpslhgv")))) (build-system perl-build-system) (native-inputs `(("perl-test-deep" ,perl-test-deep) @@ -1269,6 +1365,7 @@ formats.") ("perl-moose" ,perl-moose) ("perl-moosex-emulate-class-accessor-fast" ,perl-moosex-emulate-class-accessor-fast) + ("perl-mro-compat" ,perl-mro-compat) ("perl-namespace-clean" ,perl-namespace-clean) ("perl-object-signature" ,perl-object-signature) ("perl-test-www-mechanize-psgi" ,perl-test-www-mechanize-psgi))) @@ -1517,7 +1614,7 @@ table based report in a variety of formats (CSV, HTML, etc.).") (define-public perl-catalyst-view-json (package (name "perl-catalyst-view-json") - (version "0.35") + (version "0.36") (source (origin (method url-fetch) @@ -1525,7 +1622,7 @@ table based report in a variety of formats (CSV, HTML, etc.).") "Catalyst-View-JSON-" version ".tar.gz")) (sha256 (base32 - "184pyghlrkl7p387bnyvswi2d9myvdg4v3lax6xrd59shskvpmkm")))) + "0x943j1n2r0zqanyzdrs1xsnn8ayn2wqskn7h144xcqa6v6gcisl")))) (build-system perl-build-system) (native-inputs `(("perl-yaml" ,perl-yaml))) @@ -1542,19 +1639,20 @@ stash data in JSON format.") (define-public perl-catalyst-view-tt (package (name "perl-catalyst-view-tt") - (version "0.42") + (version "0.44") (source (origin (method url-fetch) - (uri (string-append "mirror://cpan/authors/id/J/JJ/JJNAPIORK/" + (uri (string-append "mirror://cpan/authors/id/E/ET/ETHER/" "Catalyst-View-TT-" version ".tar.gz")) (sha256 (base32 - "18ciik9fqaqjfasa9wicbjrsl3gjhjc15xzaj3rif57an25cl178")))) + "06d1zg4nbb6kcyjbnyxrkf8z4zlscxr8650d94f7187jygfl8rvh")))) (build-system perl-build-system) (propagated-inputs `(("perl-catalyst-runtime" ,perl-catalyst-runtime) ("perl-class-accessor" ,perl-class-accessor) + ("perl-data-dump" ,perl-data-dump) ("perl-mro-compat" ,perl-mro-compat) ("perl-path-class" ,perl-path-class) ("perl-template-timer" ,perl-template-timer) @@ -1651,7 +1749,7 @@ development server with Starman.") (define-public perl-cgi (package (name "perl-cgi") - (version "4.25") + (version "4.35") (source (origin (method url-fetch) @@ -1659,7 +1757,7 @@ development server with Starman.") "CGI-" version ".tar.gz")) (sha256 (base32 - "06hk9zzvlix1yi95wlkb1ykdxgl6lscm7452gkwr2snsb8iybczg")))) + "07gwnlc7vq58fjwmfsrv0hfyirqqdrpjhf89caq34rjrkz2wsd0b")))) (build-system perl-build-system) (native-inputs `(("perl-test-deep" ,perl-test-deep) @@ -1768,7 +1866,7 @@ for files and urls.") (define-public perl-encode-locale (package (name "perl-encode-locale") - (version "1.03") + (version "1.05") (source (origin (method url-fetch) (uri (string-append @@ -1776,7 +1874,7 @@ for files and urls.") version ".tar.gz")) (sha256 (base32 - "0m9d1vdphlyzybgmdanipwd9ndfvyjgk3hzw250r299jjgh3fqzp")))) + "1h8fvcdg3n20c2yp7107yhdkkx78534s9hnvn7ps8hpmf4ks0vqp")))) (build-system perl-build-system) (license (package-license perl)) (synopsis "Perl locale encoding determination") @@ -1843,7 +1941,7 @@ which can be used to parse directory listings.") (define-public perl-finance-quote (package (name "perl-finance-quote") - (version "1.37") + (version "1.38") (source (origin (method url-fetch) @@ -1851,7 +1949,7 @@ which can be used to parse directory listings.") "Finance-Quote-" version ".tar.gz")) (sha256 (base32 - "1b6pbh7f76fb5sa4f0lhx085xy55pprz5v7z7li7pqiyw7i4f4bf")) + "0zhqb27y4vdxn476s2kwm9zl2f970yjcyyybnjm9b406krr2fm59")) (patches (search-patches "perl-finance-quote-unuse-mozilla-ca.patch")))) (build-system perl-build-system) @@ -2019,7 +2117,7 @@ representing, creating, and extracting information from HTML syntax trees.") (define-public perl-html-parser (package (name "perl-html-parser") - (version "3.71") + (version "3.72") (source (origin (method url-fetch) (uri (string-append @@ -2027,10 +2125,11 @@ representing, creating, and extracting information from HTML syntax trees.") version ".tar.gz")) (sha256 (base32 - "00nqzdgl7c3jilx7mil19k5jwcw3as14pvkjgxi97zyk94vqp4dy")))) + "12v05ywlnsi9lc17z32k9jxx3sj1viy7y1wpl7n4az76v7hwfa7c")))) (build-system perl-build-system) (inputs - `(("perl-html-tagset" ,perl-html-tagset))) + `(("perl-html-tagset" ,perl-html-tagset) + ("perl-http-message" ,perl-http-message))) (license (package-license perl)) (synopsis "Perl HTML parser class") (description @@ -2089,7 +2188,7 @@ you to separate design from the data.") (define-public perl-http-body (package (name "perl-http-body") - (version "1.19") + (version "1.22") (source (origin (method url-fetch) @@ -2097,7 +2196,7 @@ you to separate design from the data.") "HTTP-Body-" version ".tar.gz")) (sha256 (base32 - "0ahhksj0zg6wq6glpjkxdr3byd5riwvq2f5aw21n1jcsl71nll01")))) + "15vj488i62mdp4ps9k77h39prj70i7anb6b0j8nm7l9vbdc2q3gw")))) (build-system perl-build-system) (native-inputs `(("perl-test-deep" ,perl-test-deep))) @@ -2114,7 +2213,7 @@ and multipart/form-data.") (define-public perl-http-cookiejar (package (name "perl-http-cookiejar") - (version "0.006") + (version "0.008") (source (origin (method url-fetch) @@ -2122,12 +2221,13 @@ and multipart/form-data.") "HTTP-CookieJar-" version ".tar.gz")) (sha256 (base32 - "0c7l29ak6ba2j006ca00vnkxpyc1fvpikydjvsb24s50zf1mv7b2")))) + "0rfw6avcralggs7bf7n86flvhaahxjnqzvpwszp0sk4z4wwy01wm")))) (build-system perl-build-system) (native-inputs `(("perl-test-deep" ,perl-test-deep) ("perl-test-requires" ,perl-test-requires) - ("perl-time-mock" ,perl-time-mock))) + ("perl-time-mock" ,perl-time-mock) + ("perl-uri" ,perl-uri))) (inputs `(("perl-time-local" ,perl-time-local) ("perl-http-date" ,perl-http-date))) @@ -2207,18 +2307,19 @@ used by the HTTP protocol (and then some more).") (define-public perl-http-message (package (name "perl-http-message") - (version "6.06") + (version "6.11") (source (origin (method url-fetch) (uri (string-append - "mirror://cpan/authors/id/G/GA/GAAS/HTTP-Message-" + "mirror://cpan/authors/id/E/ET/ETHER/HTTP-Message-" version ".tar.gz")) (sha256 (base32 - "0qxdrcak97azjvqyx1anpb2ky6vp6vc37x0wcfjdqfajkh09fzh8")))) + "06yq6cjx4vzl4if4ykap77xsrrd8aa7ish90k7cqi8g6g83nicz7")))) (build-system perl-build-system) (propagated-inputs - `(("perl-http-date" ,perl-http-date) + `(("perl-encode-locale" ,perl-encode-locale) + ("perl-http-date" ,perl-http-date) ("perl-io-html" ,perl-io-html) ("perl-lwp-mediatypes" ,perl-lwp-mediatypes) ("perl-uri" ,perl-uri))) @@ -2226,7 +2327,7 @@ used by the HTTP protocol (and then some more).") (synopsis "Perl HTTP style message") (description "An HTTP::Message object contains some headers and a content body.") - (home-page "http://search.cpan.org/~gaas/HTTP-Message/"))) + (home-page "http://search.cpan.org/~ether/HTTP-Message/"))) (define-public perl-http-negotiate (package @@ -2322,15 +2423,15 @@ environment from an HTTP::Request.") (define-public perl-http-server-simple (package (name "perl-http-server-simple") - (version "0.44") + (version "0.51") (source (origin (method url-fetch) - (uri (string-append "mirror://cpan/authors/id/J/JE/JESSE/" + (uri (string-append "mirror://cpan/authors/id/B/BP/BPS/" "HTTP-Server-Simple-" version ".tar.gz")) (sha256 (base32 - "05klpfkss2a6i5ihmvcm27fyar0f2v4ispg2f49agab3va1gix6g")))) + "1yvd2g57z2kq00q5i3zzfi15k98qgbif3vghjsda6v612agmrp5r")))) (build-system perl-build-system) (propagated-inputs `(("perl-cgi" ,perl-cgi))) @@ -2348,7 +2449,7 @@ http-based UI to your existing tools.") (define-public perl-http-tiny (package (name "perl-http-tiny") - (version "0.053") + (version "0.070") (source (origin (method url-fetch) @@ -2356,12 +2457,13 @@ http-based UI to your existing tools.") "HTTP-Tiny-" version ".tar.gz")) (sha256 (base32 - "1bwy31xrcz5zfx1n3vc50vj1aqvzn5ccr7lgacl8wmi03a6w2af2")))) + "0cvp5yqrni6qydpsa8fpkbm82zfwmy9js8jsvyj8gs3dx78qbwvl")))) (build-system perl-build-system) (inputs `(("perl-http-cookiejar" ,perl-http-cookiejar) ("perl-io-socket-ip" ,perl-io-socket-ip) ("perl-io-socket-ssl" ,perl-io-socket-ssl) + ("perl-mozilla-ca" ,perl-mozilla-ca) ("perl-net-ssleay" ,perl-net-ssleay))) (home-page "http://search.cpan.org/dist/HTTP-Tiny") (synopsis "HTTP/1.1 client") @@ -2442,7 +2544,7 @@ select or poll.") (define-public perl-libwww (package (name "perl-libwww") - (version "6.13") + (version "6.15") (source (origin (method url-fetch) (uri (string-append @@ -2450,7 +2552,7 @@ select or poll.") version ".tar.gz")) (sha256 (base32 - "1cpqjl59viw50bnbdyn8xzrwzg7g54b2rszw0fifacqrppp17gaz")))) + "08l3mpgcvm4ipn1zggymqgk402apf35xyds43i8c07hvq92rsd3g")))) (build-system perl-build-system) (propagated-inputs `(("perl-encode-locale" ,perl-encode-locale) @@ -2458,8 +2560,11 @@ select or poll.") ("perl-html-parser" ,perl-html-parser) ("perl-http-cookies" ,perl-http-cookies) ("perl-http-daemon" ,perl-http-daemon) + ("perl-http-date" ,perl-http-date) + ("perl-http-message" ,perl-http-message) ("perl-http-negotiate" ,perl-http-negotiate) ("perl-net-http" ,perl-net-http) + ("perl-uri" ,perl-uri) ("perl-www-robotrules" ,perl-www-robotrules))) (license (package-license perl)) (synopsis "Perl modules for the WWW") @@ -3172,11 +3277,7 @@ CDF, Atom 0.3, and Atom 1.0 feeds.") l:freebsd-doc)))) ; documentation (define-public python2-feedparser - (let ((base (package-with-python2 - (strip-python2-variant python-feedparser)))) - (package (inherit base) - (native-inputs - `(("python2-setuptools" ,python2-setuptools)))))) + (package-with-python2 python-feedparser)) (define-public r-httpuv (package @@ -3205,13 +3306,13 @@ particularly easy to create complete web applications using httpuv alone.") (define-public r-jsonlite (package (name "r-jsonlite") - (version "1.1") + (version "1.2") (source (origin (method url-fetch) (uri (cran-uri "jsonlite" version)) (sha256 (base32 - "0mrfzh0mxxrhqdmxai434wvyd7skkw28vxr7pyls19yrg941g6r3")))) + "0k966hzp3qnwck7fgd76w49zrz39s7pqyywws17bhbcd8rh4csyb")))) (build-system r-build-system) (home-page "http://arxiv.org/abs/1403.2805") (synopsis "Robust, high performance JSON parser and generator for R") @@ -3229,13 +3330,13 @@ in systems and applications.") (define-public r-servr (package (name "r-servr") - (version "0.4") + (version "0.5") (source (origin (method url-fetch) (uri (cran-uri "servr" version)) (sha256 (base32 - "1fkqf5ynd1g0932qwv5nr70bw42m8vxpc9rhi0qxmdamwqcw8qjn")))) + "1ixcl9xjc1k9zvl6v6bsw4kpramr1h53b4s46qg8kahkqy6kqd8a")))) (build-system r-build-system) (propagated-inputs `(("r-httpuv" ,r-httpuv) @@ -3288,13 +3389,13 @@ directory.") (define-public r-htmlwidgets (package (name "r-htmlwidgets") - (version "0.7") + (version "0.8") (source (origin (method url-fetch) (uri (cran-uri "htmlwidgets" version)) (sha256 (base32 - "1xh8aiaci5hi3r67ym7r37hm89m9vzywk292avnmaj125kq7w1d0")))) + "1df3pwl34rvdbr9sgr5h27q9bmqpckvpwq4frl3d1v614y3vfclj")))) (build-system r-build-system) (propagated-inputs `(("r-htmltools" ,r-htmltools) @@ -3340,13 +3441,13 @@ LaTeX.") (define-public r-curl (package (name "r-curl") - (version "2.2") + (version "2.3") (source (origin (method url-fetch) (uri (cran-uri "curl" version)) (sha256 (base32 - "0hyvyjzf5ja7kfhzmlfgp86hg1lxrriiwbnr6pxabwwslswj3cmj")))) + "0gbw5l0wnsw26fbr08gj9vgxrzxg8axvqxfshmd8g9khpgbdl0gr")))) (build-system r-build-system) (arguments `(#:phases diff --git a/gnu/packages/wget.scm b/gnu/packages/wget.scm index 80da33272e..72aab86c14 100644 --- a/gnu/packages/wget.scm +++ b/gnu/packages/wget.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; ;;; This file is part of GNU Guix. ;;; @@ -60,3 +61,36 @@ HTTPS and FTP protocols. It can resume interrupted downloads, use file name wild cards, supports proxies and cookies, and it can convert absolute links in downloaded documents to relative links.") (license gpl3+))) ; some files are under GPLv2+ + +(define-public wgetpaste + (package + (name "wgetpaste") + (version "2.28") + (source + (origin + (method url-fetch) + (uri (string-append "http://wgetpaste.zlin.dk/wgetpaste-" + version ".tar.bz2")) + (sha256 + (base32 + "1hh9svyypqcvdg5mjxyyfzpdzhylhf7s7xq5dzglnm4injx3i3ak")))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) + (zsh (string-append out "/share/zsh/site-functions"))) + (install-file "wgetpaste" bin) + (install-file "_wgetpaste" zsh))))) + #:tests? #f)) ; no test target + (home-page "http://wgetpaste.zlin.dk/") + (synopsis "Script that automates pasting to a number of pastebin services") + (description + "@code{wgetpaste} is an extremely simple command-line interface to various +online pastebin services.") + (license public-domain))) diff --git a/gnu/packages/wicd.scm b/gnu/packages/wicd.scm index e70bf736a5..9de956c6ff 100644 --- a/gnu/packages/wicd.scm +++ b/gnu/packages/wicd.scm @@ -67,6 +67,9 @@ (arguments `(#:python ,python-2 #:tests? #f ; test suite requires networking + ;; wicd directly extends distutils command classes, + ;; we can't easily make setup.py use setuptools. + #:use-setuptools? #f #:phases (alist-cons-before 'build 'configure diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm index 9a1bd56608..367f27af5e 100644 --- a/gnu/packages/wine.scm +++ b/gnu/packages/wine.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015 Sou Bunnbu <iyzsong@gmail.com> ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; ;;; This file is part of GNU Guix. ;;; @@ -52,7 +53,7 @@ (define-public wine (package (name "wine") - (version "1.9.15") + (version "1.9.24") (source (origin (method url-fetch) (uri (string-append "https://dl.winehq.org/wine/source/" @@ -60,7 +61,7 @@ "/wine-" version ".tar.bz2")) (sha256 (base32 - "1nmd65knzyh8b0yhxlqqvzai5rpnmhhm0c46n789zr5hj74jm6fg")))) + "0qb07vfxwz41wj71lb0ss3apf22m4ch06382rqfksf7gg34pswnb")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config) ("gettext" ,gettext-minimal) @@ -117,19 +118,19 @@ (list "SHELL=bash") #:phases - (alist-cons-after - 'configure 'patch-dlopen-paths - ;; Hardcode dlopened sonames to absolute paths. - (lambda _ - (let* ((library-path (search-path-as-string->list - (getenv "LIBRARY_PATH"))) - (find-so (lambda (soname) - (search-path library-path soname)))) - (substitute* "include/config.h" - (("(#define SONAME_.* )\"(.*)\"" _ defso soname) - (format #f "~a\"~a\"" defso (find-so soname)))))) - %standard-phases))) - (home-page "http://www.winehq.org/") + (modify-phases %standard-phases + (add-after 'configure 'patch-dlopen-paths + ;; Hardcode dlopened sonames to absolute paths. + (lambda _ + (let* ((library-path (search-path-as-string->list + (getenv "LIBRARY_PATH"))) + (find-so (lambda (soname) + (search-path library-path soname)))) + (substitute* "include/config.h" + (("(#define SONAME_.* )\"(.*)\"" _ defso soname) + (format #f "~a\"~a\"" defso (find-so soname)))) + #t)))))) + (home-page "https://www.winehq.org/") (synopsis "Implementation of the Windows API") (description "Wine (originally an acronym for \"Wine Is Not an Emulator\") is a diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm index 999f78927f..6713560c5f 100644 --- a/gnu/packages/wm.scm +++ b/gnu/packages/wm.scm @@ -9,7 +9,7 @@ ;;; Copyright © 2016 Al McElrath <hello@yrns.org> ;;; Copyright © 2016 Carlo Zancanaro <carlo@zancanaro.id.au> ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> -;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> +;;; Copyright © 2016 ng0 <ng0@libertad.pw> ;;; Copyright © 2016 doncatnip <gnopap@gmail.com> ;;; Copyright © 2016 Ivan Vilata i Balaguer <ivan@selidor.net> ;;; @@ -162,27 +162,49 @@ commands would.") (define-public i3-wm (package (name "i3-wm") - (version "4.12") + (version "4.13") (source (origin (method url-fetch) (uri (string-append "https://i3wm.org/downloads/i3-" version ".tar.bz2")) (sha256 (base32 - "1d3q3lgpjbkmcwzjhp0dfr0jq847silcfg087slcnj95ikh1r7p1")))) + "12ngz32swh9n85xy0cz1lq16aqi9ys5hq19v589q9a97wn1k3hcl")))) (build-system gnu-build-system) (arguments - `(#:make-flags (list "CC=gcc" (string-append "PREFIX=" %output)) - #:phases - (modify-phases %standard-phases - (delete 'configure)) - #:tests? #f)) ; no test suite + `(#:make-flags + (let* ((docbook-xsl-name-version ,(string-append + (package-name docbook-xsl) "-" + (package-version docbook-xsl))) + (docbook-xsl-catalog-file (string-append + (assoc-ref %build-inputs "docbook-xsl") + "/xml/xsl/" + docbook-xsl-name-version + "/catalog.xml")) + (docbook-xml-catalog-file (string-append + (assoc-ref %build-inputs "docbook-xml") + "/xml/dtd/docbook/catalog.xml"))) + ;; Reference the catalog files required to build the manpages. + (list (string-append "XML_CATALOG_FILES=" docbook-xsl-catalog-file " " + docbook-xml-catalog-file) + "CC=gcc" + (string-append "PREFIX=" %output) + ;; This works around the following error: + ;; 'error: ‘for’ loop initial declarations are only allowed in C99 + ;; or C11 mode' + "CFLAGS=-std=c11")) + ;; The build system tries to build in a separate directory, but that + ;; seems to be unnecessary. + #:configure-flags '("--disable-builddir") + ;; The test suite appears to require the unpackaged Perl module AnyEvent. + #:tests? #f)) (inputs `(("libxcb" ,libxcb) ("xcb-util" ,xcb-util) ("xcb-util-cursor" ,xcb-util-cursor) ("xcb-util-keysyms" ,xcb-util-keysyms) ("xcb-util-wm" ,xcb-util-wm) + ("xcb-util-xrm" ,xcb-util-xrm) ("libxkbcommon" ,libxkbcommon) ("libev" ,libev) ("libyajl" ,libyajl) @@ -198,7 +220,9 @@ commands would.") (native-inputs `(("which" ,which) ("perl" ,perl) - ("pkg-config" ,pkg-config))) + ("pkg-config" ,pkg-config) + ;; For building the documentation. + ("docbook-xsl" ,docbook-xsl))) (home-page "https://i3wm.org/") (synopsis "Improved tiling window manager") (description "A tiling window manager, completely written @@ -473,15 +497,15 @@ experience.") (define-public awesome (package (name "awesome") - (version "3.5.9") + (version "4.0") (source (origin (method url-fetch) (uri (string-append - "https://awesome.naquadah.org/download/awesome-" - version ".tar.xz")) + "https://github.com/awesomeWM/awesome-releases/raw/" + "master/awesome-" version ".tar.xz")) (sha256 (base32 - "0kynair1ykr74b39a4gcm2y24viial64337cf26nhlc7azjbby67")) + "0czkcz67sab63gf5m2p2pgg05yinjx60hfb9rfyzdkkg28q9f02w")) (modules '((guix build utils) (srfi srfi-19))) (snippet @@ -514,6 +538,7 @@ experience.") ("libxcb" ,libxcb) ("libxcursor" ,libxcursor) ("libxdg-basedir" ,libxdg-basedir) + ("libxkbcommon" ,libxkbcommon) ("lua" ,lua) ("lua-lgi",lua-lgi) ("pango" ,pango) @@ -523,6 +548,7 @@ experience.") ("xcb-util-image" ,xcb-util-image) ("xcb-util-keysyms" ,xcb-util-keysyms) ("xcb-util-renderutil" ,xcb-util-renderutil) + ("xcb-util-xrm" ,xcb-util-xrm) ("xcb-util-wm" ,xcb-util-wm))) (arguments `(;; Let compression happen in our 'compress-documentation' phase so that diff --git a/gnu/packages/wxwidgets.scm b/gnu/packages/wxwidgets.scm index b72567f259..5285037ffe 100644 --- a/gnu/packages/wxwidgets.scm +++ b/gnu/packages/wxwidgets.scm @@ -149,6 +149,9 @@ and many other languages.") (arguments `(#:python ,python-2 #:tests? #f ; tests fail + ;; wxPython directly extends distutils command classes, + ;; we can't easily make setup.py use setuptools. + #:use-setuptools? #f #:configure-flags (list "WXPORT=gtk2" "UNICODE=1") #:phases @@ -181,8 +184,7 @@ and many other languages.") #t))))) (native-inputs `(("mesa" ,mesa) ; for glcanvas - ("pkg-config" ,pkg-config) - ("python2-setuptools" ,python2-setuptools))) + ("pkg-config" ,pkg-config))) (inputs `(("gtk+" ,gtk+-2) ; for wxPython/src/helpers.cpp ("wxwidgets" ,wxwidgets-gtk2))) diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm index 86f5ad203c..615e539e20 100644 --- a/gnu/packages/xdisorg.scm +++ b/gnu/packages/xdisorg.scm @@ -92,8 +92,7 @@ (inputs `(("pygtk" ,python2-pygtk) ("xrandr" ,xrandr))) (native-inputs `(("gettext" ,gettext-minimal) - ("python-docutils" ,python2-docutils) - ("python-setuptools" ,python2-setuptools))) + ("python-docutils" ,python2-docutils))) (home-page "https://christian.amsuess.com/tools/arandr/") (synopsis "Another RandR graphical user interface") ;; TRANSLATORS: "X11 resize-and-rotate" should not be translated. @@ -242,7 +241,6 @@ following the mouse.") (package (name "pixman") (version "0.34.0") - (replacement pixman/fixed) (source (origin (method url-fetch) (uri (string-append @@ -250,7 +248,8 @@ following the mouse.") version ".tar.gz")) (sha256 (base32 - "13m842m9ffac3m9r0b4lvwjhwzg3w4353djkjpf00s0wnm4v5di1")))) + "13m842m9ffac3m9r0b4lvwjhwzg3w4353djkjpf00s0wnm4v5di1")) + (patches (search-patches "pixman-CVE-2016-5296.patch")))) (build-system gnu-build-system) (inputs `(("libpng" ,libpng) @@ -264,14 +263,6 @@ manipulation, providing features such as image compositing and trapezoid rasterisation.") (license license:x11))) -(define pixman/fixed - (package - (inherit pixman) - (source (origin - (inherit (package-source pixman)) - (patches (search-patches "pixman-CVE-2016-5296.patch")))))) - - (define-public libdrm (package (name "libdrm") @@ -610,7 +601,7 @@ X Window System.") ("libxt" ,libxt) ("libxext" ,libxext) ("libxinerama" ,libxinerama))) - (home-page "http://sourceforge.net/projects/libxosd/") + (home-page "https://sourceforge.net/projects/libxosd/") (synopsis "X On Screen Display") (description "XOSD provides a C library and a simple utility (osd_cat) for displaying @@ -725,7 +716,7 @@ within a single process.") (define-public xcape (package (name "xcape") - (version "1.1") + (version "1.2") (source (origin (method url-fetch) @@ -734,7 +725,7 @@ within a single process.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0jkdiaxc6sryrbibdgi2y1c48n4l9xyazhxr16l6h4ibddx95bk9")))) + "0898zc3vwxia00h9kfknpf7jygxgwggrx8v5mxc31w4lzn2dhzm2")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no check target @@ -949,7 +940,7 @@ connectivity of the X server running on a particular @code{DISPLAY}.") (define-public rofi (package (name "rofi") - (version "1.2.0") + (version "1.3.0") (source (origin (method url-fetch) (uri (string-append "https://github.com/DaveDavenport/rofi/" @@ -957,7 +948,7 @@ connectivity of the X server running on a particular @code{DISPLAY}.") version "/rofi-" version ".tar.xz")) (sha256 (base32 - "0xxx0xpxhrhlhi2axq9867zqrhwqavc1qrr833k1xr0pvm5m0aqc")))) + "1a65ai93ygras5bi7wc0s5i3zqslzqlnw3klq3sdnp2p0d6hjjqn")))) (build-system gnu-build-system) (inputs `(("pango" ,pango) @@ -1036,7 +1027,7 @@ actions, a built-in clock, a battery monitor and a system tray.") (define-public xcb-util-xrm (package (name "xcb-util-xrm") - (version "1.0") + (version "1.2") (source (origin (method url-fetch) (uri (string-append @@ -1044,7 +1035,7 @@ actions, a built-in clock, a battery monitor and a system tray.") "/download/v" version "/xcb-util-xrm-" version ".tar.bz2")) (sha256 (base32 - "1h5vxwpd37dqfw9yj1l4zd9c5dj30r3g0szgysr6kd7xrqgaq04l")) + "0vbqhag51i0njc8d5fc8c6aa12496cwrc3s6s7sa5kfc17cwhppp")) (modules '((guix build utils))) (snippet ;; Drop bundled m4. diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm index 505d585e66..32b658489c 100644 --- a/gnu/packages/xml.scm +++ b/gnu/packages/xml.scm @@ -74,6 +74,7 @@ things the parser might find in the XML document (like start tags).") (define-public libxml2 (package (name "libxml2") + (replacement libxml2/fixed) (version "2.9.4") (source (origin (method url-fetch) @@ -101,6 +102,15 @@ things the parser might find in the XML document (like start tags).") project (but it is usable outside of the Gnome platform).") (license license:x11))) +(define libxml2/fixed + (package + (inherit libxml2) + (source + (origin + (inherit (package-source libxml2)) + (patches (search-patches "libxml2-CVE-2016-4658.patch" + "libxml2-CVE-2016-5131.patch")))))) + (define-public python-libxml2 (package (inherit libxml2) (name "python-libxml2") @@ -167,7 +177,7 @@ based on libxml for XML parsing, tree manipulation and XPath support.") (define-public perl-graph-readwrite (package (name "perl-graph-readwrite") - (version "2.08") + (version "2.09") (source (origin (method url-fetch) @@ -177,7 +187,7 @@ based on libxml for XML parsing, tree manipulation and XPath support.") ".tar.gz")) (sha256 (base32 - "1wjni212nfz9irp19nx9if1lj3w9cybpdbzhii4g8macpryjj7ci")))) + "0jlsg64pmy6ka5q5gy851nnyfgjzvhyxc576bhns3vi2x5ng07mh")))) (build-system perl-build-system) (propagated-inputs `(("perl-graph" ,perl-graph) @@ -310,14 +320,14 @@ XML parser and the high performance DOM implementation.") (define-public perl-xml-libxml-simple (package (name "perl-xml-libxml-simple") - (version "0.95") + (version "0.97") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/" "XML-LibXML-Simple-" version ".tar.gz")) (sha256 (base32 - "0qqfqj5bgqmh1j4iv8dwl3g00nsmcvf2b7w1d09k9d77rrb249xi")))) + "1g8nlk3zdz2cclxf7azvsb3jfxmvy6ml8wmj774k4qjqcsqmzk0w")))) (build-system perl-build-system) (propagated-inputs `(("perl-file-slurp-tiny" ,perl-file-slurp-tiny) @@ -329,6 +339,29 @@ XML parser and the high performance DOM implementation.") @code{XML::LibXML}.") (license (package-license perl)))) +(define-public perl-xml-libxslt + (package + (name "perl-xml-libxslt") + (version "1.95") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://cpan/authors/id/S/SH/SHLOMIF/" + "XML-LibXSLT-" version ".tar.gz")) + (sha256 + (base32 + "0dggycql18kfxzkb1kw3yc7gslxlrrgyyn2r2ygsylycb89j3jpi")))) + (build-system perl-build-system) + (inputs + `(("libxslt" ,libxslt))) + (propagated-inputs + `(("perl-xml-libxml" ,perl-xml-libxml))) + (home-page "http://search.cpan.org/dist/XML-LibXSLT") + (synopsis "Perl bindings to GNOME libxslt library") + (description "This Perl module is an interface to the GNOME project's +libxslt library.") + (license (package-license perl)))) + (define-public perl-xml-namespacesupport (package (name "perl-xml-namespacesupport") @@ -491,7 +524,7 @@ EntityRef, CharRef, Reference, Name, NmToken, and AttValue.") (define-public perl-xml-dom (package (name "perl-xml-dom") - (version "1.44") + (version "1.46") (source (origin (method url-fetch) (uri (string-append @@ -499,11 +532,12 @@ EntityRef, CharRef, Reference, Name, NmToken, and AttValue.") version ".tar.gz")) (sha256 (base32 - "1r0ampc88ni3sjpzr583k86076qg399arfm9xirv3cw49k3k5bzn")))) + "0phpkc4li43m2g44hdcvyxzy9pymqwlqhh5hwp2xc0cv8l5lp8lb")))) (build-system perl-build-system) (propagated-inputs `(("perl-libwww" ,perl-libwww) ("perl-libxml" ,perl-libxml) + ("perl-xml-parser" ,perl-xml-parser) ("perl-xml-regexp" ,perl-xml-regexp))) (license (package-license perl)) (synopsis @@ -542,14 +576,14 @@ This module provide functions which simplify writing tests for (define-public perl-xml-compile (package (name "perl-xml-compile") - (version "1.51") + (version "1.54") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/" "XML-Compile-" version ".tar.gz")) (sha256 (base32 - "06fj4zf0yh4kf3kx4bhwrmrjr6al40nasasbgfhn8f1zxwkmm8f2")))) + "1hp41960bpqxvv1samv9hc0ghhmvs3i16r4rfl9yp54lp6jhsr2c")))) (build-system perl-build-system) (propagated-inputs `(("perl-log-report" ,perl-log-report) @@ -567,14 +601,14 @@ a schema.") (define-public perl-xml-compile-cache (package (name "perl-xml-compile-cache") - (version "1.04") + (version "1.05") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/" "XML-Compile-Cache-" version ".tar.gz")) (sha256 (base32 - "1689dm54n7wb0n0cl9n77vk0kvg0mcckn2hz9ahigjhvazah8740")))) + "0xbwlszhi9hg8sxm5ylglm2qvnb689i595p913awrj2g4mp9yfsw")))) (build-system perl-build-system) (propagated-inputs `(("perl-log-report" ,perl-log-report) @@ -590,14 +624,14 @@ a schema.") (define-public perl-xml-compile-soap (package (name "perl-xml-compile-soap") - (version "3.13") + (version "3.20") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/" "XML-Compile-SOAP-" version ".tar.gz")) (sha256 (base32 - "08qw63l78040nh37xzapbqp43g6s5l67bvskf3dyyizlarjx5mi4")))) + "0qplb77qr97pc9yis51jmphl9gbq9xyf8abldpxkwvdn6iqlbgx5")))) (build-system perl-build-system) (propagated-inputs `(("perl-file-slurp-tiny" ,perl-file-slurp-tiny) @@ -618,14 +652,14 @@ used.") (define-public perl-xml-compile-wsdl11 (package (name "perl-xml-compile-wsdl11") - (version "3.04") + (version "3.05") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/" "XML-Compile-WSDL11-" version ".tar.gz")) (sha256 (base32 - "0pyikwnfwpangvnkf5dbdagy4z93ag9824f1ax5qaibc3ghca8kv")))) + "1a50in1qrbzx3924wvrhgfm5fcxz5cd95f3z9z2xgln27q1zssc4")))) (build-system perl-build-system) (propagated-inputs `(("perl-log-report" ,perl-log-report) @@ -683,14 +717,14 @@ RSS 0.91, RSS 1.0, RSS 2.0, Atom") (define-public perl-xml-xpath (package (name "perl-xml-xpath") - (version "1.37") + (version "1.40") (source (origin (method url-fetch) (uri (string-append "mirror://cpan/authors/id/M/MA/MANWAR/" "XML-XPath-" version ".tar.gz")) (sha256 (base32 - "0997l8vjgq8p7d1irvp6amqyrv24x7f8hybjm4l4ayag32b13bmq")))) + "07pa0bl42jka8mj7jshjynx8vpfh8b4cdyiv4zlkqvkqz98nzxib")))) (build-system perl-build-system) (native-inputs `(("perl-path-tiny" ,perl-path-tiny))) diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm index 55e3bd0839..1267d3106d 100644 --- a/gnu/packages/xorg.scm +++ b/gnu/packages/xorg.scm @@ -10,6 +10,7 @@ ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 Alex Kost <alezost@gmail.com> ;;; Copyright © 2016 David Craven <david@craven.ch> +;;; Copyright © 2016 John Darrington <jmd@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -335,6 +336,44 @@ provided.") "See 'dri3proto.h' in the distribution.")))) +(define-public editres + (package + (name "editres") + (version "1.0.6") + (source + (origin + (method url-fetch) + (uri (string-append + "mirror://xorg/individual/app/" name "-" + version + ".tar.bz2")) + (sha256 + (base32 + "1w2d5hb5pw9ii2jlf4yjlp899402zfwc8hdkpdr3i1fy1cjd2riv")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags + (list (string-append "--with-appdefaultdir=" + %output "/lib/X11/app-defaults")))) + (inputs + `(("libxaw" ,libxaw) + ("libxmu" ,libxmu) + ("libxt" ,libxt))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "https://www.x.org/wiki/") + (synopsis "Tool to browse and edit X Toolkit resource specifications") + (description + "Editres is a tool that allows users and application developers to view +the full widget hierarchy of any X Toolkit application that speaks the Editres +protocol. In addition, editres will help the user construct resource +specifications, allow the user to apply the resource to the application and +view the results dynamically. Once the user is happy with a resource +specification editres will append the resource string to the user's X +Resources file.") + (license license:x11))) + + (define-public encodings (package (name "encodings") @@ -2360,7 +2399,7 @@ XC-APPGROUP, XTEST.") (define-public libevdev (package (name "libevdev") - (version "1.3") + (version "1.5.5") (source (origin (method url-fetch) @@ -2368,10 +2407,10 @@ XC-APPGROUP, XTEST.") name "-" version ".tar.xz")) (sha256 (base32 - "0iil4pnla0kjdx52ay7igq65sx32sjbzn1wx9q3v74m5g7712m16")))) + "1cc00876lqvyadsfmj3sh1h2i0r3qfar98izdfar5f8q41w2009j")))) (build-system gnu-build-system) (native-inputs `(("python" ,python))) - (home-page "http://www.freedesktop.org/wiki/Software/libevdev/") + (home-page "https://www.freedesktop.org/wiki/Software/libevdev/") (synopsis "Wrapper library for evdev devices") (description "libevdev is a wrapper library for evdev devices. it moves the common @@ -2386,7 +2425,7 @@ devices, thus making direct access unnecessary.") (define-public xf86-input-evdev (package (name "xf86-input-evdev") - (version "2.10.3") + (version "2.10.4") (source (origin (method url-fetch) @@ -2396,7 +2435,7 @@ devices, thus making direct access unnecessary.") ".tar.bz2")) (sha256 (base32 - "18ijnclnylrr7vkvflalkw4bqfily3scg6baczjjgycdpsj1p8js")))) + "1hhc97k1qmgs85fp8p2i3gq4p18azlczbvklv33w19p1phzs1xmv")))) (build-system gnu-build-system) (inputs `(("udev" ,eudev) @@ -2420,7 +2459,7 @@ including most mice, keyboards, tablets and touchscreens.") (define-public xf86-input-libinput (package (name "xf86-input-libinput") - (version "0.16.0") + (version "0.23.0") (source (origin (method url-fetch) (uri (string-append @@ -2428,7 +2467,7 @@ including most mice, keyboards, tablets and touchscreens.") name "-" version ".tar.bz2")) (sha256 (base32 - "0jbgnxsbr3g4g9vkspcc6pqy7av59zx5bb78vkvaqy8yx4qybbgx")))) + "1p596v3kbmjpdz3kz8z19bnd79l860f1pbwjvma7bz7qx3gynlqb")))) (build-system gnu-build-system) (arguments '(#:configure-flags @@ -2450,7 +2489,7 @@ provide all features that libinput supports it does little beyond.") (define-public xf86-input-joystick (package (name "xf86-input-joystick") - (version "1.6.2") + (version "1.6.3") (source (origin (method url-fetch) @@ -2460,7 +2499,7 @@ provide all features that libinput supports it does little beyond.") ".tar.bz2")) (sha256 (base32 - "038mfqairyyqvz02rk7v3i070sab1wr0k6fkxvyvxdgkfbnqcfzf")))) + "1awfq496d082brgjbr60lhm6jvr9537rflwxqdfqwfzjy3n6jxly")))) (build-system gnu-build-system) (inputs `(("xorg-server" ,xorg-server))) (native-inputs `(("pkg-config" ,pkg-config))) @@ -2480,7 +2519,7 @@ It is used to cotrol the pointer with a joystick device.") (define-public xf86-input-keyboard (package (name "xf86-input-keyboard") - (version "1.8.1") + (version "1.9.0") (source (origin (method url-fetch) @@ -2490,7 +2529,7 @@ It is used to cotrol the pointer with a joystick device.") ".tar.bz2")) (sha256 (base32 - "04d27kwqq03fc26an6051hs3i0bff8albhnngzyd59wxpwwzzj0s")))) + "12032yg412kyvnmc5fha1in7mpi651d8sa1bk4138s2j2zr01jgp")))) (build-system gnu-build-system) (inputs `(("xorg-server" ,xorg-server))) (native-inputs `(("pkg-config" ,pkg-config))) @@ -2504,7 +2543,7 @@ It is used to cotrol the pointer with a joystick device.") (define-public xf86-input-mouse (package (name "xf86-input-mouse") - (version "1.9.1") + (version "1.9.2") (source (origin (method url-fetch) @@ -2514,7 +2553,7 @@ It is used to cotrol the pointer with a joystick device.") ".tar.bz2")) (sha256 (base32 - "1kn5kx3qyn9qqvd6s24a2l1wfgck2pgfvzl90xpl024wfxsx719l")))) + "0bsbgww9421792zan43j60mndqprhfxhc48agsi15d3abjqda9gl")))) (build-system gnu-build-system) (inputs `(("xorg-server" ,xorg-server))) (native-inputs `(("pkg-config" ,pkg-config))) @@ -2536,7 +2575,7 @@ as USB mice.") (define-public xf86-input-synaptics (package (name "xf86-input-synaptics") - (version "1.8.99.1") + (version "1.9.0") (source (origin (method url-fetch) @@ -2546,7 +2585,7 @@ as USB mice.") ".tar.bz2")) (sha256 (base32 - "1apbcwn20p7sy07ghlldmqcnxag2r9sdjqmb4xxzki0hz8wm72ac")))) + "0niv0w1czbxh4y3qkqbpdp5gjwhp3379inwhknhif0m4sy4k5fmg")))) (build-system gnu-build-system) (inputs `(("libx11" ,libx11) ("libxi" ,libxi) @@ -2648,7 +2687,7 @@ as USB mice.") (define-public xf86-video-ati (package (name "xf86-video-ati") - (version "7.7.0") + (version "7.8.0") (source (origin (method url-fetch) @@ -2658,7 +2697,7 @@ as USB mice.") ".tar.bz2")) (sha256 (base32 - "1hy1n8an98mflfbdcb3q7wv59x971j7nf9zhivf90p0lgdbiqkc4")))) + "1ynnm4v4261xmg94b7jam9hjyym4n2nqba23rv23v3wjfbkms7s0")))) (build-system gnu-build-system) (inputs `(("mesa" ,mesa) ("xxf86driproto" ,xf86driproto) @@ -3050,7 +3089,7 @@ supported, and the RENDER extension is not accelerated by this driver.") (define-public xf86-video-nouveau (package (name "xf86-video-nouveau") - (version "1.0.12") + (version "1.0.13") (source (origin (method url-fetch) @@ -3060,7 +3099,7 @@ supported, and the RENDER extension is not accelerated by this driver.") ".tar.bz2")) (sha256 (base32 - "07irv1zkk0rkyn1d7f2gn1icgcz2ix0pwv74sjian763gynmg80f")))) + "1js7vak68g2800f1cy5r41wl5x2j7dbmbd7zxypzfgcw2fx454kd")))) (build-system gnu-build-system) (inputs `(("xorg-server" ,xorg-server))) (native-inputs `(("pkg-config" ,pkg-config))) @@ -3106,7 +3145,7 @@ UniChrome Pro and Chrome9 integrated graphics processors.") (define-public xf86-video-qxl (package (name "xf86-video-qxl") - (version "0.1.4") + (version "0.1.5") (source (origin (method url-fetch) (uri (string-append @@ -3114,7 +3153,7 @@ UniChrome Pro and Chrome9 integrated graphics processors.") "xf86-video-qxl-" version ".tar.bz2")) (sha256 (base32 - "018ic9ddxfnjcv2yss0mwk1gq6rmip1hrgi2wxwqkbqx1cpx4yp5")))) + "14jc24znnahhmz4kqalafmllsg8awlz0y6gpgdpk5ih38ph851mi")))) (build-system gnu-build-system) (inputs `(("fontsproto" ,fontsproto) @@ -3397,7 +3436,7 @@ X server.") (define-public xf86-video-vmware (package (name "xf86-video-vmware") - (version "13.1.0") + (version "13.2.1") (source (origin (method url-fetch) @@ -3407,14 +3446,16 @@ X server.") ".tar.bz2")) (sha256 (base32 - "1k50whwnkzxam2ihc1sw456dx0pvr76naycm4qhyjxqv9d72879w")))) + "0azn3g0vcki47n5jddagk2rmbwdvp845k8p7d2r56zxs3w8ggxz2")))) (build-system gnu-build-system) - (inputs `(("libx11" ,libx11) - ("libxext" ,libxext) - ("mesa" ,mesa) ; for xatracker - ("xorg-server" ,xorg-server))) + (inputs + `(("libx11" ,libx11) + ("libxext" ,libxext) + ("mesa" ,mesa) ; for xatracker + ("xorg-server" ,xorg-server))) (native-inputs - `(("pkg-config" ,pkg-config))) + `(("eudev" ,eudev) + ("pkg-config" ,pkg-config))) (home-page "https://www.x.org/wiki/") (synopsis "VMware SVGA video driver for X server") (description @@ -4847,7 +4888,7 @@ an X Window System display.") (define-public libxfont (package (name "libxfont") - (version "1.5.1") + (version "1.5.2") (source (origin (method url-fetch) @@ -4857,7 +4898,7 @@ an X Window System display.") ".tar.bz2")) (sha256 (base32 - "1630v3sfvwwlimb2ja10c84ql6v1mw9bdfhvan7pbybkgi99h25p")))) + "0w8d07bkmjiarkx09579bl8zsq903mn8javc7qpi0ix4ink5x502")))) (build-system gnu-build-system) (propagated-inputs `(("fontsproto" ,fontsproto) @@ -4884,7 +4925,7 @@ new API's in libXft, or the legacy API's in libX11.") (define-public libxi (package (name "libxi") - (version "1.7.7") + (version "1.7.8") (source (origin (method url-fetch) @@ -4894,7 +4935,7 @@ new API's in libXft, or the legacy API's in libX11.") ".tar.bz2")) (sha256 (base32 - "0c70n4aq0ba628wr88ih4740nci9d9f6y3v96sx376vvlm7q6vwr")))) + "1fr7mi4nbcxsa88qin9g2ipmzh595ydxy9qnabzl270laf6zmwnq")))) (build-system gnu-build-system) (propagated-inputs `(("inputproto" ,inputproto) @@ -5369,8 +5410,9 @@ The XCB util module provides the following libraries: `(("m4" ,m4) ("pkg-config" ,pkg-config))) (inputs - `(("libxcb" ,libxcb) - ("xcb-util-renderutil" ,xcb-util-renderutil) + `(("libxcb" ,libxcb))) + (propagated-inputs + `(("xcb-util-renderutil" ,xcb-util-renderutil) ("xcb-util-image" ,xcb-util-image))) (home-page "https://cgit.freedesktop.org/xcb/util-cursor/") (synopsis "Port of libxcursor") diff --git a/gnu/packages/zile.scm b/gnu/packages/zile.scm index 13a5440eea..dfa9d7373d 100644 --- a/gnu/packages/zile.scm +++ b/gnu/packages/zile.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012, 2013, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; @@ -21,14 +21,21 @@ (define-module (gnu packages zile) #:use-module (guix licenses) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix packages) + #:use-module (guix utils) #:use-module (guix build-system gnu) + #:use-module (gnu packages autotools) + #:use-module (gnu packages bash) #:use-module (gnu packages bdw-gc) - #:use-module (gnu packages perl) + #:use-module (gnu packages guile) + #:use-module (gnu packages gnupg) + #:use-module (gnu packages m4) #:use-module (gnu packages man) #:use-module (gnu packages ncurses) - #:use-module (gnu packages bash) - #:use-module (gnu packages pkg-config)) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages version-control)) (define-public zile (package @@ -67,3 +74,70 @@ "GNU Zile is a lightweight Emacs clone. It usage is similar to the default Emacs configuration, but it carries a much lighter feature set.") (license gpl3+))) + +(define-public zile-on-guile + ;; This is a fork of Zile that uses Guile, announced here: + ;; <http://lists.gnu.org/archive/html/guile-user/2012-02/msg00033.html>. + (let ((commit "fd097811a60e58696d734c35b0eb7da3afc1adb7") + (revision "0")) + (package + (inherit zile) + (name "zile-on-guile") + (version (string-append (package-version zile) + "-" revision "." + (string-take commit 7))) + (home-page "https://github.com/spk121/zile") + (source (origin + (method git-fetch) + (uri (git-reference + (url home-page) + (commit commit) + (recursive? #t))) ;for the Gnulib sub-module + (sha256 + (base32 + "0wlli8hqal9ikmbl3a49kyhzyf164jk6mdbir3bclq2gxszs532d")) + (file-name (string-append name "-" version "-checkout")))) + (inputs + `(("guile" ,guile-2.0) + ,@(package-inputs zile))) + (native-inputs + `(("m4" ,m4) ;for 'bootstrap' + ("autoconf" ,(autoconf-wrapper)) + ("automake" ,automake) + + ;; For some reason, 'bootstrap' insists on having these. + ("git" ,git) + ("gpg" ,gnupg) + + ,@(package-native-inputs zile))) + (arguments + (substitute-keyword-arguments (package-arguments zile) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'bootstrap + (lambda _ + ;; Make sure all the files are writable so that ./bootstrap + ;; can proceed. + (for-each (lambda (file) + (chmod file #o755)) + (find-files ".")) + (patch-shebang "gnulib/gnulib-tool") + (zero? (system* "sh" "./bootstrap" + "--gnulib-srcdir=gnulib" + "--skip-git" "--skip-po" + "--verbose")))) + (add-after 'install 'wrap-command + (lambda* (#:key outputs #:allow-other-keys) + ;; Add zile.scm to the search path. + (let* ((out (assoc-ref outputs "out")) + (scheme (dirname + (car (find-files out "^zile\\.scm$"))))) + (wrap-program (string-append out "/bin/zile-on-guile") + `("GUILE_LOAD_PATH" ":" prefix (,scheme))) + #t))))))) + (synopsis "Lightweight clone of the Emacs editor using Guile") + (description + "GNU Zile is a lightweight clone of the Emacs editor, and Zile-on-Guile +is a variant of Zile that can be extended in Guile Scheme. Hitting +@kbd{M-C} (or: @kbd{Alt} and @kbd{C}) brings up a Guile REPL from which +interactive functions akin to those of Emacs can be invoked.")))) diff --git a/gnu/packages/zip.scm b/gnu/packages/zip.scm index c9fb70c031..2cf30d6e32 100644 --- a/gnu/packages/zip.scm +++ b/gnu/packages/zip.scm @@ -156,7 +156,7 @@ recreates the stored directory structure by default.") (define-public perl-zip (package (name "perl-zip") - (version "1.30") + (version "1.59") (source (origin (method url-fetch) @@ -165,7 +165,7 @@ recreates the stored directory structure by default.") version ".tar.gz")) (sha256 (base32 - "0633zah5z9njiqnvy3vh42fjymncmil1jdfb7d18w8xpfzzp5d7q")))) + "0m31qlppg65vh32pwxkwjby02q70abx49d2yk6vfd4585fqb27cx")))) (build-system perl-build-system) (synopsis "Provides an interface to ZIP archive files") (description "The Archive::Zip module allows a Perl program to create, diff --git a/gnu/services.scm b/gnu/services.scm index 693a7f8001..03112f7515 100644 --- a/gnu/services.scm +++ b/gnu/services.scm @@ -338,12 +338,14 @@ ACTIVATION-SCRIPT-TYPE." (activate-/bin/sh (string-append #$(canonical-package bash) "/bin/sh")) + ;; Set up /run/current-system. Among other things this + ;; sets up locales, which the activation snippets + ;; executed below may expect. + (activate-current-system) + ;; Run the services' activation snippets. ;; TODO: Use 'load-compiled'. - (for-each primitive-load '#$actions) - - ;; Set up /run/current-system. - (activate-current-system)))))) + (for-each primitive-load '#$actions)))))) (define (gexps->activation-gexp gexps) "Return a gexp that runs the activation script containing GEXPS." diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm index d8086b78d4..deaf677bd9 100644 --- a/gnu/services/admin.scm +++ b/gnu/services/admin.scm @@ -58,8 +58,8 @@ } ")) -(define (simple-rotation-config file) - (string-append file " { +(define (simple-rotation-config files) + #~(string-append #$(string-join files ",") " { sharedscripts } ")) @@ -72,7 +72,8 @@ (display #$(syslog-rotation-config %rotated-files) port) (display #$(simple-rotation-config - "/var/log/shepherd.log") + '("/var/log/shepherd.log" + "/var/log/guix-daemon.log")) port))))))) (define (default-jobs rottlog) diff --git a/gnu/services/avahi.scm b/gnu/services/avahi.scm index 60e9e61f94..29720415fc 100644 --- a/gnu/services/avahi.scm +++ b/gnu/services/avahi.scm @@ -107,7 +107,7 @@ (requirement '(dbus-system networking)) (start #~(make-forkexec-constructor - (list (string-append #$avahi "/sbin/avahi-daemon") + (list #$(file-append avahi "/sbin/avahi-daemon") "--daemonize" #$@(if debug? #~("--debug") #~()) "-f" #$config) diff --git a/gnu/services/base.scm b/gnu/services/base.scm index afbecdb47e..1b1ce0d5e8 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -37,7 +37,6 @@ #:use-module ((gnu packages base) #:select (canonical-package glibc)) #:use-module (gnu packages package-management) - #:use-module (gnu packages ssh) #:use-module (gnu packages lsof) #:use-module (gnu packages terminals) #:use-module ((gnu build file-systems) @@ -252,6 +251,8 @@ FILE-SYSTEM." (device (file-system-device file-system)) (type (file-system-type file-system)) (title (file-system-title file-system)) + (flags (file-system-flags file-system)) + (options (file-system-options file-system)) (check? (file-system-check? file-system)) (create? (file-system-create-mount-point? file-system)) (dependencies (file-system-dependencies file-system))) @@ -264,35 +265,27 @@ FILE-SYSTEM." ,@(map dependency->shepherd-service-name dependencies))) (documentation "Check, mount, and unmount the given file system.") (start #~(lambda args - ;; FIXME: Use or factorize with 'mount-file-system'. - (let ((device (canonicalize-device-spec #$device '#$title)) - (flags #$(mount-flags->bit-mask - (file-system-flags file-system)))) - #$(if create? - #~(mkdir-p #$target) - #~#t) - #$(if check? - #~(begin - ;; Make sure fsck.ext2 & co. can be found. - (setenv "PATH" - (string-append - #$e2fsprogs "/sbin:" - "/run/current-system/profile/sbin:" - (getenv "PATH"))) - (check-file-system device #$type)) - #~#t) - - (mount device #$target #$type flags - #$(file-system-options file-system)) - - ;; For read-only bind mounts, an extra remount is - ;; needed, as per <http://lwn.net/Articles/281157/>, - ;; which still applies to Linux 4.0. - (when (and (= MS_BIND (logand flags MS_BIND)) - (= MS_RDONLY (logand flags MS_RDONLY))) - (mount device #$target #$type - (logior MS_BIND MS_REMOUNT MS_RDONLY)))) - #t)) + #$(if create? + #~(mkdir-p #$target) + #t) + + (let (($PATH (getenv "PATH"))) + ;; Make sure fsck.ext2 & co. can be found. + (dynamic-wind + (lambda () + (setenv "PATH" + (string-append + #$e2fsprogs "/sbin:" + "/run/current-system/profile/sbin:" + $PATH))) + (lambda () + (mount-file-system + `(#$device #$title #$target #$type #$flags + #$options #$check?) + #:root "/")) + (lambda () + (setenv "PATH" $PATH))) + #t))) (stop #~(lambda args ;; Normally there are no processes left at this point, so ;; TARGET can be safely unmounted. @@ -305,7 +298,7 @@ FILE-SYSTEM." ;; We need an additional module. (modules `(((gnu build file-systems) - #:select (check-file-system canonicalize-device-spec)) + #:select (mount-file-system)) ,@%default-modules))))))) (define file-system-service-type @@ -616,7 +609,7 @@ strings or string-valued gexps." (dup2 (open-fdes #$tty O_RDONLY) 0) (close-fdes 1) (dup2 (open-fdes #$tty O_WRONLY) 1) - (execl (string-append #$kbd "/bin/unicode_start") + (execl #$(file-append kbd "/bin/unicode_start") "unicode_start")) (else (zero? (cdr (waitpid pid)))))))) @@ -629,7 +622,7 @@ strings or string-valued gexps." (documentation (string-append "Load console keymap (loadkeys).")) (provision '(console-keymap)) (start #~(lambda _ - (zero? (system* (string-append #$kbd "/bin/loadkeys") + (zero? (system* #$(file-append kbd "/bin/loadkeys") #$@files)))) (respawn? #f))))) @@ -661,7 +654,7 @@ strings or string-valued gexps." (start #~(lambda _ (and #$(unicode-start device) (zero? - (system* (string-append #$kbd "/bin/setfont") + (system* #$(file-append kbd "/bin/setfont") "-C" #$device #$font))))) (stop #~(const #t)) (respawn? #f))))) @@ -743,7 +736,7 @@ the message of the day, among other things." (requirement '(user-processes host-name udev)) (start #~(make-forkexec-constructor - (list (string-append #$mingetty "/sbin/mingetty") + (list #$(file-append mingetty "/sbin/mingetty") "--noclear" #$tty #$@(if auto-login #~("--autologin" #$auto-login) @@ -878,7 +871,7 @@ the tty to run, among other things." (provision '(nscd)) (requirement '(user-processes)) (start #~(make-forkexec-constructor - (list (string-append #$(nscd-configuration-glibc config) + (list #$(file-append (nscd-configuration-glibc config) "/sbin/nscd") "-f" #$nscd.conf "--foreground") @@ -1064,7 +1057,7 @@ public key, with GUIX." (format #t "registering public key '~a'...~%" key) (close-port (current-input-port)) (dup port 0) - (execl (string-append #$guix "/bin/guix") + (execl #$(file-append guix "/bin/guix") "guix" "archive" "--authorize") (exit 1))) (else @@ -1096,10 +1089,10 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) (default %default-substitute-urls)) (extra-options guix-configuration-extra-options ;list of strings (default '())) + (log-file guix-configuration-log-file ;string + (default "/var/log/guix-daemon.log")) (lsof guix-configuration-lsof ;<package> - (default lsof)) - (lsh guix-configuration-lsh ;<package> - (default lsh))) + (default lsof))) (define %default-guix-configuration (guix-configuration)) @@ -1110,14 +1103,14 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) (($ <guix-configuration> guix build-group build-accounts authorize-key? keys use-substitutes? substitute-urls extra-options - lsof lsh) + log-file lsof) (list (shepherd-service (documentation "Run the Guix daemon.") (provision '(guix-daemon)) (requirement '(user-processes)) (start #~(make-forkexec-constructor - (list (string-append #$guix "/bin/guix-daemon") + (list #$(file-append guix "/bin/guix-daemon") "--build-users-group" #$build-group #$@(if use-substitutes? '() @@ -1125,10 +1118,11 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) "--substitute-urls" #$(string-join substitute-urls) #$@extra-options) - ;; Add 'lsof' (for the GC) and 'lsh' (for offloading) to the - ;; daemon's $PATH. + ;; Add 'lsof' (for the GC) to the daemon's $PATH. #:environment-variables - (list (string-append "PATH=" #$lsof "/bin:" #$lsh "/bin")))) + (list (string-append "PATH=" #$lsof "/bin")) + + #:log-file #$log-file)) (stop #~(make-kill-destructor))))))) (define (guix-accounts config) @@ -1192,7 +1186,7 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) (provision '(guix-publish)) (requirement '(guix-daemon)) (start #~(make-forkexec-constructor - (list (string-append #$guix "/bin/guix") + (list #$(file-append guix "/bin/guix") "publish" "-u" "guix-publish" "-p" #$(number->string port) (string-append "--listen=" #$host)))) @@ -1346,7 +1340,7 @@ item of @var{packages}." ;; The first one is for udev, the second one for eudev. (setenv "UDEV_CONFIG_FILE" #$udev.conf) (setenv "EUDEV_RULES_DIRECTORY" - (string-append #$rules "/lib/udev/rules.d")) + #$(file-append rules "/lib/udev/rules.d")) (let ((pid (primitive-fork))) (case pid @@ -1359,11 +1353,11 @@ item of @var{packages}." (wait-for-udevd) ;; Trigger device node creation. - (system* (string-append #$udev "/bin/udevadm") + (system* #$(file-append udev "/bin/udevadm") "trigger" "--action=add") ;; Wait for things to settle down. - (system* (string-append #$udev "/bin/udevadm") + (system* #$(file-append udev "/bin/udevadm") "settle") pid))))) (stop #~(make-kill-destructor)) @@ -1434,7 +1428,7 @@ extra rules from the packages listed in @var{rules}." ;; 'gpm' runs in the background and sets a PID file. ;; Note that it requires running as "root". (false-if-exception (delete-file "/var/run/gpm.pid")) - (fork+exec-command (list (string-append #$gpm "/sbin/gpm") + (fork+exec-command (list #$(file-append gpm "/sbin/gpm") #$@options)) ;; Wait for the PID file to appear; declare failure if @@ -1449,7 +1443,7 @@ extra rules from the packages listed in @var{rules}." (stop #~(lambda (_) ;; Return #f if successfully stopped. - (not (zero? (system* (string-append #$gpm "/sbin/gpm") + (not (zero? (system* #$(file-append gpm "/sbin/gpm") "-k")))))))))) (define gpm-service-type @@ -1478,7 +1472,7 @@ This service is not part of @var{%base-services}." (default kmscon)) (virtual-terminal kmscon-configuration-virtual-terminal) (login-program kmscon-configuration-login-program - (default #~(string-append #$shadow "/bin/login"))) + (default (file-append shadow "/bin/login"))) (login-arguments kmscon-configuration-login-arguments (default '("-p"))) (hardware-acceleration? kmscon-configuration-hardware-acceleration? @@ -1496,7 +1490,7 @@ This service is not part of @var{%base-services}." (define kmscon-command #~(list - (string-append #$kmscon "/bin/kmscon") "--login" + #$(file-append kmscon "/bin/kmscon") "--login" "--vt" #$virtual-terminal #$@(if hardware-acceleration? '("--hwaccel") '()) "--" #$login-program #$@login-arguments)) diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm index 9f28aabc96..94c5f21557 100644 --- a/gnu/services/configuration.scm +++ b/gnu/services/configuration.scm @@ -30,6 +30,8 @@ configuration-field-name configuration-missing-field configuration-field-error + configuration-field-serializer + configuration-field-getter serialize-configuration define-configuration validate-configuration diff --git a/gnu/services/cuirass.scm b/gnu/services/cuirass.scm new file mode 100644 index 0000000000..c15a846bad --- /dev/null +++ b/gnu/services/cuirass.scm @@ -0,0 +1,141 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org> +;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu services cuirass) + #:use-module (guix gexp) + #:use-module (guix records) + #:use-module (gnu packages admin) + #:autoload (gnu packages ci) (cuirass) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #:use-module (gnu system shadow) + #:export (<cuirass-configuration> + cuirass-configuration + cuirass-configuration? + + cuirass-service-type)) + +;;;; Commentary: +;;; +;;; This module implements a service that to run instances of Cuirass, a +;;; continuous integration tool. +;;; +;;;; Code: + +(define-record-type* <cuirass-configuration> + cuirass-configuration make-cuirass-configuration + cuirass-configuration? + (cuirass cuirass-configuration-cuirass ;package + (default cuirass)) + (log-file cuirass-configuration-log-file ;string + (default "/var/log/cuirass.log")) + (cache-directory cuirass-configuration-cache-directory ;string (dir-name) + (default "/var/cache/cuirass")) + (user cuirass-configuration-user ;string + (default "cuirass")) + (group cuirass-configuration-group ;string + (default "cuirass")) + (interval cuirass-configuration-interval ;integer (seconds) + (default 60)) + (database cuirass-configuration-database ;string (file-name) + (default "/var/run/cuirass/cuirass.db")) + (specifications cuirass-configuration-specifications) + ;gexp that evaluates to specification-alist + (use-substitutes? cuirass-configuration-use-substitutes? ;boolean + (default #f)) + (one-shot? cuirass-configuration-one-shot? ;boolean + (default #f))) + +(define (cuirass-shepherd-service config) + "Return a <shepherd-service> for the Cuirass service with CONFIG." + (and + (cuirass-configuration? config) + (let ((cuirass (cuirass-configuration-cuirass config)) + (cache-directory (cuirass-configuration-cache-directory config)) + (log-file (cuirass-configuration-log-file config)) + (user (cuirass-configuration-user config)) + (group (cuirass-configuration-group config)) + (interval (cuirass-configuration-interval config)) + (database (cuirass-configuration-database config)) + (specs (cuirass-configuration-specifications config)) + (use-substitutes? (cuirass-configuration-use-substitutes? config)) + (one-shot? (cuirass-configuration-one-shot? config))) + (list (shepherd-service + (documentation "Run Cuirass.") + (provision '(cuirass)) + (requirement '(guix-daemon)) + (start #~(make-forkexec-constructor + (list (string-append #$cuirass "/bin/cuirass") + "--cache-directory" #$cache-directory + "--specifications" + #$(scheme-file "cuirass-specs.scm" specs) + "--database" #$database + "--interval" #$(number->string interval) + #$@(if use-substitutes? '("--use-substitutes") '()) + #$@(if one-shot? '("--one-shot") '())) + #:user #$user + #:group #$group + #:log-file #$log-file)) + (stop #~(make-kill-destructor))))))) + +(define (cuirass-account config) + "Return the user accounts and user groups for CONFIG." + (let ((cuirass-user (cuirass-configuration-user config)) + (cuirass-group (cuirass-configuration-group config))) + (list (user-group + (name cuirass-group) + (system? #t)) + (user-account + (name cuirass-user) + (group cuirass-group) + (system? #t) + (comment "Cuirass privilege separation user") + (home-directory (string-append "/var/run/" cuirass-user)) + (shell #~(string-append #$shadow "/sbin/nologin")))))) + +(define (cuirass-activation config) + "Return the activation code for CONFIG." + (let ((cache (cuirass-configuration-cache-directory config)) + (db (dirname (cuirass-configuration-database config))) + (user (cuirass-configuration-user config)) + (group (cuirass-configuration-group config))) + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + + (mkdir-p #$cache) + (mkdir-p #$db) + + (let ((uid (passwd:uid (getpw #$user))) + (gid (group:gid (getgr #$group)))) + (chown #$cache uid gid) + (chown #$db uid gid)))))) + +(define cuirass-service-type + (service-type + (name 'cuirass) + (extensions + (list + (service-extension profile-service-type ;for 'info cuirass' + (compose list cuirass-configuration-cuirass)) + (service-extension activation-service-type cuirass-activation) + (service-extension shepherd-root-service-type cuirass-shepherd-service) + (service-extension account-service-type cuirass-account))))) + diff --git a/gnu/services/cups.scm b/gnu/services/cups.scm index 391046a75f..df1843e438 100644 --- a/gnu/services/cups.scm +++ b/gnu/services/cups.scm @@ -894,7 +894,7 @@ IPP specifications.") (if (file-exists? dst) (format (current-error-port) "warning: ~a exists\n" dst) (symlink src dst)))) - (find-files (string-append package path)))) + (find-files (string-append package path) #:stat stat))) (list #$@paths))) (list #$@packages)) #t)))) diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index 1eed85542b..d88c839f7d 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -48,6 +48,10 @@ postgresql-configuration? (postgresql postgresql-configuration-postgresql ;<package> (default postgresql)) + (port postgresql-configuration-port + (default 5432)) + (locale postgresql-configuration-locale + (default "en_US.utf8")) (config-file postgresql-configuration-file) (data-directory postgresql-configuration-data-directory)) @@ -80,13 +84,18 @@ host all all ::1/128 trust")) (define postgresql-activation (match-lambda - (($ <postgresql-configuration> postgresql config-file data-directory) + (($ <postgresql-configuration> postgresql port locale config-file data-directory) #~(begin (use-modules (guix build utils) (ice-9 match)) (let ((user (getpwnam "postgres")) - (initdb (string-append #$postgresql "/bin/initdb"))) + (initdb (string-append #$postgresql "/bin/initdb")) + (initdb-args + (append + (if #$locale + (list (string-append "--locale=" #$locale)) + '())))) ;; Create db state directory. (mkdir-p #$data-directory) (chown #$data-directory (passwd:uid user) (passwd:gid user)) @@ -101,14 +110,19 @@ host all all ::1/128 trust")) (lambda () (setgid (passwd:gid user)) (setuid (passwd:uid user)) - (primitive-exit (system* initdb "-D" #$data-directory))) + (primitive-exit + (apply system* + initdb + "-D" + #$data-directory + initdb-args))) (lambda () (primitive-exit 1)))) (pid (waitpid pid)))))))) (define postgresql-shepherd-service (match-lambda - (($ <postgresql-configuration> postgresql config-file data-directory) + (($ <postgresql-configuration> postgresql port locale config-file data-directory) (let ((start-script ;; Wrapper script that switches to the 'postgres' user before ;; launching daemon. @@ -121,6 +135,7 @@ host all all ::1/128 trust")) (system* postgres (string-append "--config-file=" #$config-file) + "-p" (number->string #$port) "-D" #$data-directory))))) (list (shepherd-service (provision '(postgres)) @@ -140,6 +155,8 @@ host all all ::1/128 trust")) (const %postgresql-accounts)))))) (define* (postgresql-service #:key (postgresql postgresql) + (port 5432) + (locale "en_US.utf8") (config-file %default-postgres-config) (data-directory "/var/lib/postgresql/data")) "Return a service that runs @var{postgresql}, the PostgreSQL database server. @@ -149,6 +166,8 @@ and stores the database cluster in @var{data-directory}." (service postgresql-service-type (postgresql-configuration (postgresql postgresql) + (port port) + (locale locale) (config-file config-file) (data-directory data-directory)))) @@ -160,7 +179,8 @@ and stores the database cluster in @var{data-directory}." (define-record-type* <mysql-configuration> mysql-configuration make-mysql-configuration mysql-configuration? - (mysql mysql-configuration-mysql (default mariadb))) + (mysql mysql-configuration-mysql (default mariadb)) + (port mysql-configuration-port (default 3306))) (define %mysql-accounts (list (user-group @@ -175,10 +195,11 @@ and stores the database cluster in @var{data-directory}." (define mysql-configuration-file (match-lambda - (($ <mysql-configuration> mysql) - (plain-file "my.cnf" "[mysqld] + (($ <mysql-configuration> mysql port) + (mixed-text-file "my.cnf" "[mysqld] datadir=/var/lib/mysql socket=/run/mysqld/mysqld.sock +port=" (number->string port) " ")))) (define (%mysql-activation config) diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm index 7555780ade..36049587d3 100644 --- a/gnu/services/desktop.scm +++ b/gnu/services/desktop.scm @@ -40,6 +40,7 @@ #:use-module (gnu packages xdisorg) #:use-module (gnu packages suckless) #:use-module (gnu packages linux) + #:use-module (gnu packages libusb) #:use-module (guix records) #:use-module (guix packages) #:use-module (guix store) @@ -753,6 +754,10 @@ with the administrator's password." (screen-locker-service slock) (screen-locker-service xlockmore "xlock") + ;; Add udev rules for MTP devices so that non-root users can access + ;; them. + (simple-service 'mtp udev-service-type (list libmtp)) + ;; The D-Bus clique. (avahi-service) (wicd-service) diff --git a/gnu/services/kerberos.scm b/gnu/services/kerberos.scm index a56f63082c..cb33a7c53d 100644 --- a/gnu/services/kerberos.scm +++ b/gnu/services/kerberos.scm @@ -17,14 +17,388 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu services kerberos) - #:use-module (gnu packages admin) #:use-module (gnu services) + #:use-module (gnu services configuration) #:use-module (gnu system pam) #:use-module (guix gexp) #:use-module (guix records) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-35) + #:use-module (ice-9 match) #:export (pam-krb5-configuration pam-krb5-configuration? - pam-krb5-service-type)) + pam-krb5-service-type + + krb5-realm + krb5-realm? + + krb5-configuration + krb5-configuration? + krb5-service-type)) + + + +(define unset-field (list 'unset-field)) + +(define (predicate/unset pred) + (lambda (x) (or (eq? x unset-field) (pred x)))) + +(define string/unset? (predicate/unset string?)) +(define boolean/unset? (predicate/unset boolean?)) +(define integer/unset? (predicate/unset integer?)) + +(define (uglify-field-name field-name) + "Return FIELD-NAME with all instances of '-' replaced by '_' and any +trailing '?' removed." + (let ((str (symbol->string field-name))) + (string-join (string-split (if (string-suffix? "?" str) + (substring str 0 (1- (string-length str))) + str) + #\-) + "_"))) + +(define (serialize-field* field-name val) + (format #t "~a = ~a\n" (uglify-field-name field-name) val)) + +(define (serialize-string/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name val))) + +(define (serialize-integer/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name val))) + +(define (serialize-boolean/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name + (if val "true" "false")))) + + +;; An end-point is an address such as "192.168.0.1" +;; or an address port pair ("foobar.example.com" . 109) +(define (end-point? val) + (match val + ((? string?) #t) + (((? string?) . (? integer?)) #t) + (_ #f))) + +(define (serialize-end-point field-name val) + (serialize-field* field-name + (match val + ((host . port) + ;; The [] are needed in the case of IPv6 addresses + (format #f "[~a]:~a" host port)) + (host + (format #f "~a" host))))) + +(define (serialize-space-separated-string-list/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name (string-join val " ")))) + +(define space-separated-string-list/unset? + (predicate/unset space-separated-string-list?)) + +(define comma-separated-integer-list/unset? + (predicate/unset (lambda (val) + (and (list? val) + (and-map (lambda (x) (integer? x)) + val))))) + +(define (serialize-comma-separated-integer-list/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name + (string-drop ; Drop the leading comma + (fold + (lambda (i prev) + (string-append prev "," (number->string i))) + "" val) 1)))) + +(define file-name? (predicate/unset + (lambda (val) + (string-prefix? "/" val)))) + +(define (serialize-file-name field-name val) + (unless (eq? val unset-field) + (serialize-string field-name val))) + +(define (non-negative-integer? val) + (and (exact-integer? val) (not (negative? val)))) + +(define (serialize-non-negative-integer/unset field-name val) + (unless (eq? val unset-field) + (serialize-field* field-name val))) + +(define (free-form-fields? val) + (match val + (() #t) + ((((? symbol?) . (? string)) . val) (free-form-fields? val)) + (_ #f))) + +(define (serialize-free-form-fields field-name val) + (for-each (match-lambda ((k . v) (serialize-field* k v))) val)) + +(define non-negative-integer/unset? (predicate/unset non-negative-integer?)) + +(define (realm-list? val) + (and (list? val) + (and-map (lambda (x) (krb5-realm? x)) val))) + +(define (serialize-realm-list field-name val) + (format #t "\n[~a]\n" field-name) + (for-each (lambda (realm) + (format #t "\n~a = {\n" (krb5-realm-name realm)) + (for-each (lambda (field) + (unless (eq? 'name (configuration-field-name field)) + ((configuration-field-serializer field) + (configuration-field-name field) + ((configuration-field-getter field) + realm)))) krb5-realm-fields) + + (format #t "}\n")) val)) + + + +;; For a more detailed explanation of these fields see man 5 krb5.conf +(define-configuration krb5-realm + (name + (string/unset unset-field) + "The name of the realm.") + + (kdc + (end-point unset-field) + "The host and port on which the realm's Key Distribution Server listens.") + + (admin-server + (string/unset unset-field) + "The Host running the administration server for the realm.") + + (master-kdc + (string/unset unset-field) + "If an attempt to get credentials fails because of an invalid password, +the client software will attempt to contact the master KDC.") + + (kpasswd-server + (string/unset unset-field) + "The server where password changes are performed.") + + (auth-to-local + (free-form-fields '()) + "Rules to map between principals and local users.") + + (auth-to-local-names + (free-form-fields '()) + "Explicit mappings between principal names and local user names.") + + (http-anchors + (free-form-fields '()) + "Useful only when http proxy is used to access KDC or KPASSWD.") + + ;; The following are useful only for working with V4 services + (default-domain + (string/unset unset-field) + "The domain used to expand host names when translating Kerberos 4 service +principals to Kerberos 5 principals") + + (v4-instance-convert + (free-form-fields '()) + "Exceptions to the default-domain mapping rule.") + + (v4-realm + (string/unset unset-field) + "Used when the V4 realm name and the V5 realm name are not the same, but +still share the same principal names and passwords")) + + + +;; For a more detailed explanation of these fields see man 5 krb5.conf +(define-configuration krb5-configuration + (allow-weak-crypto? + (boolean/unset unset-field) + "If true, permits access to services which only offer weak encryption.") + + (ap-req-checksum-type + (non-negative-integer/unset unset-field) + "The type of the AP-REQ checksum.") + + (canonicalize? + (boolean/unset unset-field) + "Should principals in initial ticket requests be canonicalized?") + + (ccache-type + (non-negative-integer/unset unset-field) + "The format of the credential cache type.") + + (clockskew + (non-negative-integer/unset unset-field) + "Maximum allowable clock skew in seconds (default 300).") + + (default-ccache-name + (file-name unset-field) + "The name of the default credential cache.") + + (default-client-keytab-name + (file-name unset-field) + "The name of the default keytab for client credentials.") + + (default-keytab-name + (file-name unset-field) + "The name of the default keytab file.") + + (default-realm + (string/unset unset-field) + "The realm to be accessed if not explicitly specified by clients.") + + (default-tgs-enctypes + (free-form-fields '()) + "Session key encryption types when making TGS-REQ requests.") + + (default-tkt-enctypes + (free-form-fields '()) + "Session key encryption types when making AS-REQ requests.") + + (dns-canonicalize-hostname? + (boolean/unset unset-field) + "Whether name lookups will be used to canonicalize host names for use in +service principal names.") + + (dns-lookup-kdc? + (boolean/unset unset-field) + "Should DNS SRV records should be used to locate the KDCs and other servers +not appearing in the realm specification") + + (err-fmt + (string/unset unset-field) + "Custom error message formatting. If not #f error messages will be formatted +by substituting a normal error message for %M and an error code for %C in the +value.") + + (forwardable? + (boolean/unset unset-field) + "Should initial tickets be forwardable by default?") + + (ignore-acceptor-hostname? + (boolean/unset unset-field) + "When accepting GSSAPI or krb5 security contexts for host-based service +principals, ignore any hostname passed by the calling application, and allow +clients to authenticate to any service principal in the keytab matching the +service name and realm name.") + + (k5login-authoritative? + (boolean/unset unset-field) + "If this flag is true, principals must be listed in a local user's k5login +file to be granted login access, if a ~/.k5login file exists.") + + (k5login-directory + (string/unset unset-field) + "If not #f, the library will look for a local user's @file{k5login} file +within the named directory (instead of the user's home directory), with a +file name corresponding to the local user name.") + + (kcm-mach-service + (string/unset unset-field) + "The name of the bootstrap service used to contact the KCM daemon for the +KCM credential cache type.") + + (kcm-socket + (file-name unset-field) + "Path to the Unix domain socket used to access the KCM daemon for the KCM +credential cache type.") + + (kdc-default-options + (non-negative-integer/unset unset-field) + "Default KDC options (logored for multiple values) when requesting initial +tickets.") + + (kdc-timesync + (non-negative-integer/unset unset-field) + "Attempt to compensate for clock skew between the KDC and client.") + + (kdc-req-checksum-type + (non-negative-integer/unset unset-field) + "The type of checksum to use for the KDC requests. Relevant only for DES +keys") + + (noaddresses? + (boolean/unset unset-field) + "If true, initial ticket requests will not be made with address restrictions. +This enables their use across NATs.") + + (permitted-enctypes + (space-separated-string-list/unset unset-field) + "All encryption types that are permitted for use in session key encryption.") + + (plugin-base-dir + (file-name unset-field) + "The directory where krb5 plugins are located.") + + (preferred-preauth-types + (comma-separated-integer-list/unset unset-field) + "The preferred pre-authentication types which the client will attempt before +others.") + + (proxiable? + (boolean/unset unset-field) + "Should initial tickets be proxiable by default?") + + (rdns? + (boolean/unset unset-field) + "Should reverse DNS lookup be used in addition to forward name lookup to +canonicalize host names for use in service principal names.") + + (realm-try-domains + (integer/unset unset-field) + "Should a host's domain components should be used to determine the Kerberos +realm of the host.") + + (renew-lifetime + (non-negative-integer/unset unset-field) + "The default renewable lifetime for initial ticket requests.") + + (safe-checksum-type + (non-negative-integer/unset unset-field) + "The type of checksum to use for the KRB-SAFE requests.") + + (ticket-lifetime + (non-negative-integer/unset unset-field) + "The default lifetime for initial ticket requests.") + + (udp-preference-limit + (non-negative-integer/unset unset-field) + "When sending messages to the KDC, the library will try using TCP +before UDP if the size of the message greater than this limit.") + + (verify-ap-rereq-nofail? + (boolean/unset unset-field) + "If true, then attempts to verify initial credentials will fail if the client +machine does not have a keytab.") + + (realms + (realm-list '()) + "The list of realms which clients may access.")) + + +(define (krb5-configuration-file config) + "Create a Kerberos 5 configuration file based on CONFIG" + (mixed-text-file "krb5.conf" + "[libdefaults]\n\n" + (with-output-to-string + (lambda () + (serialize-configuration config + krb5-configuration-fields))))) + +(define (krb5-etc-service config) + (list `("krb5.conf" ,(krb5-configuration-file config)))) + + +(define krb5-service-type + (service-type (name 'krb5) + (extensions + (list (service-extension etc-service-type + krb5-etc-service))))) + + + (define-record-type* <pam-krb5-configuration> pam-krb5-configuration make-pam-krb5-configuration diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index bbb9053008..d672ecf687 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -467,6 +467,9 @@ HiddenServicePort ~a ~a~%" (chown "/var/lib/tor" (passwd:uid %user) (passwd:gid %user)) (chmod "/var/lib/tor" #o700) + ;; Make sure /var/lib is accessible to the 'tor' user. + (chmod "/var/lib" #o755) + (for-each initialize '#$(map hidden-service-name (tor-configuration-hidden-services config))))) diff --git a/gnu/services/sddm.scm b/gnu/services/sddm.scm index 5bb58bd6f0..2ebfe22016 100644 --- a/gnu/services/sddm.scm +++ b/gnu/services/sddm.scm @@ -220,7 +220,7 @@ Relogin=" (if (sddm-configuration-relogin? config) (name "sddm-greeter") (auth (list - ;; Load environment form /etc/environment and ~/.pam_environment + ;; Load environment from /etc/environment and ~/.pam_environment (pam-entry (control "required") (module "pam_env.so")) diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm index 3273184b9a..d8d5006abf 100644 --- a/gnu/services/shepherd.scm +++ b/gnu/services/shepherd.scm @@ -82,7 +82,7 @@ (loop (+ 1 fd)))) ;; Start shepherd. - (execl (string-append #$shepherd "/bin/shepherd") + (execl #$(file-append shepherd "/bin/shepherd") "shepherd" "--config" #$shepherd-conf))))) (define shepherd-root-service-type diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 59e1e54e04..db895405a2 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -27,11 +27,12 @@ #:use-module (gnu packages web) #:use-module (guix records) #:use-module (guix gexp) + #:use-module (srfi srfi-1) #:use-module (ice-9 match) #:export (nginx-configuration nginx-configuration? - nginx-vhost-configuration - nginx-vhost-configuration? + nginx-server-configuration + nginx-server-configuration? nginx-service nginx-service-type)) @@ -41,24 +42,24 @@ ;;; ;;; Code: -(define-record-type* <nginx-vhost-configuration> - nginx-vhost-configuration make-nginx-vhost-configuration - nginx-vhost-configuration? - (http-port nginx-vhost-configuration-http-port +(define-record-type* <nginx-server-configuration> + nginx-server-configuration make-nginx-server-configuration + nginx-server-configuration? + (http-port nginx-server-configuration-http-port (default 80)) - (https-port nginx-vhost-configuration-https-port + (https-port nginx-server-configuration-https-port (default 443)) - (server-name nginx-vhost-configuration-server-name + (server-name nginx-server-configuration-server-name (default (list 'default))) - (root nginx-vhost-configuration-root + (root nginx-server-configuration-root (default "/srv/http")) - (index nginx-vhost-configuration-index + (index nginx-server-configuration-index (default (list "index.html"))) - (ssl-certificate nginx-vhost-configuration-ssl-certificate + (ssl-certificate nginx-server-configuration-ssl-certificate (default "/etc/nginx/cert.pem")) - (ssl-certificate-key nginx-vhost-configuration-ssl-certificate-key + (ssl-certificate-key nginx-server-configuration-ssl-certificate-key (default "/etc/nginx/key.pem")) - (server-tokens? nginx-vhost-configuration-server-tokens? + (server-tokens? nginx-server-configuration-server-tokens? (default #f))) (define-record-type* <nginx-configuration> @@ -67,56 +68,57 @@ (nginx nginx-configuration-nginx) ;<package> (log-directory nginx-configuration-log-directory) ;string (run-directory nginx-configuration-run-directory) ;string + (server-blocks nginx-configuration-server-blocks) ;list (file nginx-configuration-file)) ;string | file-like (define (config-domain-strings names) "Return a string denoting the nginx config representation of NAMES, a list of domain names." - (string-concatenate + (string-join (map (match-lambda - ('default "_") - ((? string? str) str)) + ('default "_ ") + ((? string? str) (string-append str " "))) names))) (define (config-index-strings names) "Return a string denoting the nginx config representation of NAMES, a list of index files." - (string-concatenate + (string-join (map (match-lambda - ((? string? str) str)) + ((? string? str) (string-append str " "))) names))) -(define (default-nginx-vhost-config vhost) +(define (default-nginx-server-config server) (string-append " server {\n" - (if (nginx-vhost-configuration-http-port vhost) + (if (nginx-server-configuration-http-port server) (string-append " listen " - (number->string (nginx-vhost-configuration-http-port vhost)) + (number->string (nginx-server-configuration-http-port server)) ";\n") "") - (if (nginx-vhost-configuration-https-port vhost) + (if (nginx-server-configuration-https-port server) (string-append " listen " - (number->string (nginx-vhost-configuration-https-port vhost)) + (number->string (nginx-server-configuration-https-port server)) " ssl;\n") "") " server_name " (config-domain-strings - (nginx-vhost-configuration-server-name vhost)) + (nginx-server-configuration-server-name server)) ";\n" - (if (nginx-vhost-configuration-ssl-certificate vhost) + (if (nginx-server-configuration-ssl-certificate server) (string-append " ssl_certificate " - (nginx-vhost-configuration-ssl-certificate vhost) ";\n") + (nginx-server-configuration-ssl-certificate server) ";\n") "") - (if (nginx-vhost-configuration-ssl-certificate-key vhost) + (if (nginx-server-configuration-ssl-certificate-key server) (string-append " ssl_certificate_key " - (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n") + (nginx-server-configuration-ssl-certificate-key server) ";\n") "") - " root " (nginx-vhost-configuration-root vhost) ";\n" - " index " (config-index-strings (nginx-vhost-configuration-index vhost)) ";\n" - " server_tokens " (if (nginx-vhost-configuration-server-tokens? vhost) + " root " (nginx-server-configuration-root server) ";\n" + " index " (config-index-strings (nginx-server-configuration-index server)) ";\n" + " server_tokens " (if (nginx-server-configuration-server-tokens? server) "on" "off") ";\n" " }\n")) -(define (default-nginx-config log-directory run-directory vhost-list) +(define (default-nginx-config log-directory run-directory server-list) (plain-file "nginx.conf" (string-append "user nginx nginx;\n" @@ -129,7 +131,7 @@ of index files." " uwsgi_temp_path " run-directory "/uwsgi_temp;\n" " scgi_temp_path " run-directory "/scgi_temp;\n" " access_log " log-directory "/access.log;\n" - (let ((http (map default-nginx-vhost-config vhost-list))) + (let ((http (map default-nginx-server-config server-list))) (do ((http http (cdr http)) (block "" (string-append (car http) "\n" block ))) ((null? http) block))) @@ -148,7 +150,8 @@ of index files." (define nginx-activation (match-lambda - (($ <nginx-configuration> nginx log-directory run-directory config-file) + (($ <nginx-configuration> nginx log-directory run-directory server-blocks + config-file) #~(begin (use-modules (guix build utils)) @@ -164,17 +167,25 @@ of index files." (mkdir-p (string-append #$run-directory "/scgi_temp")) ;; Check configuration file syntax. (system* (string-append #$nginx "/sbin/nginx") - "-c" #$config-file "-t"))))) + "-c" #$(or config-file + (default-nginx-config log-directory + run-directory server-blocks)) + "-t"))))) (define nginx-shepherd-service (match-lambda - (($ <nginx-configuration> nginx log-directory run-directory config-file) + (($ <nginx-configuration> nginx log-directory run-directory server-blocks + config-file) (let* ((nginx-binary (file-append nginx "/sbin/nginx")) (nginx-action (lambda args #~(lambda _ (zero? - (system* #$nginx-binary "-c" #$config-file #$@args)))))) + (system* #$nginx-binary "-c" + #$(or config-file + (default-nginx-config log-directory + run-directory server-blocks)) + #$@args)))))) ;; TODO: Add 'reload' action. (list (shepherd-service @@ -192,14 +203,20 @@ of index files." (service-extension activation-service-type nginx-activation) (service-extension account-service-type - (const %nginx-accounts)))))) + (const %nginx-accounts)))) + (compose concatenate) + (extend (lambda (config servers) + (nginx-configuration + (inherit config) + (server-blocks + (append (nginx-configuration-server-blocks config) + servers))))))) (define* (nginx-service #:key (nginx nginx) (log-directory "/var/log/nginx") (run-directory "/var/run/nginx") - (vhost-list (list (nginx-vhost-configuration))) - (config-file - (default-nginx-config log-directory run-directory vhost-list))) + (server-list '()) + (config-file #f)) "Return a service that runs NGINX, the nginx web server. The nginx daemon loads its runtime configuration from CONFIG-FILE, stores log @@ -209,4 +226,5 @@ files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY." (nginx nginx) (log-directory log-directory) (run-directory run-directory) + (server-blocks server-list) (file config-file)))) diff --git a/gnu/system/examples/desktop.tmpl b/gnu/system/examples/desktop.tmpl index 82687e740b..21b4563b53 100644 --- a/gnu/system/examples/desktop.tmpl +++ b/gnu/system/examples/desktop.tmpl @@ -4,7 +4,7 @@ (use-modules (gnu) (gnu system nss)) (use-service-modules desktop) -(use-package-modules certs) +(use-package-modules certs gnome) (operating-system (host-name "antelope") @@ -42,6 +42,7 @@ ;; This is where we specify system-wide packages. (packages (cons* nss-certs ;for HTTPS access + gvfs ;for user mounts %base-packages)) ;; Add GNOME and/or Xfce---we can choose at the log-in diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm index 4657b06b5f..067b291a5c 100644 --- a/gnu/system/grub.scm +++ b/gnu/system/grub.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com> ;;; ;;; This file is part of GNU Guix. @@ -177,9 +177,9 @@ STORE-MOUNT-POINT is its mount point; these are used to determine where the background image and fonts must be searched for. SYSTEM must be the target system string---e.g., \"x86_64-linux\"." (define setup-gfxterm-body - ;; Intel systems need to be switched into graphics mode, whereas most - ;; other modern architectures have no other mode and therefore don't need - ;; to be switched. + ;; Intel and EFI systems need to be switched into graphics mode, whereas + ;; most other modern architectures have no other mode and therefore don't + ;; need to be switched. (if (string-match "^(x86_64|i[3-6]86)-" system) " # Leave 'gfxmode' to 'auto'. @@ -188,6 +188,15 @@ system string---e.g., \"x86_64-linux\"." insmod video_bochs insmod video_cirrus insmod gfxterm + + if [ \"${grub_platform}\" == efi ]; then + # This is for (U)EFI systems (these modules are unavailable in the + # non-EFI GRUB.) If we don't load them, GRUB boots in \"blind mode\", + # which isn't convenient. + insmod efi_gop + insmod efi_uga + fi + terminal_output gfxterm " "")) diff --git a/gnu/system/install.scm b/gnu/system/install.scm index dfa003f256..ad234fd9c1 100644 --- a/gnu/system/install.scm +++ b/gnu/system/install.scm @@ -255,8 +255,8 @@ the user's target storage device rather than on the RAM disk." (persistent? #f) (max-database-size (* 5 (expt 2 20)))))) ;5 MiB -(define (installation-services) - "Return the list services for the installation image." +(define %installation-services + ;; List of services of the installation system. (let ((motd (plain-file "motd" " Welcome to the installation of the Guix System Distribution! @@ -377,8 +377,7 @@ Use Alt-F2 for documentation. (home-directory "/home/guest")))) (issue %issue) - - (services (installation-services)) + (services %installation-services) ;; We don't need setuid programs so pass the empty list so we don't pull ;; additional programs here. @@ -393,6 +392,7 @@ Use Alt-F2 for documentation. grub ;mostly so xrefs to its manual work cryptsetup mdadm + dosfstools ;mkfs.fat, for the UEFI boot partition btrfs-progs wireless-tools iw wpa-supplicant-minimal iproute ;; XXX: We used to have GNU fdisk here, but as of version diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 174239a566..a787072ba7 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -29,6 +29,7 @@ #:select (derivation->output-path)) #:use-module (guix modules) #:use-module (gnu packages compression) + #:use-module (gnu packages disk) #:use-module (gnu packages linux) #:use-module (gnu packages guile) #:use-module ((gnu packages make-bootstrap) @@ -193,6 +194,9 @@ loaded at boot time in the order in which they appear." ,@(if (find (file-system-type-predicate "9p") file-systems) virtio-9p-modules '()) + ,@(if (find (file-system-type-predicate "vfat") file-systems) + '("nls_iso8859-1") + '()) ,@(if volatile-root? '("fuse") '()) @@ -205,6 +209,11 @@ loaded at boot time in the order in which they appear." file-systems) (list e2fsck/static) '()) + ,@(if (find (lambda (fs) + (string-suffix? "fat" (file-system-type fs))) + file-systems) + (list fatfsck/static) + '()) ,@(if volatile-root? (list unionfs-fuse/static) '()))) diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm index ecf1ac1923..4779b80e94 100644 --- a/gnu/tests/install.scm +++ b/gnu/tests/install.scm @@ -199,8 +199,15 @@ IMAGE, a disk image. The QEMU VM is has access to MEMORY-SIZE MiB of RAM." (mlet %store-monad ((system (current-system))) (return #~(let ((image #$image)) ;; First we need a writable copy of the image. - (format #t "copying image '~a'...~%" image) - (copy-file image "disk.img") + (format #t "creating writable image from '~a'...~%" image) + (unless (zero? (system* #+(file-append qemu-minimal + "/bin/qemu-img") + "create" "-f" "qcow2" + "-o" + (string-append "backing_file=" image) + "disk.img")) + (error "failed to create writable QEMU image" image)) + (chmod "disk.img" #o644) `(,(string-append #$qemu-minimal "/bin/" #$(qemu-command system)) diff --git a/gnu/tests/mail.scm b/gnu/tests/mail.scm new file mode 100644 index 0000000000..47328a54ae --- /dev/null +++ b/gnu/tests/mail.scm @@ -0,0 +1,159 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Sou Bunnbu <iyzsong@member.fsf.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu tests mail) + #:use-module (gnu tests) + #:use-module (gnu system) + #:use-module (gnu system file-systems) + #:use-module (gnu system grub) + #:use-module (gnu system vm) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services mail) + #:use-module (gnu services networking) + #:use-module (guix gexp) + #:use-module (guix monads) + #:use-module (guix store) + #:export (%test-opensmtpd)) + +(define %opensmtpd-os + (operating-system + (host-name "komputilo") + (timezone "Europe/Berlin") + (locale "en_US.UTF-8") + (bootloader (grub-configuration (device #f))) + (file-systems %base-file-systems) + (firmware '()) + (services (cons* + (dhcp-client-service) + (service opensmtpd-service-type + (opensmtpd-configuration + (config-file + (plain-file "smtpd.conf" " +listen on 0.0.0.0 +accept from any for local deliver to mbox +")))) + %base-services)))) + +(define (run-opensmtpd-test) + "Return a test of an OS running OpenSMTPD service." + (mlet* %store-monad ((command (system-qemu-image/shared-store-script + (marionette-operating-system + %opensmtpd-os + #:imported-modules '((gnu services herd))) + #:graphic? #f))) + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (rnrs base) + (srfi srfi-64) + (ice-9 rdelim) + (ice-9 regex) + (gnu build marionette)) + + (define marionette + (make-marionette + ;; Enable TCP forwarding of the guest's port 25. + '(#$command "-net" "user,hostfwd=tcp::1025-:25"))) + + (define (read-reply-code port) + "Read a SMTP reply from PORT and return its reply code." + (let* ((line (read-line port)) + (mo (string-match "([0-9]+)([ -]).*" line)) + (code (string->number (match:substring mo 1))) + (finished? (string= " " (match:substring mo 2)))) + (if finished? + code + (read-reply-code port)))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "opensmptd") + + (test-assert "service is running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'smtpd) + #t) + marionette)) + + (test-assert "mbox is empty" + (marionette-eval + '(and (file-exists? "/var/mail") + (not (file-exists? "/var/mail/root"))) + marionette)) + + (test-eq "accept an email" + #t + (let* ((smtp (socket AF_INET SOCK_STREAM 0)) + (addr (make-socket-address AF_INET INADDR_LOOPBACK 1025))) + (connect smtp addr) + ;; Be greeted. + (read-reply-code smtp) ;220 + ;; Greet the server. + (write-line "EHLO somehost" smtp) + (read-reply-code smtp) ;250 + ;; Set sender email. + (write-line "MAIL FROM: <someone>" smtp) + (read-reply-code smtp) ;250 + ;; Set recipient email. + (write-line "RCPT TO: <root>" smtp) + (read-reply-code smtp) ;250 + ;; Send message. + (write-line "DATA" smtp) + (read-reply-code smtp) ;354 + (write-line "Subject: Hello" smtp) + (newline smtp) + (write-line "Nice to meet you!" smtp) + (write-line "." smtp) + (read-reply-code smtp) ;250 + ;; Say goodbye. + (write-line "QUIT" smtp) + (read-reply-code smtp) ;221 + (close smtp) + #t)) + + (test-assert "mail arrived" + (marionette-eval + '(begin + (use-modules (ice-9 popen) + (ice-9 rdelim)) + + (define (queue-empty?) + (eof-object? + (read-line + (open-input-pipe "smtpctl show queue")))) + + (let wait () + (if (queue-empty?) + (file-exists? "/var/mail/root") + (begin (sleep 1) (wait))))) + marionette)) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "opensmtpd-test" test))) + +(define %test-opensmtpd + (system-test + (name "opensmtpd") + (description "Send an email to a running OpenSMTPD server.") + (value (run-opensmtpd-test)))) diff --git a/gnu/tests/nfs.scm b/gnu/tests/nfs.scm new file mode 100644 index 0000000000..1f28f5a5b8 --- /dev/null +++ b/gnu/tests/nfs.scm @@ -0,0 +1,131 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016 John Darrington <jmd@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu tests nfs) + #:use-module (gnu tests) + #:use-module (gnu system) + #:use-module (gnu system grub) + #:use-module (gnu system file-systems) + #:use-module (gnu system shadow) + #:use-module (gnu system vm) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services nfs) + #:use-module (gnu services networking) + #:use-module (gnu packages onc-rpc) + #:use-module (guix gexp) + #:use-module (guix store) + #:use-module (guix monads) + #:export (%test-nfs)) + +(define %base-os + (operating-system + (host-name "olitupmok") + (timezone "Europe/Berlin") + (locale "en_US.UTF-8") + + (bootloader (grub-configuration (device "/dev/sdX"))) + (file-systems %base-file-systems) + (users %base-user-accounts) + (packages (cons* + rpcbind + %base-packages)) + (services (cons* + (service rpcbind-service-type + (rpcbind-configuration)) + (dhcp-client-service) + %base-services)))) + +(define (run-nfs-test name socket) + "Run a test of an OS running RPC-SERVICE, which should create SOCKET." + (mlet* %store-monad ((os -> (marionette-operating-system + %base-os + #:imported-modules '((gnu services herd) + (guix combinators)))) + (command (system-qemu-image/shared-store-script + os #:graphic? #f))) + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64)) + + (define marionette + (make-marionette (list #$command))) + + (define (wait-for-socket file) + ;; Wait until SOCKET exists in the guest + (marionette-eval + `(let loop ((i 10)) + (cond ((and (file-exists? ,file) + (eq? 'socket (stat:type (stat ,file)))) + #t) + ((> i 0) + (sleep 1) + (loop (- i 1))) + (else + (error "Socket didn't show up: " ,file)))) + marionette)) + + (mkdir #$output) + (chdir #$output) + + (test-begin "rpc-daemon") + + ;; Wait for the rpcbind daemon to be up and running. + (test-eq "RPC service running" + 'running! + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'rpcbind-daemon) + 'running!) + marionette)) + + ;; Check the socket file and that the service is still running. + (test-assert "RPC socket exists" + (and + (wait-for-socket #$socket) + (marionette-eval + '(begin + (use-modules (gnu services herd) + (srfi srfi-1)) + + (live-service-running + (find (lambda (live) + (memq 'rpcbind-daemon + (live-service-provision live))) + (current-services)))) + marionette))) + + (test-assert "Probe RPC daemon" + (marionette-eval + '(zero? (system* "rpcinfo" "-p")) + marionette)) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation name test))) + +(define %test-nfs + (system-test + (name "nfs") + (description "Test some things related to NFS.") + (value (run-nfs-test name "/var/run/rpcbind.sock")))) diff --git a/graph.js b/graph.js new file mode 100644 index 0000000000..ad8279395d --- /dev/null +++ b/graph.js @@ -0,0 +1,129 @@ +// GNU Guix --- Functional package management for GNU +// Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> +// +// 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/>. + +var outerRadius = Math.max(nodeArray.length * 15, 500) / 2, + innerRadius = outerRadius - Math.min(nodeArray.length * 5, 200), + width = outerRadius * 2, + height = outerRadius * 2, + colors = d3.scale.category20c(), + matrix = []; + +function neighborsOf (node) { + return links.filter(function (e) { + return e.source === node; + }).map(function (e) { + return e.target; + }); +} + +function zoomed () { + zoomer.attr("transform", + "translate(" + d3.event.translate + ")" + + "scale(" + d3.event.scale + ")"); +} + +function fade (opacity, root) { + return function (g, i) { + root.selectAll("g path.chord") + .filter(function (d) { + return d.source.index != i && d.target.index != i; + }) + .transition() + .style("opacity", opacity); + }; +} + +// Now that we have all nodes in an object we can replace each reference +// with the actual node object. +links.forEach(function (link) { + link.target = nodes[link.target]; + link.source = nodes[link.source]; +}); + +// Construct a square matrix for package dependencies +nodeArray.forEach(function (d, index, arr) { + var source = index, + row = matrix[source]; + if (!row) { + row = matrix[source] = []; + for (var i = -1; ++i < arr.length;) row[i] = 0; + } + neighborsOf(d).forEach(function (d) { row[d.index]++; }); +}); + +// chord layout +var chord = d3.layout.chord() + .padding(0.01) + .sortSubgroups(d3.descending) + .sortChords(d3.descending) + .matrix(matrix); + +var arc = d3.svg.arc() + .innerRadius(innerRadius) + .outerRadius(innerRadius + 20); + +var zoom = d3.behavior.zoom() + .scaleExtent([0.1, 10]) + .on("zoom", zoomed); + +var svg = d3.select("body").append("svg") + .attr("width", "100%") + .attr("height", "100%") + .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height)) + .attr('preserveAspectRatio', 'xMinYMin') + .call(zoom); + +var zoomer = svg.append("g"); + +var container = zoomer.append("g") + .attr("transform", "translate(" + outerRadius + "," + outerRadius + ")"); + +// Group for arcs and labels +var g = container.selectAll(".group") + .data(chord.groups) + .enter().append("g") + .attr("class", "group") + .on("mouseout", fade(1, container)) + .on("mouseover", fade(0.1, container)); + +// Draw one segment per package +g.append("path") + .style("fill", function (d) { return colors(d.index); }) + .style("stroke", function (d) { return colors(d.index); }) + .attr("d", arc); + +// Add circular labels +g.append("text") + .each(function (d) { d.angle = (d.startAngle + d.endAngle) / 2; }) + .attr("dy", ".35em") + .attr("transform", function (d) { + return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")" + + "translate(" + (innerRadius + 26) + ")" + + (d.angle > Math.PI ? "rotate(180)" : ""); + }) + .style("text-anchor", function (d) { return d.angle > Math.PI ? "end" : null; }) + .text(function (d) { return nodeArray[d.index].label; }); + +// Draw chords from source to target; color by source. +container.selectAll(".chord") + .data(chord.chords) + .enter().append("path") + .attr("class", "chord") + .style("stroke", function (d) { return d3.rgb(colors(d.source.index)).darker(); }) + .style("fill", function (d) { return colors(d.source.index); }) + .attr("d", d3.svg.chord().radius(innerRadius)); diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm new file mode 100644 index 0000000000..3582f0e328 --- /dev/null +++ b/guix/build-system/cargo.scm @@ -0,0 +1,149 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> +;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build-system cargo) + #:use-module (guix search-paths) + #:use-module (guix store) + #:use-module (guix utils) + #:use-module (guix derivations) + #:use-module (guix packages) + #:use-module (guix build-system) + #:use-module (guix build-system gnu) + #:use-module (ice-9 match) + #:use-module (srfi srfi-26) + #:export (cargo-build-system + crate-url + crate-url? + crate-uri)) + +(define crate-url "https://crates.io/api/v1/crates/") +(define crate-url? (cut string-prefix? crate-url <>)) + +(define (crate-uri name version) + "Return a URI string for the crate package hosted at crates.io corresponding +to NAME and VERSION." + (string-append crate-url name "/" version "/download")) + +(define (default-cargo) + "Return the default Cargo package." + ;; Lazily resolve the binding to avoid a circular dependency. + (let ((rust (resolve-interface '(gnu packages rust)))) + (module-ref rust 'cargo))) + +(define (default-rustc) + "Return the default Rustc package." + ;; Lazily resolve the binding to avoid a circular dependency. + (let ((rust (resolve-interface '(gnu packages rust)))) + (module-ref rust 'rustc))) + +(define %cargo-build-system-modules + ;; Build-side modules imported by default. + `((guix build cargo-build-system) + ,@%gnu-build-system-modules)) + +(define* (cargo-build store name inputs + #:key + (tests? #t) + (test-target #f) + (configure-flags #f) + (phases '(@ (guix build cargo-build-system) + %standard-phases)) + (outputs '("out")) + (search-paths '()) + (system (%current-system)) + (guile #f) + (imported-modules %cargo-build-system-modules) + (modules '((guix build cargo-build-system) + (guix build utils)))) + "Build SOURCE using CARGO, and with INPUTS." + + (define builder + `(begin + (use-modules ,@modules) + (cargo-build #:name ,name + #:source ,(match (assoc-ref inputs "source") + (((? derivation? source)) + (derivation->output-path source)) + ((source) + source) + (source + source)) + #:system ,system + #:test-target ,test-target + #:tests? ,tests? + #:phases ,phases + #:outputs %outputs + #:search-paths ',(map search-path-specification->sexp + search-paths) + #:inputs %build-inputs))) + + (define guile-for-build + (match guile + ((? package?) + (package-derivation store guile system #:graft? #f)) + (#f ; the default + (let* ((distro (resolve-interface '(gnu packages commencement))) + (guile (module-ref distro 'guile-final))) + (package-derivation store guile system #:graft? #f))))) + + (build-expression->derivation store name builder + #:inputs inputs + #:system system + #:modules imported-modules + #:outputs (cons "src" outputs) + #:guile-for-build guile-for-build)) + +(define* (lower name + #:key source inputs native-inputs outputs system target + (cargo (default-cargo)) + (rustc (default-rustc)) + #:allow-other-keys + #:rest arguments) + "Return a bag for NAME." + + (define private-keywords + '(#:source #:target #:cargo #:rustc #:inputs #:native-inputs #:outputs)) + + (and (not target) ;; TODO: support cross-compilation + (bag + (name name) + (system system) + (target target) + (host-inputs `(,@(if source + `(("source" ,source)) + '()) + ,@inputs + + ;; Keep the standard inputs of 'gnu-build-system' + ,@(standard-packages))) + (build-inputs `(("cargo" ,cargo) + ("rustc" ,rustc) + ,@native-inputs)) + (outputs outputs) + (build cargo-build) + (arguments (strip-keyword-arguments private-keywords arguments))))) + +(define cargo-build-system + (build-system + (name 'cargo) + (description + "Cargo build system, to build Rust crates") + (lower lower))) diff --git a/guix/build-system/ocaml.scm b/guix/build-system/ocaml.scm new file mode 100644 index 0000000000..f4f57b5ad5 --- /dev/null +++ b/guix/build-system/ocaml.scm @@ -0,0 +1,181 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build-system ocaml) + #:use-module (guix store) + #:use-module (guix utils) + #:use-module (guix derivations) + #:use-module (guix search-paths) + #:use-module (guix build-system) + #:use-module (guix build-system gnu) + #:use-module (guix packages) + #:use-module (ice-9 match) + #:export (%ocaml-build-system-modules + ocaml-build + ocaml-build-system)) + +;; Commentary: +;; +;; Standard build procedure for packages using ocaml. This is implemented as an +;; extension of `gnu-build-system'. +;; +;; OCaml packages don't use a single standard for their build system. Some use +;; autotools, other use custom configure scripts with Makefiles, others use +;; oasis to generate the configure script and Makefile and lastly, some use +;; custom ocaml scripts. +;; +;; Each phase in the build system will try to figure out what the build system +;; is for that package. Most packages come with a custom configure script and +;; a Makefile that in turn call custom build tools. Packages built with oasis +;; will have a `setup.ml' file in the top directory, that can be used for all +;; phases. In that case the Makefile is here only to call that script. In case +;; the setup.ml do not work as expected, the @var{use-make} argument can be +;; used to ignore the setup.ml file and run make instead. +;; +;; Some packages use their own custom scripts, `pkg/pkg.ml' or +;; `pkg/build.ml'. They can be used here too. +;; +;; Code: + +(define %ocaml-build-system-modules + ;; Build-side modules imported by default. + `((guix build ocaml-build-system) + ,@%gnu-build-system-modules)) + +(define (default-ocaml) + "Return the default OCaml package." + + ;; Do not use `@' to avoid introducing circular dependencies. + (let ((module (resolve-interface '(gnu packages ocaml)))) + (module-ref module 'ocaml))) + +(define (default-findlib) + "Return the default OCaml-findlib package." + + ;; Do not use `@' to avoid introducing circular dependencies. + (let ((module (resolve-interface '(gnu packages ocaml)))) + (module-ref module 'ocaml-findlib))) + +(define* (lower name + #:key source inputs native-inputs outputs system target + (ocaml (default-ocaml)) + (findlib (default-findlib)) + #:allow-other-keys + #:rest arguments) + "Return a bag for NAME." + (define private-keywords + '(#:source #:target #:ocaml #:findlib #:inputs #:native-inputs)) + + (and (not target) ;XXX: no cross-compilation + (bag + (name name) + (system system) + (host-inputs `(,@(if source + `(("source" ,source)) + '()) + ,@inputs + + ;; Keep the standard inputs of 'gnu-build-system'. + ,@(standard-packages))) + (build-inputs `(("ocaml" ,ocaml) + ("findlib" ,findlib) + ,@native-inputs)) + (outputs outputs) + (build ocaml-build) + (arguments (strip-keyword-arguments private-keywords arguments))))) + +(define* (ocaml-build store name inputs + #:key (guile #f) + (outputs '("out")) (configure-flags ''()) + (search-paths '()) + (make-flags ''()) + (build-flags ''()) + (out-of-source? #t) + (use-make? #f) + (tests? #t) + (test-flags ''("--enable-tests")) + (test-target "test") + (install-target "install") + (validate-runpath? #t) + (patch-shebangs? #t) + (strip-binaries? #t) + (strip-flags ''("--strip-debug")) + (strip-directories ''("lib" "lib64" "libexec" + "bin" "sbin")) + (phases '(@ (guix build ocaml-build-system) + %standard-phases)) + (system (%current-system)) + (imported-modules %ocaml-build-system-modules) + (modules '((guix build ocaml-build-system) + (guix build utils)))) + "Build SOURCE using OCAML, and with INPUTS. This assumes that SOURCE +provides a 'setup.ml' file as its build system." + (define builder + `(begin + (use-modules ,@modules) + (ocaml-build #:source ,(match (assoc-ref inputs "source") + (((? derivation? source)) + (derivation->output-path source)) + ((source) + source) + (source + source)) + #:system ,system + #:outputs %outputs + #:inputs %build-inputs + #:search-paths ',(map search-path-specification->sexp + search-paths) + #:phases ,phases + #:configure-flags ,configure-flags + #:test-flags ,test-flags + #:make-flags ,make-flags + #:build-flags ,build-flags + #:out-of-source? ,out-of-source? + #:use-make? ,use-make? + #:tests? ,tests? + #:test-target ,test-target + #:install-target ,install-target + #:validate-runpath? ,validate-runpath? + #:patch-shebangs? ,patch-shebangs? + #:strip-binaries? ,strip-binaries? + #:strip-flags ,strip-flags + #:strip-directories ,strip-directories))) + + (define guile-for-build + (match guile + ((? package?) + (package-derivation store guile system #:graft? #f)) + (#f ; the default + (let* ((distro (resolve-interface '(gnu packages commencement))) + (guile (module-ref distro 'guile-final))) + (package-derivation store guile system #:graft? #f))))) + + (build-expression->derivation store name builder + #:system system + #:inputs inputs + #:modules imported-modules + #:outputs outputs + #:guile-for-build guile-for-build)) + +(define ocaml-build-system + (build-system + (name 'ocaml) + (description "The standard OCaml build system") + (lower lower))) + +;;; ocaml.scm ends here diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm index adeceb4a89..d4d3d28f2a 100644 --- a/guix/build-system/python.scm +++ b/guix/build-system/python.scm @@ -177,6 +177,7 @@ pre-defined variants." #:key (tests? #t) (test-target "test") + (use-setuptools? #t) (configure-flags ''()) (phases '(@ (guix build python-build-system) %standard-phases)) @@ -204,6 +205,7 @@ provides a 'setup.py' file as its build system." #:system ,system #:test-target ,test-target #:tests? ,tests? + #:use-setuptools? ,use-setuptools? #:phases ,phases #:outputs %outputs #:search-paths ',(map search-path-specification->sexp diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm new file mode 100644 index 0000000000..7d656a8d58 --- /dev/null +++ b/guix/build/cargo-build-system.scm @@ -0,0 +1,110 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build cargo-build-system) + #:use-module ((guix build gnu-build-system) #:prefix gnu:) + #:use-module (guix build utils) + #:use-module (ice-9 ftw) + #:use-module (ice-9 format) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:export (%standard-phases + cargo-build)) + +;; Commentary: +;; +;; Builder-side code of the standard Rust package build procedure. +;; +;; Code: + +;; FIXME: Needs to be parsed from url not package name. +(define (package-name->crate-name name) + "Return the crate name of NAME." + (match (string-split name #\-) + (("rust" rest ...) + (string-join rest "-")) + (_ #f))) + +(define* (configure #:key inputs #:allow-other-keys) + "Replace Cargo.toml [dependencies] section with guix inputs." + ;; Make sure Cargo.toml is writeable when the crate uses git-fetch. + (chmod "Cargo.toml" #o644) + (let ((port (open-file "Cargo.toml" "a" #:encoding "utf-8"))) + (format port "~%[replace]~%") + (for-each + (match-lambda + ((name . path) + (let ((crate (package-name->crate-name name))) + (when (and crate path) + (match (string-split (basename path) #\-) + ((_ ... version) + (format port "\"~a:~a\" = { path = \"~a/share/rust-source\" }~%" + crate version path))))))) + inputs) + (close-port port)) + #t) + +(define* (build #:key (cargo-build-flags '("--release" "--frozen")) + #:allow-other-keys) + "Build a given Cargo package." + (if (file-exists? "Cargo.lock") + (zero? (apply system* `("cargo" "build" ,@cargo-build-flags))) + #t)) + +(define* (check #:key tests? #:allow-other-keys) + "Run tests for a given Cargo package." + (if (and tests? (file-exists? "Cargo.lock")) + (zero? (system* "cargo" "test")) + #t)) + +(define* (install #:key inputs outputs #:allow-other-keys) + "Install a given Cargo package." + (let* ((out (assoc-ref outputs "out")) + (src (assoc-ref inputs "source")) + (rsrc (string-append (assoc-ref outputs "src") + "/share/rust-source"))) + (mkdir-p rsrc) + ;; Rust doesn't have a stable ABI yet. Because of this + ;; Cargo doesn't have a search path for binaries yet. + ;; Until this changes we are working around this by + ;; distributing crates as source and replacing + ;; references in Cargo.toml with store paths. + (copy-recursively "src" (string-append rsrc "/src")) + (install-file "Cargo.toml" rsrc) + ;; When the package includes executables we install + ;; it using cargo install. This fails when the crate + ;; doesn't contain an executable. + (if (file-exists? "Cargo.lock") + (system* "cargo" "install" "--root" out) + (mkdir out)))) + +(define %standard-phases + ;; 'configure' phase is not needed. + (modify-phases gnu:%standard-phases + (replace 'configure configure) + (replace 'build build) + (replace 'check check) + (replace 'install install))) + +(define* (cargo-build #:key inputs (phases %standard-phases) + #:allow-other-keys #:rest args) + "Build the given Cargo package, applying all of PHASES in order." + (apply gnu:gnu-build #:inputs inputs #:phases phases args)) + +;;; cargo-build-system.scm ends here diff --git a/guix/build/cmake-build-system.scm b/guix/build/cmake-build-system.scm index f57622e0f4..27f2b5c872 100644 --- a/guix/build/cmake-build-system.scm +++ b/guix/build/cmake-build-system.scm @@ -66,6 +66,7 @@ (define* (check #:key (tests? #t) (parallel-tests? #t) (test-target "test") #:allow-other-keys) (let ((gnu-check (assoc-ref gnu:%standard-phases 'check))) + (setenv "CTEST_OUTPUT_ON_FAILURE" "1") (gnu-check #:tests? tests? #:test-target test-target #:parallel-tests? parallel-tests?))) diff --git a/guix/build/download.scm b/guix/build/download.scm index 8e32b3d7ff..203338b527 100644 --- a/guix/build/download.scm +++ b/guix/build/download.scm @@ -289,9 +289,12 @@ DIRECTORY. Those authority certificates are checked when (string-suffix? ".pem" file))) '()))) (for-each (lambda (file) - (set-certificate-credentials-x509-trust-file! - cred (string-append directory "/" file) - x509-certificate-format/pem)) + (let ((file (string-append directory "/" file))) + ;; Protect against dangling symlinks. + (when (file-exists? file) + (set-certificate-credentials-x509-trust-file! + cred file + x509-certificate-format/pem)))) (or files '())) cred)) diff --git a/guix/build/make-bootstrap.scm b/guix/build/make-bootstrap.scm new file mode 100644 index 0000000000..21c78cc8f5 --- /dev/null +++ b/guix/build/make-bootstrap.scm @@ -0,0 +1,85 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015, 2017 Manolis Fragkiskos Ragkousis <manolis837@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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build make-bootstrap) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-19) + #:use-module (srfi srfi-26) + #:use-module (guix build utils) + #:export (make-stripped-libc)) + +;; Commentary: +;; +;; This module provides facilities to build the bootstrap binaries. +;; +;; Code: + +(define (make-stripped-libc output libc kernel-headers) + "Copy to OUTPUT the subset of LIBC and KERNEL-HEADERS that is needed +when producing a bootstrap libc." + + (define (copy-mach-headers output kernel-headers) + (let* ((incdir (string-append output "/include"))) + (copy-recursively (string-append libc "/include") incdir) + + (copy-recursively (string-append kernel-headers "/include/mach") + (string-append incdir "/mach")) + #t)) + + (define (copy-linux-headers output kernel-headers) + (let* ((incdir (string-append output "/include"))) + (copy-recursively (string-append libc "/include") incdir) + + ;; Copy some of the Linux-Libre headers that glibc headers + ;; refer to. + (mkdir (string-append incdir "/linux")) + (for-each (lambda (file) + (install-file (string-append kernel-headers "/include/linux/" file) + (string-append incdir "/linux"))) + '("limits.h" "errno.h" "socket.h" "kernel.h" + "sysctl.h" "param.h" "ioctl.h" "types.h" + "posix_types.h" "stddef.h")) + + (copy-recursively (string-append kernel-headers "/include/asm") + (string-append incdir "/asm")) + (copy-recursively (string-append kernel-headers "/include/asm-generic") + (string-append incdir "/asm-generic")) + #t)) + + (define %libc-object-files-rx "^(crt.*|ld.*|lib(c|m|dl|rt|pthread|nsl|\ +util).*\\.so(\\..*)?|lib(machuser|hurduser).so.*|(libc(rt|)|libpthread)\ +_nonshared\\.a)$") + + (setvbuf (current-output-port) _IOLBF) + (let* ((libdir (string-append output "/lib"))) + (mkdir-p libdir) + (for-each (lambda (file) + (let ((target (string-append libdir "/" + (basename file)))) + (copy-file file target) + (remove-store-references target))) + (find-files (string-append libc "/lib") %libc-object-files-rx)) + #t) + + (if (directory-exists? (string-append kernel-headers "/include/mach")) + (copy-mach-headers output kernel-headers) + (copy-linux-headers output kernel-headers))) + + diff --git a/guix/build/ocaml-build-system.scm b/guix/build/ocaml-build-system.scm new file mode 100644 index 0000000000..f77251ca09 --- /dev/null +++ b/guix/build/ocaml-build-system.scm @@ -0,0 +1,119 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build ocaml-build-system) + #:use-module ((guix build gnu-build-system) #:prefix gnu:) + #:use-module (guix build utils) + #:use-module (ice-9 match) + #:export (%standard-phases + ocaml-build)) + +;; Commentary: +;; +;; Builder-side code of the standard ocaml build procedure. +;; +;; Code: + +(define* (ocaml-findlib-environment #:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (setenv "OCAMLFIND_DESTDIR" (string-append out "/lib/ocaml/site-lib")) + (setenv "OCAMLFIND_LDCONF" "ignore")) + #t) + +(define* (configure #:key outputs (configure-flags '()) + (test-flags '("--enable-tests")) tests? + #:allow-other-keys) + "Configure the given package." + (let* ((out (assoc-ref outputs "out"))) + (format #t "build directory: ~s~%" (getcwd)) + (if (file-exists? "setup.ml") + (let ((args `("-configure" + "--prefix" ,out + ,@(if tests? + test-flags + '()) + ,@configure-flags))) + (format #t "running 'setup.ml' with arguments ~s~%" args) + (zero? (apply system* "ocaml" "setup.ml" args))) + (let ((args `("-prefix" ,out ,@configure-flags))) + (format #t "running 'configure' with arguments ~s~%" args) + (zero? (apply system* "./configure" args)))))) + +(define* (build #:key inputs outputs (build-flags '()) (make-flags '()) + (use-make? #f) #:allow-other-keys) + "Build the given package." + (if (and (file-exists? "setup.ml") (not use-make?)) + (zero? (apply system* "ocaml" "setup.ml" "-build" build-flags)) + (if (file-exists? "Makefile") + (zero? (apply system* "make" make-flags)) + (let ((file (if (file-exists? "pkg/pkg.ml") "pkg/pkg.ml" "pkg/build.ml"))) + (zero? (apply system* "ocaml" "-I" + (string-append (assoc-ref inputs "findlib") + "/lib/ocaml/site-lib") + file build-flags)))))) + +(define* (check #:key inputs outputs (make-flags '()) (test-target "test") tests? + (use-make? #f) #:allow-other-keys) + "Install the given package." + (when tests? + (if (and (file-exists? "setup.ml") (not use-make?)) + (zero? (system* "ocaml" "setup.ml" (string-append "-" test-target))) + (if (file-exists? "Makefile") + (zero? (apply system* "make" test-target make-flags)) + (let ((file (if (file-exists? "pkg/pkg.ml") "pkg/pkg.ml" "pkg/build.ml"))) + (zero? (system* "ocaml" "-I" + (string-append (assoc-ref inputs "findlib") + "/lib/ocaml/site-lib") + file test-target))))))) + +(define* (install #:key outputs (build-flags '()) (make-flags '()) (use-make? #f) + (install-target "install") + #:allow-other-keys) + "Install the given package." + (let ((out (assoc-ref outputs "out"))) + (if (and (file-exists? "setup.ml") (not use-make?)) + (zero? (apply system* "ocaml" "setup.ml" + (string-append "-" install-target) build-flags)) + (if (file-exists? "Makefile") + (zero? (apply system* "make" install-target make-flags)) + (zero? (system* "opam-installer" "-i" (string-append "--prefix=" out) + (string-append "--libdir=" out "/lib/ocaml/site-lib"))))))) + +(define* (prepare-install #:key outputs #:allow-other-keys) + "Prepare for building the given package." + (mkdir-p (string-append (assoc-ref outputs "out") "/lib/ocaml/site-lib")) + (mkdir-p (string-append (assoc-ref outputs "out") "/bin"))) + +(define %standard-phases + ;; Everything is as with the GNU Build System except for the `configure' + ;; , `build', `check' and `install' phases. + (modify-phases gnu:%standard-phases + (add-before 'configure 'ocaml-findlib-environment + ocaml-findlib-environment) + (add-before 'install 'prepare-install prepare-install) + (replace 'configure configure) + (replace 'build build) + (replace 'check check) + (replace 'install install))) + +(define* (ocaml-build #:key inputs (phases %standard-phases) + #:allow-other-keys #:rest args) + "Build the given package, applying all of PHASES in order." + (apply gnu:gnu-build #:inputs inputs #:phases phases args)) + +;;; ocaml-build-system.scm ends here diff --git a/guix/build/pull.scm b/guix/build/pull.scm index 871bf6f535..6034e93cbf 100644 --- a/guix/build/pull.scm +++ b/guix/build/pull.scm @@ -84,7 +84,7 @@ containing the source code. Write any debugging output to DEBUG-PORT." (("@GZIP@") (string-append gzip "/bin/gzip")) (("@BZIP2@") (string-append bzip2 "/bin/bzip2")) (("@XZ@") (string-append xz "/bin/xz")) - (("@NIX_INSTANTIATE@") "")) ;remnants from the past + (("@NIX_INSTANTIATE@") "nix-instantiate")) ;for (guix import nix) ;; Augment the search path so Scheme code can be compiled. (set! %load-path (cons out %load-path)) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 9109fb4ac7..3f280b0ac0 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> +;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -27,31 +28,119 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases + add-installed-pythonpath + site-packages python-build)) ;; Commentary: ;; ;; Builder-side code of the standard Python package build procedure. ;; -;; Code: +;; +;; Backgound about the Python installation methods +;; +;; In Python there are different ways to install packages: distutils, +;; setuptools, easy_install and pip. All of these are sharing the file +;; setup.py, introduced with distutils in Python 2.0. The setup.py file can be +;; considered as a kind of Makefile accepting targets (or commands) like +;; "build" and "install". As of autumn 2016 the recommended way to install +;; Python packages is using pip. +;; +;; For both distutils and setuptools, running "python setup.py install" is the +;; way to install Python packages. With distutils the "install" command +;; basically copies all packages into <prefix>/lib/pythonX.Y/site-packages. +;; +;; Some time later "setuptools" was established to enhance distutils. To use +;; setuptools, the developer imports setuptools in setup.py. When importing +;; setuptools, the original "install" command gets overwritten by setuptools' +;; "install" command. +;; +;; The command-line tools easy_install and pip are both capable of finding and +;; downloading the package source from PyPI (the Python Package Index). Both +;; of them import setuptools and execute the "setup.py" file under their +;; control. Thus the "setup.py" behaves as if the developer had imported +;; setuptools within setup.py - even is still using only distutils. +;; +;; Setuptools' "install" command (to be more precise: the "easy_install" +;; command which is called by "install") will put the path of the currently +;; installed version of each package and it's dependencies (as declared in +;; setup.py) into an "easy-install.pth" file. In Guix each packages gets its +;; own "site-packages" directory and thus an "easy-install.pth" of its own. +;; To avoid conflicts, the python build system renames the file to +;; <packagename>.pth in the phase rename-pth-file. To ensure that Python will +;; process the .pth file, easy_install also creates a basic "site.py" in each +;; "site-packages" directory. The file is the same for all packages, thus +;; there is no need to rename it. For more information about .pth files and +;; the site module, please refere to +;; https://docs.python.org/3/library/site.html. +;; +;; The .pth files contain the file-system paths (pointing to the store) of all +;; dependencies. So the dependency is hidden in the .pth file but is not +;; visible in the file-system. Now if packages A and B both required packages +;; P, but in different versions, Guix will not detect this when installing +;; both A and B to a profile. (For details and example see +;; https://lists.gnu.org/archive/html/guix-devel/2016-10/msg01233.html.) +;; +;; Pip behaves a bit different then easy_install: it always executes +;; "setup.py" with the option "--single-version-externally-managed" set. This +;; makes setuptools' "install" command run the original "install" command +;; instead of the "easy_install" command, so no .pth file (and no site.py) +;; will be created. The "site-packages" directory only contains the package +;; and the related .egg-info directory. +;; +;; This is exactly what we need for Guix and this is what we mimic in the +;; install phase below. +;; +;; As a draw back, the magic of the .pth file of linking to the other required +;; packages is gone and these packages have now to be declared as +;; "propagated-inputs". +;; +;; Note: Importing setuptools also adds two sub-commands: "install_egg_info" +;; and "install_scripts". These sub-commands are executed even if +;; "--single-version-externally-managed" is set, thus the .egg-info directory +;; and the scripts defined in entry-points will always be created. + +(define setuptools-shim + ;; Run setup.py with "setuptools" being imported, which will patch + ;; "distutils". This is needed for packages using "distutils" instead of + ;; "setuptools" since the former does not understand the + ;; "--single-version-externally-managed" flag. + ;; Python code taken from pip 9.0.1 pip/utils/setuptools_build.py + (string-append + "import setuptools, tokenize;__file__='setup.py';" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))")) -(define (call-setuppy command params) +(define (call-setuppy command params use-setuptools?) (if (file-exists? "setup.py") (begin (format #t "running \"python setup.py\" with command ~s and parameters ~s~%" command params) - (zero? (apply system* "python" "setup.py" command params))) + (if use-setuptools? + (zero? (apply system* "python" "-c" setuptools-shim + command params)) + (zero? (apply system* "python" "./setup.py" command params)))) (error "no setup.py found"))) -(define* (build #:rest empty) +(define* (build #:key use-setuptools? #:allow-other-keys) "Build a given Python package." - (call-setuppy "build" '())) + (call-setuppy "build" '() use-setuptools?)) -(define* (check #:key tests? test-target #:allow-other-keys) +(define* (check #:key tests? test-target use-setuptools? #:allow-other-keys) "Run the test suite of a given Python package." (if tests? - (call-setuppy test-target '()) + ;; Running `setup.py test` creates an additional .egg-info directory in + ;; build/lib in some cases, e.g. if the source is in a sub-directory + ;; (given with `package_dir`). This will by copied to the output, too, + ;; so we need to remove. + (let ((before (find-files "build" "\\.egg-info$" #:directories? #t))) + (call-setuppy test-target '() use-setuptools?) + (let* ((after (find-files "build" "\\.egg-info$" #:directories? #t)) + (inter (lset-difference eqv? after before))) + (for-each delete-file-recursively inter))) #t)) (define (get-python-version python) @@ -60,25 +149,36 @@ (major+minor (take components 2))) (string-join major+minor "."))) -(define* (install #:key outputs inputs (configure-flags '()) +(define (site-packages inputs outputs) + "Return the path of the current output's Python site-package." + (let* ((out (assoc-ref outputs "out")) + (python (assoc-ref inputs "python"))) + (string-append out "/lib/python" + (get-python-version python) + "/site-packages/"))) + +(define (add-installed-pythonpath inputs outputs) + "Prepend the Python site-package of OUTPUT to PYTHONPATH. This is useful +when running checks after installing the package." + (let ((old-path (getenv "PYTHONPATH")) + (add-path (site-packages inputs outputs))) + (setenv "PYTHONPATH" + (string-append add-path + (if old-path (string-append ":" old-path) ""))) + #t)) + +(define* (install #:key outputs (configure-flags '()) use-setuptools? #:allow-other-keys) "Install a given Python package." (let* ((out (assoc-ref outputs "out")) (params (append (list (string-append "--prefix=" out)) - configure-flags)) - (python-version (get-python-version (assoc-ref inputs "python"))) - (old-path (getenv "PYTHONPATH")) - (add-path (string-append out "/lib/python" python-version - "/site-packages/"))) - ;; create the module installation directory and add it to PYTHONPATH - ;; to make setuptools happy - (mkdir-p add-path) - (setenv "PYTHONPATH" - (string-append (if old-path - (string-append old-path ":") - "") - add-path)) - (call-setuppy "install" params))) + (if use-setuptools? + ;; distutils does not accept these flags + (list "--single-version-externally-managed" + "--root=/") + '()) + configure-flags))) + (call-setuppy "install" params use-setuptools?))) (define* (wrap #:key inputs outputs #:allow-other-keys) (define (list-of-files dir) @@ -112,6 +212,9 @@ (define* (rename-pth-file #:key name inputs outputs #:allow-other-keys) "Rename easy-install.pth to NAME.pth to avoid conflicts between packages installed with setuptools." + ;; Even if the "easy-install.pth" is not longer created, we kept this phase. + ;; There still may be packages creating an "easy-install.pth" manually for + ;; some good reason. (let* ((out (assoc-ref outputs "out")) (python (assoc-ref inputs "python")) (site-packages (string-append out "/lib/python" @@ -137,8 +240,7 @@ installed with setuptools." #t)) (define %standard-phases - ;; 'configure' and 'build' phases are not needed. Everything is done during - ;; 'install'. + ;; 'configure' phase is not needed. (modify-phases gnu:%standard-phases (add-after 'unpack 'ensure-no-mtimes-pre-1980 ensure-no-mtimes-pre-1980) (delete 'configure) diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 9386c0f5d0..2e37846ff0 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015 David Thompson <davet@gnu.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; @@ -1474,7 +1474,9 @@ always a positive integer." ;; ENOTTY is what we're after but 2012-and-earlier Linux versions ;; would return EINVAL instead in some cases: ;; <https://bugs.ruby-lang.org/issues/10494>. - (if (or (= errno ENOTTY) (= errno EINVAL)) + ;; Furthermore, some FUSE file systems like unionfs return ENOSYS for + ;; that ioctl. + (if (memv errno (list ENOTTY EINVAL ENOSYS)) (fall-back) (apply throw args)))))) diff --git a/guix/derivations.scm b/guix/derivations.scm index 7ed9bd61d3..d5e4b5730b 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; 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> ;;; ;;; This file is part of GNU Guix. ;;; @@ -453,19 +453,22 @@ one-argument procedure similar to that returned by 'substitution-oracle'." (loop (read drv-port) (cons (ununquote exp) result)))))) -(define read-derivation - (let ((cache (make-weak-value-hash-table 200))) - (lambda (drv-port) - "Read the derivation from DRV-PORT and return the corresponding +(define %derivation-cache + ;; Maps derivation file names to <derivation> objects. + ;; XXX: This is redundant with 'atts-cache' in the store. + (make-weak-value-hash-table 200)) + +(define (read-derivation drv-port) + "Read the derivation from DRV-PORT and return the corresponding <derivation> object." - ;; Memoize that operation because `%read-derivation' is quite expensive, - ;; and because the same argument is read more than 15 times on average - ;; during something like (package-derivation s gdb). - (let ((file (and=> (port-filename drv-port) basename))) - (or (and file (hash-ref cache file)) - (let ((drv (%read-derivation drv-port))) - (hash-set! cache file drv) - drv)))))) + ;; Memoize that operation because `%read-derivation' is quite expensive, + ;; and because the same argument is read more than 15 times on average + ;; during something like (package-derivation s gdb). + (let ((file (port-filename drv-port))) + (or (and file (hash-ref %derivation-cache file)) + (let ((drv (%read-derivation drv-port))) + (hash-set! %derivation-cache file drv) + drv)))) (define-inlinable (write-sequence lst write-item port) ;; Write each element of LST with WRITE-ITEM to PORT, separating them with a @@ -520,9 +523,9 @@ that form." (define (write-input input port) (match input (($ <derivation-input> path sub-drvs) - (display "(" port) - (write path port) - (display "," port) + (display "(\"" port) + (display path port) + (display "\"," port) (write-string-list sub-drvs) (display ")" port)))) @@ -545,7 +548,7 @@ that form." (write-list inputs write-input port) (display "," port) (write-string-list sources) - (format port ",~s,~s," system builder) + (simple-format port ",\"~a\",\"~a\"," system builder) (write-string-list args) (display "," port) (write-list env-vars write-env-var port) @@ -866,10 +869,12 @@ output should not be used." system builder args env-vars #f)) (drv (add-output-paths drv-masked))) - (let ((file (add-text-to-store store (string-append name ".drv") - (derivation->string drv) - (map derivation-input-path inputs)))) - (set-file-name drv file)))) + (let* ((file (add-text-to-store store (string-append name ".drv") + (derivation->string drv) + (map derivation-input-path inputs))) + (drv (set-file-name drv file))) + (hash-set! %derivation-cache file drv) + drv))) (define* (map-derivation store drv mapping #:key (system (%current-system))) diff --git a/guix/docker.scm b/guix/docker.scm new file mode 100644 index 0000000000..dbe1e5351c --- /dev/null +++ b/guix/docker.scm @@ -0,0 +1,127 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix docker) + #:use-module (guix hash) + #:use-module (guix store) + #:use-module (guix utils) + #:use-module ((guix build utils) + #:select (delete-file-recursively + with-directory-excursion)) + #:use-module (json) + #:use-module (rnrs bytevectors) + #:use-module (ice-9 match) + #:export (build-docker-image)) + +;; Generate a 256-bit identifier in hexadecimal encoding for the Docker image +;; containing the closure at PATH. +(define docker-id + (compose bytevector->base16-string sha256 string->utf8)) + +(define (layer-diff-id layer) + "Generate a layer DiffID for the given LAYER archive." + (string-append "sha256:" (bytevector->base16-string (file-sha256 layer)))) + +;; This is the semantic version of the JSON metadata schema according to +;; https://github.com/docker/docker/blob/master/image/spec/v1.2.md +;; It is NOT the version of the image specification. +(define schema-version "1.0") + +(define (image-description id time) + "Generate a simple image description." + `((id . ,id) + (created . ,time) + (container_config . #nil))) + +(define (generate-tag path) + "Generate an image tag for the given PATH." + (match (string-split (basename path) #\-) + ((hash name . rest) (string-append name ":" hash)))) + +(define (manifest path id) + "Generate a simple image manifest." + `(((Config . "config.json") + (RepoTags . (,(generate-tag path))) + (Layers . (,(string-append id "/layer.tar")))))) + +;; According to the specifications this is required for backwards +;; compatibility. It duplicates information provided by the manifest. +(define (repositories path id) + "Generate a repositories file referencing PATH and the image ID." + `((,(generate-tag path) . ((latest . ,id))))) + +;; See https://github.com/opencontainers/image-spec/blob/master/config.md +(define (config layer time arch) + "Generate a minimal image configuration for the given LAYER file." + ;; "architecture" must be values matching "platform.arch" in the + ;; runtime-spec at + ;; https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc2/config.md#platform + `((architecture . ,arch) + (comment . "Generated by GNU Guix") + (created . ,time) + (config . #nil) + (container_config . #nil) + (os . "linux") + (rootfs . ((type . "layers") + (diff_ids . (,(layer-diff-id layer))))))) + +(define* (build-docker-image path #:key system) + "Generate a Docker image archive from the given store PATH. The image +contains the closure of the given store item." + (let ((id (docker-id path)) + (time (strftime "%FT%TZ" (localtime (current-time)))) + (name (string-append (getcwd) + "/docker-image-" (basename path) ".tar")) + (arch (match system + ("x86_64-linux" "amd64") + ("i686-linux" "386") + ("armhf-linux" "arm") + ("mips64el-linux" "mips64le")))) + (and (call-with-temporary-directory + (lambda (directory) + (with-directory-excursion directory + ;; Add symlink from /bin to /gnu/store/.../bin + (symlink (string-append path "/bin") "bin") + + (mkdir id) + (with-directory-excursion id + (with-output-to-file "VERSION" + (lambda () (display schema-version))) + (with-output-to-file "json" + (lambda () (scm->json (image-description id time)))) + + ;; Wrap it up + (let ((items (with-store store + (requisites store (list path))))) + (and (zero? (apply system* "tar" "-cf" "layer.tar" + (cons "../bin" items))) + (delete-file "../bin")))) + + (with-output-to-file "config.json" + (lambda () + (scm->json (config (string-append id "/layer.tar") + time arch)))) + (with-output-to-file "manifest.json" + (lambda () + (scm->json (manifest path id)))) + (with-output-to-file "repositories" + (lambda () + (scm->json (repositories path id))))) + (and (zero? (system* "tar" "-C" directory "-cf" name ".")) + (begin (delete-file-recursively directory) #t)))) + name))) diff --git a/guix/gexp.scm b/guix/gexp.scm index fd5dc49233..1f7fbef0a0 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -669,41 +669,34 @@ references; otherwise, return only non-native references." result) result)) (($ <gexp-input> (? gexp? exp) _ #f) - (if native? - (append (gexp-inputs exp #:native? #t) - result) - (append (gexp-inputs exp) - result))) + (append (gexp-inputs exp #:native? native?) + result)) (($ <gexp-input> (? string? str)) (if (direct-store-path? str) (cons `(,str) result) result)) - (($ <gexp-input> (? struct? thing) output) - (if (lookup-compiler thing) + (($ <gexp-input> (? struct? thing) output n?) + (if (and (eqv? n? native?) (lookup-compiler thing)) ;; THING is a derivation, or a package, or an origin, etc. (cons `(,thing ,output) result) result)) (($ <gexp-input> (lst ...) output n?) - (fold-right add-reference-inputs result - ;; XXX: For now, automatically convert LST to a list of - ;; gexp-inputs. - (map (match-lambda - ((? gexp-input? x) x) - (x (%gexp-input x "out" (or n? native?)))) - lst))) + (if (eqv? native? n?) + (fold-right add-reference-inputs result + ;; XXX: For now, automatically convert LST to a list of + ;; gexp-inputs. + (map (match-lambda + ((? gexp-input? x) x) + (x (%gexp-input x "out" (or n? native?)))) + lst)) + result)) (_ ;; Ignore references to other kinds of objects. result))) - (define (native-input? x) - (and (gexp-input? x) - (gexp-input-native? x))) - (fold-right add-reference-inputs '() - (if native? - (filter native-input? (gexp-references exp)) - (remove native-input? (gexp-references exp))))) + (gexp-references exp))) (define gexp-native-inputs (cut gexp-inputs <> #:native? #t)) @@ -819,9 +812,9 @@ environment." (cons exp result)) ((ungexp-native-splicing _ ...) (cons exp result)) - ((exp0 exp ...) + ((exp0 . exp) (let ((result (loop #'exp0 result))) - (fold loop result #'(exp ...)))) + (loop #'exp result))) (_ result)))) @@ -853,9 +846,9 @@ environment." (match (assoc exp substs) ((_ id) id) - (_ - #'(syntax-error "error: no 'ungexp' substitution" - #'ref)))) + (_ ;internal error + (with-syntax ((exp exp)) + #'(syntax-error "error: no 'ungexp' substitution" exp))))) (define (substitute-ungexp-splicing exp substs) (syntax-case exp () @@ -867,7 +860,7 @@ environment." #,(substitute-references #'(rest ...) substs)))) (_ #'(syntax-error "error: no 'ungexp-splicing' substitution" - #'ref)))))) + exp)))))) (define (substitute-references exp substs) ;; Return a variant of EXP where all the cars of SUBSTS have been @@ -882,9 +875,9 @@ environment." (substitute-ungexp-splicing exp substs)) (((ungexp-native-splicing _ ...) rest ...) (substitute-ungexp-splicing exp substs)) - ((exp0 exp ...) + ((exp0 . exp) #`(cons #,(substitute-references #'exp0 substs) - #,(substitute-references #'(exp ...) substs))) + #,(substitute-references #'exp substs))) (x #''x))) (syntax-case s (ungexp output) diff --git a/guix/git-download.scm b/guix/git-download.scm index 9cc6dd3d94..fca44f552a 100644 --- a/guix/git-download.scm +++ b/guix/git-download.scm @@ -30,7 +30,9 @@ git-reference-commit git-reference-recursive? - git-fetch)) + git-fetch + git-version + git-file-name)) ;;; Commentary: ;;; @@ -82,14 +84,26 @@ HASH-ALGO (a symbol). Use NAME as the file name, or a generic name if #f." (((names dirs) ...) dirs))) - (git-fetch '#$(git-reference-url ref) - '#$(git-reference-commit ref) + (git-fetch (getenv "git url") (getenv "git commit") #$output - #:recursive? '#$(git-reference-recursive? ref) + #:recursive? (call-with-input-string + (getenv "git recursive?") + read) #:git-command (string-append #+git "/bin/git"))))) (mlet %store-monad ((guile (package->derivation guile system))) (gexp->derivation (or name "git-checkout") build + + ;; Use environment variables and a fixed script name so + ;; there's only one script in store for all the + ;; downloads. + #:script-name "git-download" + #:env-vars + `(("git url" . ,(git-reference-url ref)) + ("git commit" . ,(git-reference-commit ref)) + ("git recursive?" . ,(object->string + (git-reference-recursive? ref)))) + #:system system #:local-build? #t ;don't offload repo cloning #:hash-algo hash-algo @@ -98,4 +112,12 @@ HASH-ALGO (a symbol). Use NAME as the file name, or a generic name if #f." #:guile-for-build guile #:local-build? #t))) +(define (git-version version revision commit) + "Return the version string for packages using git-download." + (string-append version "-" revision "." (string-take commit 7))) + +(define (git-file-name name version) + "Return the file-name for packages using git-download." + (string-append name "-" version "-checkout")) + ;;; git-download.scm ends here diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm index 78392c9a11..789724c8c0 100644 --- a/guix/gnu-maintenance.scm +++ b/guix/gnu-maintenance.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; ;;; This file is part of GNU Guix. @@ -60,7 +60,8 @@ %gnu-updater %gnome-updater %kde-updater - %xorg-updater)) + %xorg-updater + %kernel.org-updater)) ;;; Commentary: ;;; @@ -75,17 +76,17 @@ ;;; (define %gnumaint-base-url - "http://cvs.savannah.gnu.org/viewvc/*checkout*/gnumaint/") + "http://cvs.savannah.gnu.org/viewvc/*checkout*/womb/gnumaint/") (define %package-list-url (string->uri - (string-append %gnumaint-base-url "gnupackages.txt?root=womb"))) + (string-append %gnumaint-base-url "gnupackages.txt"))) (define %package-description-url ;; This file contains package descriptions in recutils format. ;; See <https://lists.gnu.org/archive/html/guix-devel/2013-10/msg00071.html>. (string->uri - (string-append %gnumaint-base-url "pkgblurbs.txt?root=womb"))) + (string-append %gnumaint-base-url "pkgblurbs.txt"))) (define-record-type* <gnu-package-descriptor> gnu-package-descriptor @@ -448,21 +449,26 @@ elpa.gnu.org, and all the GNOME packages." (not (gnome-package? package)) (gnu-package? package))) -(define (gnome-package? package) - "Return true if PACKAGE is a GNOME package, hosted on gnome.org." - (define gnome-uri? - (match-lambda - ((? string? uri) - (string-prefix? "mirror://gnome/" uri)) - (_ - #f))) - - (match (package-source package) - ((? origin? origin) - (match (origin-uri origin) - ((? gnome-uri?) #t) - (_ #f))) - (_ #f))) +(define (url-prefix-predicate prefix) + "Return a predicate that returns true when passed a package where one of its +source URLs starts with PREFIX." + (lambda (package) + (define matching-uri? + (match-lambda + ((? string? uri) + (string-prefix? prefix uri)) + (_ + #f))) + + (match (package-source package) + ((? origin? origin) + (match (origin-uri origin) + ((? matching-uri?) #t) + (_ #f))) + (_ #f)))) + +(define gnome-package? + (url-prefix-predicate "mirror://gnome/")) (define (latest-gnome-release package) "Return the latest release of PACKAGE, the name of a GNOME package." @@ -504,49 +510,19 @@ elpa.gnu.org, and all the GNOME packages." ;; checksums. #:file->signature (const #f)))) -(define (kde-package? package) - "Return true if PACKAGE is a KDE package, developed by KDE.org." - (define kde-uri? - (match-lambda - ((? string? uri) - (string-prefix? "mirror://kde/" uri)) - (_ - #f))) - - (match (package-source package) - ((? origin? origin) - (match (origin-uri origin) - ((? kde-uri?) #t) - (_ #f))) - (_ #f))) (define (latest-kde-release package) "Return the latest release of PACKAGE, the name of an KDE.org package." (let ((uri (string->uri (origin-uri (package-source package))))) (false-if-ftp-error (latest-ftp-release - (package-name package) + (or (assoc-ref (package-properties package) 'upstream-name) + (package-name package)) #:server "mirrors.mit.edu" #:directory (string-append "/kde" (dirname (dirname (uri-path uri)))) #:file->signature (const #f))))) -(define (xorg-package? package) - "Return true if PACKAGE is an X.org package, developed by X.org." - (define xorg-uri? - (match-lambda - ((? string? uri) - (string-prefix? "mirror://xorg/" uri)) - (_ - #f))) - - (match (package-source package) - ((? origin? origin) - (match (origin-uri origin) - ((? xorg-uri?) #t) - (_ #f))) - (_ #f))) - (define (latest-xorg-release package) "Return the latest release of PACKAGE, the name of an X.org package." (let ((uri (string->uri (origin-uri (package-source package))))) @@ -557,6 +533,22 @@ elpa.gnu.org, and all the GNOME packages." #:directory (string-append "/pub/xorg/" (dirname (uri-path uri))))))) +(define (latest-kernel.org-release package) + "Return the latest release of PACKAGE, the name of a kernel.org package." + (let ((uri (string->uri (origin-uri (package-source package))))) + (false-if-ftp-error + (latest-ftp-release + (package-name package) + #:server "ftp.free.fr" ;a mirror reachable over FTP + #:directory (string-append "/mirrors/ftp.kernel.org" + (dirname (uri-path uri))) + + ;; kernel.org provides "foo-x.y.tar.sign" files, which are signatures of + ;; the uncompressed tarball. + #:file->signature (lambda (tarball) + (string-append (file-sans-extension tarball) + ".sign")))))) + (define %gnu-updater (upstream-updater (name 'gnu) @@ -575,14 +567,21 @@ elpa.gnu.org, and all the GNOME packages." (upstream-updater (name 'kde) (description "Updater for KDE packages") - (pred kde-package?) + (pred (url-prefix-predicate "mirror://kde/")) (latest latest-kde-release))) (define %xorg-updater (upstream-updater (name 'xorg) (description "Updater for X.org packages") - (pred xorg-package?) + (pred (url-prefix-predicate "mirror://xorg/")) (latest latest-xorg-release))) +(define %kernel.org-updater + (upstream-updater + (name 'kernel.org) + (description "Updater for packages hosted on kernel.org") + (pred (url-prefix-predicate "mirror://kernel.org/")) + (latest latest-kernel.org-release))) + ;;; gnu-maintenance.scm ends here diff --git a/guix/grafts.scm b/guix/grafts.scm index dda7c1d235..2006d3908e 100644 --- a/guix/grafts.scm +++ b/guix/grafts.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -214,6 +214,17 @@ available." (delete-duplicates (concatenate refs) string=?)) result)))))) +(define-syntax-rule (with-cache key exp ...) + "Cache the value of monadic expression EXP under KEY." + (mlet %state-monad ((cache (current-state))) + (match (vhash-assq key cache) + ((_ . result) ;cache hit + (return result)) + (#f ;cache miss + (mlet %state-monad ((result (begin exp ...))) + (set-current-state (vhash-consq key result cache)) + (return result)))))) + (define* (cumulative-grafts store drv grafts references #:key @@ -252,48 +263,39 @@ derivations to the corresponding set of grafts." #:system system)) (state-return grafts)))) - (define (return/cache cache value) - (mbegin %state-monad - (set-current-state (vhash-consq drv value cache)) - (return value))) - - (mlet %state-monad ((cache (current-state))) - (match (vhash-assq drv cache) - ((_ . grafts) ;hit + (with-cache drv + (match (non-self-references references drv outputs) + (() ;no dependencies (return grafts)) - (#f ;miss - (match (non-self-references references drv outputs) - (() ;no dependencies - (return/cache cache grafts)) - (deps ;one or more dependencies - (mlet %state-monad ((grafts (mapm %state-monad dependency-grafts deps))) - (let ((grafts (delete-duplicates (concatenate grafts) equal?))) - (match (filter (lambda (graft) - (member (graft-origin-file-name graft) deps)) - grafts) - (() - (return/cache cache grafts)) - ((applicable ..1) - ;; Use APPLICABLE, the subset of GRAFTS that is really - ;; applicable to DRV, to avoid creating several identical - ;; grafted variants of DRV. - (let* ((new (graft-derivation/shallow store drv applicable - #:guile guile - #:system system)) - - ;; Replace references to any of the outputs of DRV, - ;; even if that's more than needed. This is so that - ;; the result refers only to the outputs of NEW and - ;; not to those of DRV. - (grafts (append (map (lambda (output) - (graft - (origin drv) - (origin-output output) - (replacement new) - (replacement-output output))) - (derivation-output-names drv)) - grafts))) - (return/cache cache grafts)))))))))))) + (deps ;one or more dependencies + (mlet %state-monad ((grafts (mapm %state-monad dependency-grafts deps))) + (let ((grafts (delete-duplicates (concatenate grafts) equal?))) + (match (filter (lambda (graft) + (member (graft-origin-file-name graft) deps)) + grafts) + (() + (return grafts)) + ((applicable ..1) + ;; Use APPLICABLE, the subset of GRAFTS that is really + ;; applicable to DRV, to avoid creating several identical + ;; grafted variants of DRV. + (let* ((new (graft-derivation/shallow store drv applicable + #:guile guile + #:system system)) + + ;; Replace references to any of the outputs of DRV, + ;; even if that's more than needed. This is so that + ;; the result refers only to the outputs of NEW and + ;; not to those of DRV. + (grafts (append (map (lambda (output) + (graft + (origin drv) + (origin-output output) + (replacement new) + (replacement-output output))) + (derivation-output-names drv)) + grafts))) + (return grafts)))))))))) (define* (graft-derivation store drv grafts #:key (guile (%guile-for-build)) @@ -333,4 +335,8 @@ it otherwise. It returns the previous setting." (lambda (store) (values (%graft? enable?) store))) +;; Local Variables: +;; eval: (put 'with-cache 'scheme-indent-function 1) +;; End: + ;;; grafts.scm ends here diff --git a/guix/graph.scm b/guix/graph.scm index 735d340c2c..7af2cd3b80 100644 --- a/guix/graph.scm +++ b/guix/graph.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ #:use-module (guix monads) #:use-module (guix records) #:use-module (guix sets) + #:use-module (rnrs io ports) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) @@ -41,9 +43,13 @@ node-transitive-edges node-reachable-count + %graph-backends + %d3js-backend %graphviz-backend graph-backend? graph-backend + graph-backend-name + graph-backend-description export-graph)) @@ -140,12 +146,14 @@ typically returned by 'node-edges' or 'node-back-edges'." ;;; (define-record-type <graph-backend> - (graph-backend prologue epilogue node edge) + (graph-backend name description prologue epilogue node edge) graph-backend? - (prologue graph-backend-prologue) - (epilogue graph-backend-epilogue) - (node graph-backend-node) - (edge graph-backend-edge)) + (name graph-backend-name) + (description graph-backend-description) + (prologue graph-backend-prologue) + (epilogue graph-backend-epilogue) + (node graph-backend-node) + (edge graph-backend-edge)) (define %colors ;; See colortbl.h in Graphviz. @@ -170,9 +178,66 @@ typically returned by 'node-edges' or 'node-back-edges'." id1 id2 (pop-color id1))) (define %graphviz-backend - (graph-backend emit-prologue emit-epilogue + (graph-backend "graphviz" + "Generate graph in DOT format for use with Graphviz." + emit-prologue emit-epilogue emit-node emit-edge)) + +;;; +;;; d3js export. +;;; + +(define (emit-d3js-prologue name port) + (format port "\ +<!DOCTYPE html> +<html> + <head> + <meta charset=\"utf-8\"> + <style> +text { + font: 10px sans-serif; + pointer-events: none; +} + </style> + <script type=\"text/javascript\" src=\"~a\"></script> + </head> + <body> + <script type=\"text/javascript\"> +var nodes = {}, + nodeArray = [], + links = []; +" (search-path %load-path "d3.v3.js"))) + +(define (emit-d3js-epilogue port) + (format port "</script><script type=\"text/javascript\" src=\"~a\"></script></body></html>" + (search-path %load-path "graph.js"))) + +(define (emit-d3js-node id label port) + (format port "\ +nodes[\"~a\"] = {\"id\": \"~a\", \"label\": \"~a\", \"index\": nodeArray.length}; +nodeArray.push(nodes[\"~a\"]);~%" + id id label id)) + +(define (emit-d3js-edge id1 id2 port) + (format port "links.push({\"source\": \"~a\", \"target\": \"~a\"});~%" + id1 id2)) + +(define %d3js-backend + (graph-backend "d3js" + "Generate chord diagrams with d3js." + emit-d3js-prologue emit-d3js-epilogue + emit-d3js-node emit-d3js-edge)) + + +;;; +;;; Shared. +;;; + +(define %graph-backends + (list %graphviz-backend + %d3js-backend)) + (define* (export-graph sinks port #:key reverse-edges? node-type @@ -181,7 +246,7 @@ typically returned by 'node-edges' or 'node-back-edges'." given BACKEND. Use NODE-TYPE to traverse the DAG. When REVERSE-EDGES? is true, draw reverse arrows." (match backend - (($ <graph-backend> emit-prologue emit-epilogue emit-node emit-edge) + (($ <graph-backend> _ _ emit-prologue emit-epilogue emit-node emit-edge) (emit-prologue (node-type-name node-type) port) (match node-type diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm index d244969c9e..b19d56ddcf 100644 --- a/guix/import/cpan.scm +++ b/guix/import/cpan.scm @@ -24,18 +24,23 @@ #:use-module ((ice-9 popen) #:select (open-pipe* close-pipe)) #:use-module ((ice-9 rdelim) #:select (read-line)) #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) #:use-module (json) #:use-module (guix hash) #:use-module (guix store) #:use-module (guix utils) #:use-module (guix base32) - #:use-module ((guix download) #:select (download-to-store)) - #:use-module (guix import utils) + #:use-module (guix ui) + #:use-module ((guix download) #:select (download-to-store url-fetch)) + #:use-module ((guix import utils) #:select (factorize-uri + flatten assoc-ref*)) #:use-module (guix import json) #:use-module (guix packages) + #:use-module (guix upstream) #:use-module (guix derivations) #:use-module (gnu packages perl) - #:export (cpan->guix-package)) + #:export (cpan->guix-package + %cpan-updater)) ;;; Commentary: ;;; @@ -84,28 +89,49 @@ module is distributed with 'Test::Simple', so (module->dist-name \"ok\") would return \"Test-Simple\"" (assoc-ref (json-fetch (string-append "https://api.metacpan.org/module/" - module)) + module + "?fields=distribution")) "distribution")) -(define (cpan-fetch module) +(define (package->upstream-name package) + "Return the CPAN name of PACKAGE." + (let* ((properties (package-properties package)) + (upstream-name (and=> properties + (cut assoc-ref <> 'upstream-name)))) + (or upstream-name + (match (package-source package) + ((? origin? origin) + (match (origin-uri origin) + ((or (? string? url) (url _ ...)) + (match (string-match (string-append "([^/]*)-v?[0-9\\.]+") url) + (#f #f) + (m (match:substring m 1)))) + (_ #f))) + (_ #f))))) + +(define (cpan-fetch name) "Return an alist representation of the CPAN metadata for the perl module MODULE, or #f on failure. MODULE should be e.g. \"Test::Script\"" ;; This API always returns the latest release of the module. - (json-fetch (string-append "https://api.metacpan.org/release/" - ;; XXX: The 'release' api requires the "release" - ;; name of the package. This substitution seems - ;; reasonably consistent across packages. - (module->name module)))) + (json-fetch (string-append "https://api.metacpan.org/release/" name))) (define (cpan-home name) (string-append "http://search.cpan.org/dist/" name)) -(define (fix-source-url download-url) - "Return a new download URL based on DOWNLOAD-URL which now uses our mirrors, -if the original's domain was metacpan." - (regexp-substitute/global #f "http[s]?://cpan.metacpan.org" download-url +(define (cpan-source-url meta) + "Return the download URL for a module's source tarball." + (regexp-substitute/global #f "http[s]?://cpan.metacpan.org" + (assoc-ref meta "download_url") 'pre "mirror://cpan" 'post)) +(define (cpan-version meta) + "Return the version number from META." + (match (assoc-ref meta "version") + ((? number? version) + ;; version is sometimes not quoted in the module json, so it gets + ;; imported into Guile as a number, so convert it to a string. + (number->string version)) + (version version))) (define %corelist (delay @@ -116,6 +142,31 @@ if the original's domain was metacpan." (and (access? core X_OK) core)))) +(define core-module? + (let ((perl-version (package-version perl)) + (rx (make-regexp + (string-append "released with perl v?([0-9\\.]*)" + "(.*and removed from v?([0-9\\.]*))?")))) + (lambda (name) + (define (version-between? lower version upper) + (and (version>=? version lower) + (or (not upper) + (version>? upper version)))) + (and (force %corelist) + (parameterize ((current-error-port (%make-void-port "w"))) + (let* ((corelist (open-pipe* OPEN_READ (force %corelist) name))) + (let loop () + (let ((line (read-line corelist))) + (if (eof-object? line) + (begin (close-pipe corelist) #f) + (or (and=> (regexp-exec rx line) + (lambda (m) + (let ((first (match:substring m 1)) + (last (match:substring m 3))) + (version-between? + first perl-version last)))) + (loop))))))))))) + (define (cpan-module->sexp meta) "Return the `package' s-expression for a CPAN module from the metadata in META." @@ -127,35 +178,8 @@ META." (string-downcase name) (string-append "perl-" (string-downcase name)))) - (define version - (match (assoc-ref meta "version") - ((? number? vrs) (number->string vrs)) - ((? string? vrs) vrs))) - - (define core-module? - (let ((perl-version (package-version perl)) - (rx (make-regexp - (string-append "released with perl v?([0-9\\.]*)" - "(.*and removed from v?([0-9\\.]*))?")))) - (lambda (name) - (define (version-between? lower version upper) - (and (version>=? version lower) - (or (not upper) - (version>? upper version)))) - (and (force %corelist) - (parameterize ((current-error-port (%make-void-port "w"))) - (let* ((corelist (open-pipe* OPEN_READ (force %corelist) name))) - (let loop () - (let ((line (read-line corelist))) - (if (eof-object? line) - (begin (close-pipe corelist) #f) - (or (and=> (regexp-exec rx line) - (lambda (m) - (let ((first (match:substring m 1)) - (last (match:substring m 3))) - (version-between? - first perl-version last)))) - (loop))))))))))) + (define version (cpan-version meta)) + (define source-url (cpan-source-url meta)) (define (convert-inputs phases) ;; Convert phase dependencies into a list of name/variable pairs. @@ -193,8 +217,6 @@ META." (list (list guix-name (list 'quasiquote inputs)))))) - (define source-url (fix-source-url (assoc-ref meta "download_url"))) - (let ((tarball (with-store store (download-to-store store source-url)))) `(package @@ -224,5 +246,61 @@ META." (define (cpan->guix-package module-name) "Fetch the metadata for PACKAGE-NAME from metacpan.org, and return the `package' s-expression corresponding to that package, or #f on failure." - (let ((module-meta (cpan-fetch module-name))) + (let ((module-meta (cpan-fetch (module->name module-name)))) (and=> module-meta cpan-module->sexp))) + +(define (cpan-package? package) + "Return #t if PACKAGE is a package from CPAN." + (define cpan-url? + (let ((cpan-rx (make-regexp (string-append "(" + "mirror://cpan" "|" + "https?://www.cpan.org" "|" + "https?://cpan.metacpan.org" + ")")))) + (lambda (url) + (regexp-exec cpan-rx url)))) + + (let ((source-url (and=> (package-source package) origin-uri)) + (fetch-method (and=> (package-source package) origin-method))) + (and (eq? fetch-method url-fetch) + (match source-url + ((? string?) + (cpan-url? source-url)) + ((source-url ...) + (any cpan-url? source-url)))))) + +(define (latest-release package) + "Return an <upstream-source> for the latest release of PACKAGE." + (match (cpan-fetch (package->upstream-name package)) + (#f #f) + (meta + (let ((core-inputs + (match (package-direct-inputs package) + (((_ inputs _ ...) ...) + (filter-map (match-lambda + ((and (? package?) + (? cpan-package?) + (= package->upstream-name + (? core-module? name))) + name) + (else #f)) + inputs))))) + ;; Warn about inputs that are part of perl's core + (unless (null? core-inputs) + (for-each (lambda (module) + (warning (_ "input '~a' of ~a is in Perl core~%") + module (package-name package))) + core-inputs))) + (let ((version (cpan-version meta)) + (url (cpan-source-url meta))) + (upstream-source + (package (package-name package)) + (version version) + (urls url)))))) + +(define %cpan-updater + (upstream-updater + (name 'cpan) + (description "Updater for CPAN packages") + (pred cpan-package?) + (latest latest-release))) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index 3fb2e213b0..463a25514e 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -23,6 +23,11 @@ #:use-module ((ice-9 rdelim) #:select (read-string)) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-41) + #:use-module (ice-9 receive) + #:use-module (web uri) + #:use-module (guix combinators) #:use-module (guix http-client) #:use-module (guix hash) #:use-module (guix store) @@ -32,8 +37,10 @@ #:use-module ((guix build-system r) #:select (cran-uri bioconductor-uri)) #:use-module (guix upstream) #:use-module (guix packages) + #:use-module (gnu packages) #:export (cran->guix-package bioconductor->guix-package + recursive-import %cran-updater %bioconductor-updater)) @@ -51,19 +58,21 @@ ("Artistic-2.0" 'artistic2.0) ("Apache License 2.0" 'asl2.0) ("BSD_2_clause" 'bsd-2) + ("BSD_2_clause + file LICENSE" 'bsd-2) ("BSD_3_clause" 'bsd-3) + ("BSD_3_clause + file LICENSE" 'bsd-3) ("GPL" (list 'gpl2+ 'gpl3+)) ("GPL (>= 2)" 'gpl2+) ("GPL (>= 3)" 'gpl3+) - ("GPL-2" 'gpl2+) - ("GPL-3" 'gpl3+) - ("LGPL-2" 'lgpl2.0+) - ("LGPL-2.1" 'lgpl2.1+) - ("LGPL-3" 'lgpl3+) + ("GPL-2" 'gpl2) + ("GPL-3" 'gpl3) + ("LGPL-2" 'lgpl2.0) + ("LGPL-2.1" 'lgpl2.1) + ("LGPL-3" 'lgpl3) ("LGPL (>= 2)" 'lgpl2.0+) ("LGPL (>= 3)" 'lgpl3+) - ("MIT" 'x11) - ("MIT + file LICENSE" 'x11) + ("MIT" 'expat) + ("MIT + file LICENSE" 'expat) ((x) (string->license x)) ((lst ...) `(list ,@(map string->license lst))) (_ #f))) @@ -121,10 +130,18 @@ package definition." (define (fetch-description base-url name) "Return an alist of the contents of the DESCRIPTION file for the R package -NAME, or #f on failure. NAME is case-sensitive." +NAME, or #f in case of failure. NAME is case-sensitive." ;; This API always returns the latest release of the module. (let ((url (string-append base-url name "/DESCRIPTION"))) - (description->alist (read-string (http-fetch url))))) + (guard (c ((http-get-error? c) + (format (current-error-port) + "error: failed to retrieve package information \ +from ~s: ~a (~s)~%" + (uri->string (http-get-error-uri c)) + (http-get-error-code c) + (http-get-error-reason c)) + #f)) + (description->alist (read-string (http-fetch url)))))) (define (listify meta field) "Look up FIELD in the alist META. If FIELD contains a comma-separated @@ -146,14 +163,49 @@ empty list when the FIELD cannot be found." (string-any char-set:whitespace item))) (map string-trim-both items)))))) +(define default-r-packages + (list "KernSmooth" + "MASS" + "Matrix" + "base" + "boot" + "class" + "cluster" + "codetools" + "compiler" + "datasets" + "foreign" + "grDevices" + "graphics" + "grid" + "lattice" + "methods" + "mgcv" + "nlme" + "nnet" + "parallel" + "rpart" + "spatial" + "splines" + "stats" + "stats4" + "survival" + "tcltk" + "tools" + "translations" + "utils")) + +(define (guix-name name) + "Return a Guix package name for a given R package name." + (string-append "r-" (string-map (match-lambda + (#\_ #\-) + (#\. #\-) + (chr (char-downcase chr))) + name))) + (define (description->package repository meta) "Return the `package' s-expression for an R package published on REPOSITORY from the alist META, which was derived from the R package's DESCRIPTION file." - (define (guix-name name) - (if (string-prefix? "r-" name) - (string-downcase name) - (string-append "r-" (string-downcase name)))) - (let* ((base-url (case repository ((cran) %cran-url) ((bioconductor) %bioconductor-url))) @@ -174,42 +226,107 @@ from the alist META, which was derived from the R package's DESCRIPTION file." (_ #f))) (tarball (with-store store (download-to-store store source-url))) (sysdepends (map string-downcase (listify meta "SystemRequirements"))) - (propagate (map guix-name (lset-union equal? - (listify meta "Imports") - (listify meta "LinkingTo") - (delete "R" - (listify meta "Depends")))))) - `(package - (name ,(guix-name name)) - (version ,version) - (source (origin - (method url-fetch) - (uri (,(procedure-name uri-helper) ,name version)) - (sha256 - (base32 - ,(bytevector->nix-base32-string (file-sha256 tarball)))))) - ,@(if (not (equal? (string-append "r-" name) - (guix-name name))) - `((properties ,`(,'quasiquote ((,'upstream-name . ,name))))) - '()) - (build-system r-build-system) - ,@(maybe-inputs sysdepends) - ,@(maybe-inputs propagate 'propagated-inputs) - (home-page ,(if (string-null? home-page) - (string-append base-url name) - home-page)) - (synopsis ,synopsis) - (description ,(beautify-description (assoc-ref meta "Description"))) - (license ,license)))) - -(define* (cran->guix-package package-name #:optional (repo 'cran)) - "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' + (propagate (filter (lambda (name) + (not (member name default-r-packages))) + (lset-union equal? + (listify meta "Imports") + (listify meta "LinkingTo") + (delete "R" + (listify meta "Depends")))))) + (values + `(package + (name ,(guix-name name)) + (version ,version) + (source (origin + (method url-fetch) + (uri (,(procedure-name uri-helper) ,name version)) + (sha256 + (base32 + ,(bytevector->nix-base32-string (file-sha256 tarball)))))) + ,@(if (not (equal? (string-append "r-" name) + (guix-name name))) + `((properties ,`(,'quasiquote ((,'upstream-name . ,name))))) + '()) + (build-system r-build-system) + ,@(maybe-inputs sysdepends) + ,@(maybe-inputs (map guix-name propagate) 'propagated-inputs) + (home-page ,(if (string-null? home-page) + (string-append base-url name) + home-page)) + (synopsis ,synopsis) + (description ,(beautify-description (or (assoc-ref meta "Description") + ""))) + (license ,license)) + propagate))) + +(define cran->guix-package + (memoize + (lambda* (package-name #:optional (repo 'cran)) + "Fetch the metadata for PACKAGE-NAME from REPO and return the `package' s-expression corresponding to that package, or #f on failure." - (let* ((url (case repo - ((cran) %cran-url) - ((bioconductor) %bioconductor-svn-url))) - (module-meta (fetch-description url package-name))) - (and=> module-meta (cut description->package repo <>)))) + (let* ((url (case repo + ((cran) %cran-url) + ((bioconductor) %bioconductor-svn-url))) + (module-meta (fetch-description url package-name))) + (and=> module-meta (cut description->package repo <>)))))) + +(define* (recursive-import package-name #:optional (repo 'cran)) + "Generate a stream of package expressions for PACKAGE-NAME and all its +dependencies." + (receive (package . dependencies) + (cran->guix-package package-name repo) + (if (not package) + stream-null + + ;; Generate a lazy stream of package expressions for all unknown + ;; dependencies in the graph. + (let* ((make-state (lambda (queue done) + (cons queue done))) + (next (match-lambda + (((next . rest) . done) next))) + (imported (match-lambda + ((queue . done) done))) + (done? (match-lambda + ((queue . done) + (zero? (length queue))))) + (unknown? (lambda* (dependency #:optional (done '())) + (and (not (member dependency + done)) + (null? (find-packages-by-name + (guix-name dependency)))))) + (update (lambda (state new-queue) + (match state + (((head . tail) . done) + (make-state (lset-difference + equal? + (lset-union equal? new-queue tail) + done) + (cons head done))))))) + (stream-cons + package + (stream-unfold + ;; map: produce a stream element + (lambda (state) + (cran->guix-package (next state) repo)) + + ;; predicate + (compose not done?) + + ;; generator: update the queue + (lambda (state) + (receive (package . dependencies) + (cran->guix-package (next state) repo) + (if package + (update state (filter (cut unknown? <> + (cons (next state) + (imported state))) + (car dependencies))) + ;; TODO: Try the other archives before giving up + (update state (imported state))))) + + ;; initial state + (make-state (filter unknown? (car dependencies)) + (list package-name)))))))) ;;; diff --git a/guix/import/crate.scm b/guix/import/crate.scm new file mode 100644 index 0000000000..233a20e983 --- /dev/null +++ b/guix/import/crate.scm @@ -0,0 +1,165 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix import crate) + #:use-module (guix base32) + #:use-module (guix build-system cargo) + #:use-module ((guix download) #:prefix download:) + #:use-module (guix hash) + #:use-module (guix http-client) + #:use-module (guix import json) + #:use-module (guix import utils) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix monads) + #:use-module (guix packages) + #:use-module (guix upstream) + #:use-module (guix utils) + #:use-module (ice-9 match) + #:use-module (ice-9 pretty-print) ; recursive + #:use-module (json) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-2) + #:use-module (srfi srfi-26) + #:export (crate->guix-package + guix-package->crate-name + %crate-updater)) + +(define (crate-fetch crate-name callback) + "Fetch the metadata for CRATE-NAME from crates.io and call the callback." + + (define (crates->inputs crates) + (sort (map (cut assoc-ref <> "crate_id") crates) string-ci<?)) + + (define (string->license string) + (map spdx-string->license (string-split string #\/))) + + (define (crate-kind-predicate kind) + (lambda (dep) (string=? (assoc-ref dep "kind") kind))) + + (and-let* ((crate-json (json-fetch (string-append crate-url crate-name))) + (crate (assoc-ref crate-json "crate")) + (name (assoc-ref crate "name")) + (version (assoc-ref crate "max_version")) + (homepage (assoc-ref crate "homepage")) + (repository (assoc-ref crate "repository")) + (synopsis (assoc-ref crate "description")) + (description (assoc-ref crate "description")) + (license (string->license (assoc-ref crate "license"))) + (path (string-append "/" version "/dependencies")) + (deps-json (json-fetch (string-append crate-url name path))) + (deps (assoc-ref deps-json "dependencies")) + (input-crates (filter (crate-kind-predicate "normal") deps)) + (native-input-crates + (filter (lambda (dep) + (not ((crate-kind-predicate "normal") dep))) deps)) + (inputs (crates->inputs input-crates)) + (native-inputs (crates->inputs native-input-crates)) + (home-page (match homepage + (() repository) + (_ homepage)))) + (callback #:name name #:version version + #:inputs inputs #:native-inputs native-inputs + #:home-page home-page #:synopsis synopsis + #:description description #:license license))) + +(define* (make-crate-sexp #:key name version inputs native-inputs + home-page synopsis description license + #:allow-other-keys) + "Return the `package' s-expression for a rust package with the given NAME, +VERSION, INPUTS, NATIVE-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." + (let* ((port (http-fetch (crate-uri name version))) + (guix-name (crate-name->package-name name)) + (inputs (map crate-name->package-name inputs)) + (native-inputs (map crate-name->package-name native-inputs)) + (pkg `(package + (name ,guix-name) + (version ,version) + (source (origin + (method url-fetch) + (uri (crate-uri ,name version)) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + ,(bytevector->nix-base32-string (port-sha256 port)))))) + (build-system cargo-build-system) + ,@(maybe-native-inputs native-inputs "src") + ,@(maybe-inputs inputs "src") + (home-page ,(match home-page + (() "") + (_ home-page))) + (synopsis ,synopsis) + (description ,(beautify-description description)) + (license ,(match license + (() #f) + ((license) license) + (_ `(list ,@license))))))) + (close-port port) + pkg)) + +(define (crate->guix-package crate-name) + "Fetch the metadata for CRATE-NAME from crates.io, and return the +`package' s-expression corresponding to that package, or #f on failure." + (crate-fetch crate-name make-crate-sexp)) + +(define (guix-package->crate-name package) + "Return the crate name of PACKAGE." + (and-let* ((origin (package-source package)) + (uri (origin-uri origin)) + (crate-url? uri) + (len (string-length crate-url)) + (path (xsubstring uri len)) + (parts (string-split path #\/))) + (match parts + ((name _ ...) name)))) + +(define (crate-name->package-name name) + (string-append "rust-" (string-join (string-split name #\_) "-"))) + +;;; +;;; Updater +;;; + +(define (crate-package? package) + "Return true if PACKAGE is a Rust crate from crates.io." + (let ((source-url (and=> (package-source package) origin-uri)) + (fetch-method (and=> (package-source package) origin-method))) + (and (eq? fetch-method download:url-fetch) + (match source-url + ((? string?) + (crate-url? source-url)) + ((source-url ...) + (any crate-url? source-url)))))) + +(define (latest-release package) + "Return an <upstream-source> for the latest release of PACKAGE." + (let* ((crate-name (guix-package->crate-name package)) + (callback (lambda* (#:key version #:allow-other-keys) version)) + (version (crate-fetch crate-name callback)) + (url (crate-uri crate-name version))) + (upstream-source + (package (package-name package)) + (version version) + (urls (list url))))) + +(define %crate-updater + (upstream-updater + (name 'crates) + (description "Updater for crates.io packages") + (pred crate-package?) + (latest latest-release))) + diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm index 320a09e8c6..96cf5bbae6 100644 --- a/guix/import/elpa.scm +++ b/guix/import/elpa.scm @@ -89,7 +89,13 @@ NAMES (strings)." "Fetch URL, store the content in a temporary file and call PROC with that file. Returns the value returned by PROC. On error call ERROR-THUNK and return its value or leave if it's false." - (proc (http-fetch/cached (string->uri url)))) + (catch #t + (lambda () + (proc (http-fetch/cached (string->uri url)))) + (lambda (key . args) + (if error-thunk + (error-thunk) + (leave (_ "~A: download failed~%") url))))) (define (is-elpa-package? name elpa-pkg-spec) "Return true if the string NAME corresponds to the name of the package @@ -222,7 +228,7 @@ type '<elpa-package>'." (bytevector->nix-base32-string (file-sha256 tarball)) "failed to download package"))))) (build-system emacs-build-system) - ,@(maybe-inputs 'inputs dependencies) + ,@(maybe-inputs 'propagated-inputs dependencies) (home-page ,(elpa-package-home-page pkg)) (synopsis ,(elpa-package-synopsis pkg)) (description ,(elpa-package-description pkg)) diff --git a/guix/import/gem.scm b/guix/import/gem.scm index 3d0c190656..3ad7facc7f 100644 --- a/guix/import/gem.scm +++ b/guix/import/gem.scm @@ -38,14 +38,8 @@ (define (rubygems-fetch name) "Return an alist representation of the RubyGems metadata for the package NAME, or #f on failure." - ;; XXX: We want to silence the download progress report, which is especially - ;; annoying for 'guix refresh', but we have to use a file port. - (call-with-output-file "/dev/null" - (lambda (null) - (with-error-to-port null - (lambda () - (json-fetch - (string-append "https://rubygems.org/api/v1/gems/" name ".json"))))))) + (json-fetch + (string-append "https://rubygems.org/api/v1/gems/" name ".json"))) (define (ruby-package-name name) "Given the NAME of a package on RubyGems, return a Guix-compliant name for diff --git a/guix/import/github.scm b/guix/import/github.scm index 0843ddeefd..01452b12e3 100644 --- a/guix/import/github.scm +++ b/guix/import/github.scm @@ -23,23 +23,12 @@ #:use-module (guix utils) #:use-module ((guix download) #:prefix download:) #:use-module (guix import utils) + #:use-module (guix import json) #:use-module (guix packages) #:use-module (guix upstream) #:use-module (web uri) #:export (%github-updater)) -(define (json-fetch* url) - "Return a list/hash representation of the JSON resource URL, or #f on -failure." - (call-with-output-file "/dev/null" - (lambda (null) - (with-error-to-port null - (lambda () - (call-with-temporary-output-file - (lambda (temp port) - (and (url-fetch url temp) - (call-with-input-file temp json->scm))))))))) - (define (find-extension url) "Return the extension of the archive e.g. '.tar.gz' given a URL, or false if none is recognized" @@ -136,7 +125,7 @@ the package e.g. 'bedtools2'. Return #f if there is no releases" "https://api.github.com/repos/" (github-user-slash-repository url) "/releases")) - (json (json-fetch* + (json (json-fetch (if token (string-append api-url "?access_token=" token) api-url)))) diff --git a/guix/import/json.scm b/guix/import/json.scm index c3092a5a9d..5940f5e48f 100644 --- a/guix/import/json.scm +++ b/guix/import/json.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson <davet@gnu.org> -;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org> +;;; Copyright © 2015, 2016 Eric Bavier <bavier@member.fsf.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -19,14 +19,17 @@ (define-module (guix import json) #:use-module (json) - #:use-module (guix utils) + #:use-module (guix http-client) #:use-module (guix import utils) + #:use-module (srfi srfi-34) #:export (json-fetch)) (define (json-fetch url) "Return an alist representation of the JSON resource URL, or #f on failure." - (call-with-temporary-output-file - (lambda (temp port) - (and (url-fetch url temp) - (hash-table->alist - (call-with-input-file temp json->scm)))))) + (guard (c ((and (http-get-error? c) + (= 404 (http-get-error-code c))) + #f)) ;"expected" if package is unknown + (let* ((port (http-fetch url)) + (result (hash-table->alist (json->scm port)))) + (close-port port) + result))) diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm index 68153d5ab1..7cce0fc594 100644 --- a/guix/import/pypi.scm +++ b/guix/import/pypi.scm @@ -51,14 +51,8 @@ (define (pypi-fetch name) "Return an alist representation of the PyPI metadata for the package NAME, or #f on failure." - ;; XXX: We want to silence the download progress report, which is especially - ;; annoying for 'guix refresh', but we have to use a file port. - (call-with-output-file "/dev/null" - (lambda (null) - (with-error-to-port null - (lambda () - (json-fetch (string-append "https://pypi.python.org/pypi/" - name "/json"))))))) + (json-fetch (string-append "https://pypi.python.org/pypi/" + name "/json"))) ;; For packages found on PyPI that lack a source distribution. (define-condition-type &missing-source-error &error @@ -309,7 +303,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE." "Return true if PACKAGE is a Python package from PyPI." (define (pypi-url? url) - (string-prefix? "https://pypi.python.org/" url)) + (or (string-prefix? "https://pypi.python.org/" url) + (string-prefix? "https://pypi.io/packages" url))) (let ((source-url (and=> (package-source package) origin-uri)) (fetch-method (and=> (package-source package) origin-method))) diff --git a/guix/import/utils.scm b/guix/import/utils.scm index 057c2d9c7d..be1980d08f 100644 --- a/guix/import/utils.scm +++ b/guix/import/utils.scm @@ -22,6 +22,7 @@ #:use-module (guix base32) #:use-module ((guix build download) #:prefix build:) #:use-module (guix hash) + #:use-module (guix http-client) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix utils) #:use-module (ice-9 match) @@ -36,6 +37,10 @@ url-fetch guix-hash-url + maybe-inputs + maybe-native-inputs + package->definition + spdx-string->license license->symbol @@ -205,3 +210,34 @@ into a proper sentence and by using two spaces between sentences." ;; Use double spacing between sentences (regexp-substitute/global #f "\\. \\b" cleaned 'pre ". " 'post))) + +(define* (package-names->package-inputs names #:optional (output #f)) + (map (lambda (input) + (cons* input (list 'unquote (string->symbol input)) + (or (and output (list output)) + '()))) + names)) + +(define* (maybe-inputs package-names #:optional (output #f)) + "Given a list of PACKAGE-NAMES, tries to generate the 'inputs' field of a +package definition." + (match (package-names->package-inputs package-names output) + (() + '()) + ((package-inputs ...) + `((inputs (,'quasiquote ,package-inputs)))))) + +(define* (maybe-native-inputs package-names #:optional (output #f)) + "Given a list of PACKAGE-NAMES, tries to generate the 'inputs' field of a +package definition." + (match (package-names->package-inputs package-names output) + (() + '()) + ((package-inputs ...) + `((native-inputs (,'quasiquote ,package-inputs)))))) + +(define (package->definition guix-package) + (match guix-package + (('package ('name (? string? name)) _ ...) + `(define-public ,(string->symbol name) + ,guix-package)))) diff --git a/guix/profiles.scm b/guix/profiles.scm index 0b317ef51e..e7707b6543 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -919,10 +919,14 @@ files for the truetype fonts of the @var{manifest} entries." (define* (profile-derivation manifest #:key (hooks %default-profile-hooks) + (locales? #t) system) "Return a derivation that builds a profile (aka. 'user environment') with the given MANIFEST. The profile includes additional derivations returned by -the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc." +the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc. + +When LOCALES? is true, the build is performed under a UTF-8 locale; this adds +a dependency on the 'glibc-utf8-locales' package." (mlet %store-monad ((system (if system (return system) (current-system))) @@ -939,6 +943,19 @@ the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc." extras) (manifest-inputs manifest))) + (define glibc-utf8-locales ;lazy reference + (module-ref (resolve-interface '(gnu packages base)) + 'glibc-utf8-locales)) + + (define set-utf8-locale + ;; Some file names (e.g., in 'nss-certs') are UTF-8 encoded so + ;; install a UTF-8 locale. + #~(begin + (setenv "LOCPATH" + #$(file-append glibc-utf8-locales "/lib/locale/" + (package-version glibc-utf8-locales))) + (setlocale LC_ALL "en_US.utf8"))) + (define builder (with-imported-modules '((guix build profiles) (guix build union) @@ -953,6 +970,8 @@ the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc." (setvbuf (current-output-port) _IOLBF) (setvbuf (current-error-port) _IOLBF) + #+(if locales? set-utf8-locale #t) + (define search-paths ;; Search paths of MANIFEST's packages, converted back to their ;; record form. @@ -1099,7 +1118,8 @@ case when generations have been deleted (there are \"holes\")." "Link GENERATION, a string, to the empty profile. An error is raised if that fails." (let* ((drv (run-with-store store - (profile-derivation (manifest '())))) + (profile-derivation (manifest '()) + #:locales? #f))) (prof (derivation->output-path drv "out"))) (build-derivations store (list drv)) (switch-symlinks generation prof))) diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm index 400353247c..6eba9e0008 100644 --- a/guix/scripts/archive.scm +++ b/guix/scripts/archive.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -30,6 +31,7 @@ #:use-module (guix ui) #:use-module (guix pki) #:use-module (guix pk-crypto) + #:use-module (guix docker) #:use-module (guix scripts) #:use-module (guix scripts build) #:use-module (gnu packages) @@ -41,7 +43,8 @@ #:use-module (srfi srfi-26) #:use-module (srfi srfi-37) #:use-module (ice-9 binary-ports) - #:export (guix-archive)) + #:export (guix-archive + options->derivations+files)) ;;; @@ -62,6 +65,8 @@ Export/import one or more packages from/to the store.\n")) (display (_ " --export export the specified files/packages to stdout")) (display (_ " + --format=FMT export files/packages in the specified format FMT")) + (display (_ " -r, --recursive combined with '--export', include dependencies")) (display (_ " --import import from the archive passed on stdin")) @@ -116,6 +121,9 @@ Export/import one or more packages from/to the store.\n")) (option '("export") #f #f (lambda (opt name arg result) (alist-cons 'export #t result))) + (option '(#\f "format") #t #f + (lambda (opt name arg result . rest) + (alist-cons 'format arg result))) (option '(#\r "recursive") #f #f (lambda (opt name arg result) (alist-cons 'export-recursive? #t result))) @@ -330,7 +338,15 @@ the input port." (else (with-store store (cond ((assoc-ref opts 'export) - (export-from-store store opts)) + (cond ((equal? (assoc-ref opts 'format) "docker") + (match (car opts) + (('argument . (? store-path? item)) + (format #t "~a\n" + (build-docker-image + item + #:system (assoc-ref opts 'system)))) + (_ (leave (_ "argument must be a direct store path~%"))))) + (_ (export-from-store store opts)))) ((assoc-ref opts 'import) (import-paths store (current-input-port))) ((assoc-ref opts 'missing) diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm index 8c2c4902fc..ccb4c275fc 100644 --- a/guix/scripts/build.scm +++ b/guix/scripts/build.scm @@ -151,7 +151,11 @@ the new package's version number from URI." ;; Use #:recursive? #t to allow for directories. (source (download-to-store store uri - #:recursive? #t)))))) + #:recursive? #t)) + + ;; Override the replacement, otherwise '--with-source' would + ;; have no effect. + (replacement #f))))) ;;; diff --git a/guix/scripts/copy.scm b/guix/scripts/copy.scm new file mode 100644 index 0000000000..9ae204e6c6 --- /dev/null +++ b/guix/scripts/copy.scm @@ -0,0 +1,207 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix scripts copy) + #:use-module (guix ui) + #:use-module (guix scripts) + #:use-module (guix ssh) + #:use-module (guix store) + #:use-module (guix utils) + #:use-module (guix derivations) + #:use-module (guix scripts build) + #:use-module ((guix scripts archive) #:select (options->derivations+files)) + #:use-module (ssh session) + #:use-module (ssh auth) + #:use-module (ssh key) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-37) + #:use-module (ice-9 match) + #:use-module (ice-9 format) + #:export (guix-copy)) + + +;;; +;;; Exchanging store items over SSH. +;;; + +(define %compression + "zlib@openssh.com,zlib") + +(define* (open-ssh-session host #:key user port) + "Open an SSH session for HOST and return it. When USER and PORT are #f, use +default values or whatever '~/.ssh/config' specifies; otherwise use them. +Throw an error on failure." + (let ((session (make-session #:user user + #:host host + #:port port + #:timeout 10 ;seconds + ;; #:log-verbosity 'protocol + + ;; We need lightweight compression when + ;; exchanging full archives. + #:compression %compression + #:compression-level 3))) + + ;; Honor ~/.ssh/config. + (session-parse-config! session) + + (match (connect! session) + ('ok + ;; Let the SSH agent authenticate us to the server. + (match (userauth-agent! session) + ('success + session) + (x + (disconnect! session) + (leave (_ "SSH authentication failed for '~a': ~a~%") + host (get-error session))))) + (x + ;; Connection failed or timeout expired. + (leave (_ "SSH connection to '~a' failed: ~a~%") + host (get-error session)))))) + +(define (ssh-spec->user+host+port spec) + "Parse SPEC, a string like \"user@host:port\" or just \"host\", and return +three values: the user name (or #f), the host name, and the TCP port +number (or #f) corresponding to SPEC." + (define tokens + (char-set #\@ #\:)) + + (match (string-tokenize spec (char-set-complement tokens)) + ((host) + (values #f host #f)) + ((left right) + (if (string-index spec #\@) + (values left right #f) + (values #f left (string->number right)))) + ((user host port) + (match (string->number port) + ((? integer? port) + (values user host port)) + (x + (leave (_ "~a: invalid TCP port number~%") port)))) + (x + (leave (_ "~a: invalid SSH specification~%") spec)))) + +(define (send-to-remote-host target opts) + "Send ITEMS to TARGET. ITEMS is a list of store items or package names; for ; +package names, build the underlying packages before sending them." + (with-store local + (set-build-options-from-command-line local opts) + (let-values (((user host port) + (ssh-spec->user+host+port target)) + ((drv items) + (options->derivations+files local opts))) + (show-what-to-build local drv + #:use-substitutes? (assoc-ref opts 'substitutes?) + #:dry-run? (assoc-ref opts 'dry-run?)) + + (and (or (assoc-ref opts 'dry-run?) + (build-derivations local drv)) + (let* ((session (open-ssh-session host #:user user #:port port)) + (sent (send-files local items + (connect-to-remote-daemon session) + #:recursive? #t))) + (format #t "~{~a~%~}" sent) + sent))))) + +(define (retrieve-from-remote-host source opts) + "Retrieve ITEMS from SOURCE." + (with-store local + (let*-values (((user host port) + (ssh-spec->user+host+port source)) + ((session) + (open-ssh-session host #:user user #:port port)) + ((remote) + (connect-to-remote-daemon session))) + (set-build-options-from-command-line local opts) + ;; TODO: Here we could to compute and build the derivations on REMOTE + ;; rather than on LOCAL (one-off offloading) but that is currently too + ;; slow due to the many RPC round trips. So we just assume that REMOTE + ;; contains ITEMS. + (let*-values (((drv items) + (options->derivations+files local opts)) + ((retrieved) + (retrieve-files local items remote #:recursive? #t))) + (format #t "~{~a~%~}" retrieved) + retrieved)))) + + +;;; +;;; Options. +;;; + +(define (show-help) + (display (_ "Usage: guix copy [OPTION]... ITEMS... +Copy ITEMS to or from the specified host over SSH.\n")) + (display (_ " + --to=HOST send ITEMS to HOST")) + (display (_ " + --from=HOST receive ITEMS from HOST")) + (newline) + (show-build-options-help) + (newline) + (display (_ " + -h, --help display this help and exit")) + (display (_ " + -V, --version display version information and exit")) + (newline) + (show-bug-report-information)) + +(define %options + ;; Specifications of the command-line options. + (cons* (option '("to") #t #f + (lambda (opt name arg result) + (alist-cons 'destination arg result))) + (option '("from") #t #f + (lambda (opt name arg result) + (alist-cons 'source arg result))) + (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + (option '(#\V "version") #f #f + (lambda args + (show-version-and-exit "guix copy"))) + (option '(#\s "system") #t #f + (lambda (opt name arg result) + (alist-cons 'system arg + (alist-delete 'system result eq?)))) + %standard-build-options)) + +(define %default-options + `((system . ,(%current-system)) + (substitutes? . #t) + (graft? . #t) + (max-silent-time . 3600) + (verbosity . 0))) + + +;;; +;;; Entry point. +;;; + +(define (guix-copy . args) + (with-error-handling + (let* ((opts (parse-command-line args %options (list %default-options))) + (source (assoc-ref opts 'source)) + (target (assoc-ref opts 'destination))) + (cond (target (send-to-remote-host target opts)) + (source (retrieve-from-remote-host source opts)) + (else (leave (_ "use '--to' or '--from'~%"))))))) diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm index 6dea67ca22..1d3be6a84f 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -155,6 +155,9 @@ COMMAND or an interactive shell in that environment.\n")) (display (_ " -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\"")) (display (_ " + -r, --root=FILE make FILE a symlink to the result, and register it + as a garbage collector root")) + (display (_ " -C, --container run command within an isolated container")) (display (_ " -N, --network allow containers to access the network")) @@ -247,6 +250,9 @@ COMMAND or an interactive shell in that environment.\n")) (alist-cons 'file-system-mapping (specification->file-system-mapping arg #f) result))) + (option '(#\r "root") #t #f + (lambda (opt name arg result) + (alist-cons 'gc-root arg result))) (option '("bootstrap") #f #f (lambda (opt name arg result) (alist-cons 'bootstrap? #t result))) @@ -323,7 +329,8 @@ profile." #:system system #:hooks (if bootstrap? '() - %default-profile-hooks))) + %default-profile-hooks) + #:locales? (not bootstrap?))) (define requisites* (store-lift requisites)) @@ -522,7 +529,26 @@ message if any test fails." (report-error (_ "cannot create container: /proc/self/setgroups does not exist\n")) (leave (_ "is your kernel version < 3.19?\n")))) -;; Entry point. +(define (register-gc-root target root) + "Make ROOT an indirect root to TARGET. This is procedure is idempotent." + (let* ((root (string-append (canonicalize-path (dirname root)) + "/" root))) + (catch 'system-error + (lambda () + (symlink target root) + ((store-lift add-indirect-root) root)) + (lambda args + (if (and (= EEXIST (system-error-errno args)) + (equal? (false-if-exception (readlink root)) target)) + (with-monad %store-monad + (return #t)) + (apply throw args)))))) + + +;;; +;;; Entry point. +;;; + (define (guix-environment . args) (with-error-handling (let* ((opts (parse-args args)) @@ -578,7 +604,9 @@ message if any test fails." system)) (prof-drv (inputs->profile-derivation inputs system bootstrap?)) - (profile -> (derivation->output-path prof-drv))) + (profile -> (derivation->output-path prof-drv)) + (gc-root -> (assoc-ref opts 'gc-root))) + ;; First build the inputs. This is necessary even for ;; --search-paths. Additionally, we might need to build bash for ;; a container. @@ -587,6 +615,9 @@ message if any test fails." (list prof-drv bash) (list prof-drv)) opts) + (mwhen gc-root + (register-gc-root profile gc-root)) + (cond ((assoc-ref opts 'dry-run?) (return #t)) diff --git a/guix/scripts/graph.scm b/guix/scripts/graph.scm index 2f70d64c90..79ce503a2e 100644 --- a/guix/scripts/graph.scm +++ b/guix/scripts/graph.scm @@ -37,6 +37,7 @@ #:use-module (srfi srfi-37) #:use-module (ice-9 match) #:export (%package-node-type + %reverse-package-node-type %bag-node-type %bag-with-origins-node-type %bag-emerged-node-type @@ -103,6 +104,25 @@ name." ;;; +;;; Reverse package DAG. +;;; + +(define %reverse-package-node-type + ;; For this node type we first need to compute the list of packages and the + ;; list of back-edges. Since we want to do it only once, we use the + ;; promises below. + (let* ((packages (delay (fold-packages cons '()))) + (back-edges (delay (run-with-store #f ;store not actually needed + (node-back-edges %package-node-type + (force packages)))))) + (node-type + (inherit %package-node-type) + (name "reverse-package") + (description "the reverse DAG of packages") + (edges (lift1 (force back-edges) %store-monad))))) + + +;;; ;;; Package DAG using bags. ;;; @@ -323,6 +343,7 @@ substitutes." (define %node-types ;; List of all the node types. (list %package-node-type + %reverse-package-node-type %bag-node-type %bag-with-origins-node-type %bag-emerged-node-type @@ -337,6 +358,13 @@ substitutes." %node-types) (leave (_ "~a: unknown node type~%") name))) +(define (lookup-backend name) + "Return the graph backend called NAME. Raise an error if it is not found." + (or (find (lambda (backend) + (string=? (graph-backend-name backend) name)) + %graph-backends) + (leave (_ "~a: unknown backend~%") name))) + (define (list-node-types) "Print the available node types along with their synopsis." (display (_ "The available node types are:\n")) @@ -347,6 +375,16 @@ substitutes." (node-type-description type))) %node-types)) +(define (list-backends) + "Print the available backends along with their synopsis." + (display (_ "The available backend types are:\n")) + (newline) + (for-each (lambda (backend) + (format #t " - ~a: ~a~%" + (graph-backend-name backend) + (graph-backend-description backend))) + %graph-backends)) + ;;; ;;; Command-line options. @@ -361,6 +399,14 @@ substitutes." (lambda (opt name arg result) (list-node-types) (exit 0))) + (option '(#\b "backend") #t #f + (lambda (opt name arg result) + (alist-cons 'backend (lookup-backend arg) + result))) + (option '("list-backends") #f #f + (lambda (opt name arg result) + (list-backends) + (exit 0))) (option '(#\e "expression") #t #f (lambda (opt name arg result) (alist-cons 'expression arg result))) @@ -378,6 +424,10 @@ substitutes." (display (_ "Usage: guix graph PACKAGE... Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n")) (display (_ " + -b, --backend=TYPE produce a graph with the given backend TYPE")) + (display (_ " + --list-backends list the available graph backends")) + (display (_ " -t, --type=TYPE represent nodes of the given TYPE")) (display (_ " --list-types list the available graph types")) @@ -392,7 +442,8 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n")) (show-bug-report-information)) (define %default-options - `((node-type . ,%package-node-type))) + `((node-type . ,%package-node-type) + (backend . ,%graphviz-backend))) ;;; @@ -407,6 +458,7 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n")) (lambda (arg result) (alist-cons 'argument arg result)) %default-options)) + (backend (assoc-ref opts 'backend)) (type (assoc-ref opts 'node-type)) (items (filter-map (match-lambda (('argument . (? store-path? item)) @@ -429,7 +481,8 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n")) items))) (export-graph (concatenate nodes) (current-output-port) - #:node-type type))))))) + #:node-type type + #:backend backend))))))) #t) ;;; graph.scm ends here diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm index a339a8556b..640b2417d2 100644 --- a/guix/scripts/hash.scm +++ b/guix/scripts/hash.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012, 2013, 2014, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; @@ -116,6 +116,9 @@ and 'hexadecimal' can be used as well).\n")) (case (stat:type stat) ((directory) (member (basename file) '(".bzr" ".git" ".hg" ".svn" "CVS"))) + ((regular) + ;; Git sub-modules have a '.git' file that is a regular text file. + (string=? (basename file) ".git")) (else #f))) diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm index e54744feca..4d07e0fd69 100644 --- a/guix/scripts/import.scm +++ b/guix/scripts/import.scm @@ -73,7 +73,7 @@ rather than \\n." ;;; Entry point. ;;; -(define importers '("gnu" "nix" "pypi" "cpan" "hackage" "elpa" "gem" "cran")) +(define importers '("gnu" "nix" "pypi" "cpan" "hackage" "elpa" "gem" "cran" "crate")) (define (resolve-importer name) (let ((module (resolve-interface @@ -107,10 +107,17 @@ Run IMPORTER with ARGS.\n")) (show-version-and-exit "guix import")) ((importer args ...) (if (member importer importers) - (match (apply (resolve-importer importer) args) - ((and expr ('package _ ...)) - (pretty-print expr (newline-rewriting-port - (current-output-port)))) - (x - (leave (_ "'~a' import failed~%") importer))) + (let ((print (lambda (expr) + (pretty-print expr (newline-rewriting-port + (current-output-port)))))) + (match (apply (resolve-importer importer) args) + ((and expr ('package _ ...)) + (print expr)) + ((? list? expressions) + (for-each (lambda (expr) + (print expr) + (newline)) + expressions)) + (x + (leave (_ "'~a' import failed~%") importer)))) (leave (_ "~a: invalid importer~%") importer))))) diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm index ace1123b90..66c660ae14 100644 --- a/guix/scripts/import/cran.scm +++ b/guix/scripts/import/cran.scm @@ -26,6 +26,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (srfi srfi-37) + #:use-module (srfi srfi-41) #:use-module (ice-9 match) #:use-module (ice-9 format) #:export (guix-import-cran)) @@ -63,6 +64,9 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) (lambda (opt name arg result) (alist-cons 'repo (string->symbol arg) (alist-delete 'repo result)))) + (option '(#\r "recursive") #f #f + (lambda (opt name arg result) + (alist-cons 'recursive #t result))) %standard-import-options)) @@ -88,12 +92,22 @@ Import and convert the CRAN package for PACKAGE-NAME.\n")) (reverse opts)))) (match args ((package-name) - (let ((sexp (cran->guix-package package-name - (or (assoc-ref opts 'repo) 'cran)))) - (unless sexp - (leave (_ "failed to download description for package '~a'~%") - package-name)) - sexp)) + (if (assoc-ref opts 'recursive) + ;; Recursive import + (map (match-lambda + ((and ('package ('name name) . rest) pkg) + `(define-public ,(string->symbol name) + ,pkg)) + (_ #f)) + (stream->list (recursive-import package-name + (or (assoc-ref opts 'repo) 'cran)))) + ;; Single import + (let ((sexp (cran->guix-package package-name + (or (assoc-ref opts 'repo) 'cran)))) + (unless sexp + (leave (_ "failed to download description for package '~a'~%") + package-name)) + sexp))) (() (leave (_ "too few arguments~%"))) ((many ...) diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm new file mode 100644 index 0000000000..4337a0b623 --- /dev/null +++ b/guix/scripts/import/crate.scm @@ -0,0 +1,94 @@ + +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2014 David Thompson <davet@gnu.org> +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix scripts import crate) + #:use-module (guix ui) + #:use-module (guix utils) + #:use-module (guix scripts) + #:use-module (guix import crate) + #:use-module (guix scripts import) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-37) + #:use-module (ice-9 match) + #:use-module (ice-9 format) + #:export (guix-import-crate)) + + +;;; +;;; Command-line options. +;;; + +(define %default-options + '()) + +(define (show-help) + (display (_ "Usage: guix import crate PACKAGE-NAME +Import and convert the crate.io package for PACKAGE-NAME.\n")) + (display (_ " + -h, --help display this help and exit")) + (display (_ " + -V, --version display version information and exit")) + (newline) + (show-bug-report-information)) + +(define %options + ;; Specification of the command-line options. + (cons* (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + (option '(#\V "version") #f #f + (lambda args + (show-version-and-exit "guix import crate"))) + %standard-import-options)) + + +;;; +;;; Entry point. +;;; + +(define (guix-import-crate . args) + (define (parse-options) + ;; Return the alist of option values. + (args-fold* args %options + (lambda (opt name arg result) + (leave (_ "~A: unrecognized option~%") name)) + (lambda (arg result) + (alist-cons 'argument arg result)) + %default-options)) + + (let* ((opts (parse-options)) + (args (filter-map (match-lambda + (('argument . value) + value) + (_ #f)) + (reverse opts)))) + (match args + ((package-name) + (let ((sexp (crate->guix-package package-name))) + (unless sexp + (leave (_ "failed to download meta-data for package '~a'~%") + package-name)) + sexp)) + (() + (leave (_ "too few arguments~%"))) + ((many ...) + (leave (_ "too many arguments~%")))))) diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm index 9641d3926a..9b991786c3 100644 --- a/guix/scripts/lint.scm +++ b/guix/scripts/lint.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org> ;;; Copyright © 2016 Danny Milosavljevic <dannym+a@scratchpost.org> +;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -59,6 +60,7 @@ #:export (guix-lint check-description-style check-inputs-should-be-native + check-inputs-should-not-be-an-input-at-all check-patch-file-names check-synopsis-style check-derivation @@ -229,34 +231,65 @@ by two spaces; possible infraction~p at ~{~a~^, ~}") (format #f (_ "invalid description: ~s") description) 'description)))) +(define (warn-if-package-has-input linted inputs-to-check input-names message) + ;; Emit a warning MESSAGE if some of the inputs named in INPUT-NAMES are + ;; contained in INPUTS-TO-CHECK, which are assumed to be inputs of package + ;; LINTED. + (match inputs-to-check + (((labels packages . outputs) ...) + (for-each (lambda (package output) + (when (package? package) + (let ((input (string-append + (package-name package) + (if (> (length output) 0) + (string-append ":" (car output)) + "")))) + (when (member input input-names) + (emit-warning linted + (format #f (_ message) input) + 'inputs-to-check))))) + packages outputs)))) + (define (check-inputs-should-be-native package) ;; Emit a warning if some inputs of PACKAGE are likely to belong to its ;; native inputs. - (let ((linted package) + (let ((message "'~a' should probably be a native input") (inputs (package-inputs package)) - (native-inputs + (input-names '("pkg-config" "extra-cmake-modules" "glib:bin" "intltool" "itstool" - "qttools"))) - (match inputs - (((labels packages . outputs) ...) - (for-each (lambda (package output) - (when (package? package) - (let ((input (string-append - (package-name package) - (if (> (length output) 0) - (string-append ":" (car output)) - "")))) - (when (member input native-inputs) - (emit-warning linted - (format #f (_ "'~a' should probably \ -be a native input") - input) - 'inputs))))) - packages outputs))))) + "qttools" + "python-coverage" "python2-coverage" + "python-cython" "python2-cython" + "python-docutils" "python2-docutils" + "python-mock" "python2-mock" + "python-nose" "python2-nose" + "python-pbr" "python2-pbr" + "python-pytest" "python2-pytest" + "python-pytest-cov" "python2-pytest-cov" + "python-setuptools-scm" "python2-setuptools-scm" + "python-sphinx" "python2-sphinx"))) + (warn-if-package-has-input package inputs input-names message))) + +(define (check-inputs-should-not-be-an-input-at-all package) + ;; Emit a warning if some inputs of PACKAGE are likely to should not be + ;; an input at all. + (let ((message "'~a' should probably not be an input at all") + (inputs (package-inputs package)) + (input-names + '("python-setuptools" + "python2-setuptools" + "python-pip" + "python2-pip"))) + (warn-if-package-has-input package (package-inputs package) + input-names message) + (warn-if-package-has-input package (package-native-inputs package) + input-names message) + (warn-if-package-has-input package (package-propagated-inputs package) + input-names message))) (define (package-name-regexp package) "Return a regexp that matches PACKAGE's name as a word at the beginning of a @@ -876,6 +909,10 @@ them for PACKAGE." (description "Identify inputs that should be native inputs") (check check-inputs-should-be-native)) (lint-checker + (name 'inputs-should-not-be-input) + (description "Identify inputs that should be inputs at all") + (check check-inputs-should-not-be-an-input-at-all)) + (lint-checker (name 'patch-file-names) (description "Validate file names and availability of patches") (check check-patch-file-names)) diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm index 2e0268020c..6a4ae28689 100644 --- a/guix/scripts/offload.scm +++ b/guix/scripts/offload.scm @@ -24,8 +24,10 @@ #:use-module (ssh popen) #:use-module (ssh dist) #:use-module (ssh dist node) + #:use-module (ssh version) #:use-module (guix config) #:use-module (guix records) + #:use-module (guix ssh) #:use-module (guix store) #:use-module (guix derivations) #:use-module ((guix serialization) @@ -74,6 +76,10 @@ (private-key build-machine-private-key ; file name (default (user-openssh-private-key))) (host-key build-machine-host-key) ; string + (compression build-machine-compression ; string + (default "zlib@openssh.com,zlib")) + (compression-level build-machine-compression-level ;integer + (default 3)) (daemon-socket build-machine-daemon-socket ; string (default "/var/guix/daemon-socket/socket")) (parallel-builds build-machine-parallel-builds ; number @@ -168,86 +174,53 @@ private key from '~a': ~a") (session (make-session #:user (build-machine-user machine) #:host (build-machine-name machine) #:port (build-machine-port machine) - #:timeout 5 ;seconds + #:timeout 10 ;seconds ;; #:log-verbosity 'protocol #:identity (build-machine-private-key machine) + ;; By default libssh reads ~/.ssh/known_hosts + ;; and uses that to adjust its choice of cipher + ;; suites, which changes the type of host key + ;; that the server sends (RSA vs. Ed25519, + ;; etc.). Opt for something reproducible and + ;; stateless instead. + #:knownhosts "/dev/null" + ;; We need lightweight compression when ;; exchanging full archives. - #:compression "zlib" - #:compression-level 3))) - (connect! session) - - ;; Authenticate the server. XXX: Guile-SSH 0.10.1 doesn't know about - ;; ed25519 keys and 'get-key-type' returns #f in that case. - (let-values (((server) (get-server-public-key session)) - ((type key) (host-key->type+key - (build-machine-host-key machine)))) - (unless (and (or (not (get-key-type server)) - (eq? (get-key-type server) type)) - (string=? (public-key->string server) key)) - ;; Key mismatch: something's wrong. XXX: It could be that the server - ;; provided its Ed25519 key when we where expecting its RSA key. - (leave (_ "server at '~a' returned host key '~a' of type '~a' \ + #:compression + (build-machine-compression machine) + #:compression-level + (build-machine-compression-level machine)))) + (match (connect! session) + ('ok + ;; Authenticate the server. XXX: Guile-SSH 0.10.1 doesn't know about + ;; ed25519 keys and 'get-key-type' returns #f in that case. + (let-values (((server) (get-server-public-key session)) + ((type key) (host-key->type+key + (build-machine-host-key machine)))) + (unless (and (or (not (get-key-type server)) + (eq? (get-key-type server) type)) + (string=? (public-key->string server) key)) + ;; Key mismatch: something's wrong. XXX: It could be that the server + ;; provided its Ed25519 key when we where expecting its RSA key. + (leave (_ "server at '~a' returned host key '~a' of type '~a' \ instead of '~a' of type '~a'~%") - (build-machine-name machine) - (public-key->string server) (get-key-type server) - key type))) - - (let ((auth (userauth-public-key! session private))) - (unless (eq? 'success auth) - (disconnect! session) - (leave (_ "SSH public key authentication failed for '~a': ~a~%") - (build-machine-name machine) (get-error session)))) - - session)) - -(define* (connect-to-remote-daemon session - #:optional - (socket-name "/var/guix/daemon-socket/socket")) - "Connect to the remote build daemon listening on SOCKET-NAME over SESSION, -an SSH session. Return a <nix-server> object." - (define redirect - ;; Code run in SESSION to redirect the remote process' stdin/stdout to the - ;; daemon's socket, à la socat. The SSH protocol supports forwarding to - ;; Unix-domain sockets but libssh doesn't have an API for that, hence this - ;; hack. - `(begin - (use-modules (ice-9 match) (rnrs io ports)) - - (let ((sock (socket AF_UNIX SOCK_STREAM 0)) - (stdin (current-input-port)) - (stdout (current-output-port))) - (setvbuf stdin _IONBF) - (setvbuf stdout _IONBF) - (connect sock AF_UNIX ,socket-name) - - (let loop () - (match (select (list stdin sock) '() (list stdin stdout sock)) - ((reads writes ()) - (when (memq stdin reads) - (match (get-bytevector-some stdin) - ((? eof-object?) - (primitive-exit 0)) - (bv - (put-bytevector sock bv)))) - (when (memq sock reads) - (match (get-bytevector-some sock) - ((? eof-object?) - (primitive-exit 0)) - (bv - (put-bytevector stdout bv)))) - (loop)) - (_ - (primitive-exit 1))))))) - - (let ((channel - (open-remote-pipe* session OPEN_BOTH - ;; Sort-of shell-quote REDIRECT. - "guile" "-c" - (object->string - (object->string redirect))))) - (open-connection #:port channel))) + (build-machine-name machine) + (public-key->string server) (get-key-type server) + key type))) + + (let ((auth (userauth-public-key! session private))) + (unless (eq? 'success auth) + (disconnect! session) + (leave (_ "SSH public key authentication failed for '~a': ~a~%") + (build-machine-name machine) (get-error session)))) + + session) + (x + ;; Connection failed or timeout expired. + (leave (_ "failed to connect to '~a': ~a~%") + (build-machine-name machine) (get-error session)))))) ;;; @@ -363,8 +336,9 @@ MACHINE." ;; Protect DRV from garbage collection. (add-temp-root store (derivation-file-name drv)) - (send-files (cons (derivation-file-name drv) inputs) - store) + (with-store local + (send-files local (cons (derivation-file-name drv) inputs) store + #:log-port (current-output-port))) (format (current-error-port) "offloading '~a' to '~a'...~%" (derivation-file-name drv) (build-machine-name machine)) (format (current-error-port) "@ build-remote ~a ~a~%" @@ -379,92 +353,20 @@ MACHINE." ;; Use exit code 100 for a permanent build failure. The daemon ;; interprets other non-zero codes as transient build failures. (primitive-exit 100))) - (build-derivations store (list drv))) + (parameterize ((current-build-output-port (build-log-port))) + (build-derivations store (list drv)))) - (retrieve-files outputs store) + (retrieve-files* outputs store) (format (current-error-port) "done with offloaded '~a'~%" (derivation-file-name drv))) -(define (store-import-channel session) - "Return an output port to which archives to be exported to SESSION's store -can be written." - ;; Using the 'import-paths' RPC on a remote store would be slow because it - ;; makes a round trip every time 32 KiB have been transferred. This - ;; procedure instead opens a separate channel to use the remote - ;; 'import-paths' procedure, which consumes all the data in a single round - ;; trip. - (define import - `(begin - (use-modules (guix)) - - (with-store store - (setvbuf (current-input-port) _IONBF) - (import-paths store (current-input-port))))) - - (open-remote-output-pipe session - (string-join - `("guile" "-c" - ,(object->string - (object->string import)))))) - -(define (store-export-channel session files) - "Return an input port from which an export of FILES from SESSION's store can -be read." - ;; Same as above: this is more efficient than calling 'export-paths' on a - ;; remote store. - (define export - `(begin - (use-modules (guix)) - - (with-store store - (setvbuf (current-output-port) _IONBF) - (export-paths store ',files (current-output-port))))) - - (open-remote-input-pipe session - (string-join - `("guile" "-c" - ,(object->string - (object->string export)))))) - -(define (send-files files remote) - "Send the subset of FILES that's missing to REMOTE, a remote store." - (with-store store - ;; Compute the subset of FILES missing on SESSION, and send them in - ;; topologically sorted order so that they can actually be imported. - (let* ((sorted (topologically-sorted store files)) - (session (channel-get-session (nix-server-socket remote))) - (node (make-node session)) - (missing (node-eval node - `(begin - (use-modules (guix) - (srfi srfi-1) (srfi srfi-26)) - - (with-store store - (remove (cut valid-path? store <>) - ',sorted))))) - (port (store-import-channel session))) - (format #t (_ "sending ~a store files to '~a'...~%") - (length missing) (session-get session 'host)) - - (export-paths store missing port) - - ;; Tell the remote process that we're done. (In theory the - ;; end-of-archive mark of 'export-paths' would be enough, but in - ;; practice it's not.) - (channel-send-eof port) - - ;; Wait for completion of the remote process. - (let ((result (zero? (channel-get-exit-status port)))) - (close-port port) - result)))) - -(define (retrieve-files files remote) - "Retrieve FILES from SESSION's store, and import them." - (let* ((session (channel-get-session (nix-server-socket remote))) - (host (session-get session 'host)) - (port (store-export-channel session files))) - (format #t (_ "retrieving ~a files from '~a'...~%") - (length files) host) +(define (retrieve-files* files remote) + "Retrieve FILES from REMOTE and import them using 'restore-file-set'." + (let-values (((port count) + (file-retrieval-port files remote))) + (format #t (N_ "retrieving ~a store item from '~a'...~%" + "retrieving ~a store items from '~a'...~%" count) + count (remote-store-host remote)) ;; We cannot use the 'import-paths' RPC here because we already ;; hold the locks for FILES. @@ -489,37 +391,30 @@ be read." (define (machine-load machine) "Return the load of MACHINE, divided by the number of parallel builds -allowed on MACHINE." - (let* ((session (open-ssh-session machine)) - (pipe (open-remote-pipe* session OPEN_READ +allowed on MACHINE. Return +∞ if MACHINE is unreachable." + ;; Note: This procedure is costly since it creates a new SSH session. + (match (false-if-exception (open-ssh-session machine)) + ((? session? session) + (let* ((pipe (open-remote-pipe* session OPEN_READ "cat" "/proc/loadavg")) - (line (read-line pipe))) - (close-port pipe) - - (if (eof-object? line) - +inf.0 ;MACHINE does not respond, so assume it is infinitely loaded - (match (string-tokenize line) - ((one five fifteen . _) - (let* ((raw (string->number five)) - (jobs (build-machine-parallel-builds machine)) - (normalized (/ raw jobs))) - (format (current-error-port) "load on machine '~a' is ~s\ + (line (read-line pipe))) + (close-port pipe) + + (if (eof-object? line) + +inf.0 ;MACHINE does not respond, so assume it is infinitely loaded + (match (string-tokenize line) + ((one five fifteen . _) + (let* ((raw (string->number five)) + (jobs (build-machine-parallel-builds machine)) + (normalized (/ raw jobs))) + (format (current-error-port) "load on machine '~a' is ~s\ (normalized: ~s)~%" - (build-machine-name machine) raw normalized) - normalized)) - (_ - +inf.0))))) ;something's fishy about MACHINE, so avoid it - -(define (machine-power-factor m) - "Return a factor that aggregates the speed and load of M. The higher the -better." - (/ (build-machine-speed m) - (+ 1 (machine-load m)))) - -(define (machine-less-loaded-or-faster? m1 m2) - "Return #t if M1 is either less loaded or faster than M2. (This relation -defines a total order on machines.)" - (> (machine-power-factor m1) (machine-power-factor m2))) + (build-machine-name machine) raw normalized) + normalized)) + (_ + +inf.0))))) ;something's fishy about MACHINE, so avoid it + (_ + +inf.0))) ;failed to connect to MACHINE, so avoid it (define (machine-lock-file machine hint) "Return the name of MACHINE's lock file for HINT." @@ -548,29 +443,39 @@ defines a total order on machines.)" ;; 5. Release the global machine-choice lock. (with-file-lock (machine-choice-lock-file) - (define machines+slots + (define machines+slots+loads (filter-map (lambda (machine) + ;; Call 'machine-load' from here to make sure it is called + ;; only once per machine (it is expensive). (let ((slot (acquire-build-slot machine))) - (and slot (list machine slot)))) + (and slot + (list machine slot (machine-load machine))))) machines)) (define (undecorate pred) (lambda (a b) (match a - ((machine1 slot1) + ((machine1 slot1 load1) (match b - ((machine2 slot2) - (pred machine1 machine2))))))) - - (let loop ((machines+slots - (sort machines+slots + ((machine2 slot2 load2) + (pred machine1 load1 machine2 load2))))))) + + (define (machine-less-loaded-or-faster? m1 l1 m2 l2) + ;; Return #t if M1 is either less loaded or faster than M2, with L1 + ;; being the load of M1 and L2 the load of M2. (This relation defines a + ;; total order on machines.) + (> (/ (build-machine-speed m1) (+ 1 l1)) + (/ (build-machine-speed m2) (+ 1 l2)))) + + (let loop ((machines+slots+loads + (sort machines+slots+loads (undecorate machine-less-loaded-or-faster?)))) - (match machines+slots - (((best slot) others ...) + (match machines+slots+loads + (((best slot load) others ...) ;; Return the best machine unless it's already overloaded. - (if (< (machine-load best) 2.) + (if (< load 2.) (match others - (((machines slots) ...) + (((machines slots loads) ...) ;; Release slots from the uninteresting machines. (for-each release-build-slot slots) @@ -618,6 +523,96 @@ defines a total order on machines.)" ;;; +;;; Installation tests. +;;; + +(define (assert-node-repl node name) + "Bail out if NODE is not running Guile." + (match (node-guile-version node) + (#f + (leave (_ "Guile could not be started on '~a'~%") + name)) + ((? string? version) + ;; Note: The version string already contains the word "Guile". + (info (_ "'~a' is running ~a~%") + name (node-guile-version node))))) + +(define (assert-node-has-guix node name) + "Bail out if NODE lacks the (guix) module, or if its daemon is not running." + (match (node-eval node + '(begin + (use-modules (guix)) + (with-store store + (add-text-to-store store "test" + "Hello, build machine!")))) + ((? string? str) + (info (_ "Guix is usable on '~a' (test returned ~s)~%") + name str)) + (x + (leave (_ "failed to use Guix module on '~a' (test returned ~s)~%") + name x)))) + +(define %random-state + (delay + (seed->random-state (logxor (getpid) (car (gettimeofday)))))) + +(define* (nonce #:optional (name (gethostname))) + (string-append name "-" + (number->string (random 1000000 (force %random-state))))) + +(define (assert-node-can-import node name daemon-socket) + "Bail out if NODE refuses to import our archives." + (let ((session (node-session node))) + (with-store store + (let* ((item (add-text-to-store store "export-test" (nonce))) + (remote (connect-to-remote-daemon session daemon-socket))) + (with-store local + (send-files local (list item) remote)) + + (if (valid-path? remote item) + (info (_ "'~a' successfully imported '~a'~%") + name item) + (leave (_ "'~a' was not properly imported on '~a'~%") + item name)))))) + +(define (assert-node-can-export node name daemon-socket) + "Bail out if we cannot import signed archives from NODE." + (let* ((session (node-session node)) + (remote (connect-to-remote-daemon session daemon-socket)) + (item (add-text-to-store remote "import-test" (nonce name)))) + (with-store store + (if (and (retrieve-files store (list item) remote) + (valid-path? store item)) + (info (_ "successfully imported '~a' from '~a'~%") + item name) + (leave (_ "failed to import '~a' from '~a'~%") + item name))))) + +(define (check-machine-availability machine-file pred) + "Check that each machine matching PRED in MACHINE-FILE is usable as a build +machine." + (define (build-machine=? m1 m2) + (and (string=? (build-machine-name m1) (build-machine-name m2)) + (= (build-machine-port m1) (build-machine-port m2)))) + + ;; A given build machine may appear several times (e.g., once for + ;; "x86_64-linux" and a second time for "i686-linux"); test them only once. + (let ((machines (filter pred + (delete-duplicates (build-machines machine-file) + build-machine=?)))) + (info (_ "testing ~a build machines defined in '~a'...~%") + (length machines) machine-file) + (let* ((names (map build-machine-name machines)) + (sockets (map build-machine-daemon-socket machines)) + (sessions (map open-ssh-session machines)) + (nodes (map make-node sessions))) + (for-each assert-node-repl nodes names) + (for-each assert-node-has-guix nodes names) + (for-each assert-node-can-import nodes names sockets) + (for-each assert-node-can-export nodes names sockets)))) + + +;;; ;;; Entry point. ;;; @@ -635,6 +630,12 @@ defines a total order on machines.)" (and=> (passwd:dir (getpw (getuid))) (cut setenv "HOME" <>)) + ;; We rely on protocol-level compression from libssh to optimize large data + ;; transfers. Warn if it's missing. + (unless (zlib-support?) + (warning (_ "Guile-SSH lacks zlib support")) + (warning (_ "data transfers will *not* be compressed!"))) + (match args ((system max-silent-time print-build-trace? build-timeout) (let ((max-silent-time (string->number max-silent-time)) @@ -660,6 +661,18 @@ defines a total order on machines.)" (else (leave (_ "invalid request line: ~s~%") line))) (loop (read-line))))))) + (("test" rest ...) + (with-error-handling + (let-values (((file pred) + (match rest + ((file regexp) + (values file + (compose (cut string-match regexp <>) + build-machine-name))) + ((file) (values file (const #t))) + (() (values %machine-file (const #t))) + (_ (leave (_ "wrong number of arguments~%")))))) + (check-machine-availability (or file %machine-file) pred)))) (("--version") (show-version-and-exit "guix offload")) (("--help") diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm index 96a22f6fab..90e7fa2298 100644 --- a/guix/scripts/package.scm +++ b/guix/scripts/package.scm @@ -200,7 +200,8 @@ specified in MANIFEST, a manifest object." (profile-derivation manifest #:hooks (if bootstrap? '() - %default-profile-hooks)))) + %default-profile-hooks) + #:locales? (not bootstrap?)))) (prof (derivation->output-path prof-drv))) (show-what-to-build store (list prof-drv) #:use-substitutes? use-substitutes? diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm index 1b32f639ea..33a7b3bd42 100644 --- a/guix/scripts/publish.scm +++ b/guix/scripts/publish.scm @@ -365,6 +365,14 @@ example: \"/foo/bar\" yields '(\"foo\" \"bar\")." (response-headers response) eq?))) +(define (with-content-length response length) + "Return RESPONSE with a 'content-length' header set to LENGTH." + (set-field response (response-headers) + (alist-cons 'content-length length + (alist-delete 'content-length + (response-headers response) + eq?)))) + (define-syntax-rule (swallow-EPIPE exp ...) "Swallow EPIPE errors raised by EXP..." (catch 'system-error @@ -432,13 +440,8 @@ blocking." (call-with-input-file (utf8->string body) (lambda (input) (let* ((size (stat:size (stat input))) - (headers (alist-cons 'content-length size - (alist-delete 'content-length - (response-headers response) - eq?))) - (response (write-response (set-field response - (response-headers) - headers) + (response (write-response (with-content-length response + size) client)) (output (response-port response))) (dump-port input output) diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm index b81c69f9fe..0dd7eee974 100644 --- a/guix/scripts/refresh.scm +++ b/guix/scripts/refresh.scm @@ -35,7 +35,8 @@ #:select (%gnu-updater %gnome-updater %kde-updater - %xorg-updater)) + %xorg-updater + %kernel.org-updater)) #:use-module (guix import elpa) #:use-module (guix import cran) #:use-module (guix import hackage) @@ -118,7 +119,7 @@ (show-version-and-exit "guix refresh"))))) (define (show-help) - (display (_ "Usage: guix refresh [OPTION]... PACKAGE... + (display (_ "Usage: guix refresh [OPTION]... [PACKAGE]... Update package definitions to match the latest upstream version. When PACKAGE... is given, update only the specified packages. Otherwise @@ -200,15 +201,18 @@ unavailable optional dependencies such as Guile-JSON." %gnome-updater %kde-updater %xorg-updater + %kernel.org-updater %elpa-updater %cran-updater %bioconductor-updater %hackage-updater + ((guix import cpan) => %cpan-updater) ((guix import pypi) => %pypi-updater) ((guix import gem) => %gem-updater) - ((guix import github) => %github-updater))) + ((guix import github) => %github-updater) + ((guix import crate) => %crate-updater))) -(define (lookup-updater name) +(define (lookup-updater-by-name name) "Return the updater called NAME." (or (find (lambda (updater) (eq? name (upstream-updater-name updater))) @@ -218,38 +222,84 @@ unavailable optional dependencies such as Guile-JSON." (define (list-updaters-and-exit) "Display available updaters and exit." (format #t (_ "Available updaters:~%")) - (for-each (lambda (updater) - (format #t "- ~a: ~a~%" - (upstream-updater-name updater) - (_ (upstream-updater-description updater)))) - %updaters) + (newline) + + (let* ((packages (fold-packages cons '())) + (total (length packages))) + (define covered + (fold (lambda (updater covered) + (let ((matches (count (upstream-updater-predicate updater) + packages))) + ;; TRANSLATORS: The parenthetical expression here is rendered + ;; like "(42% coverage)" and denotes the fraction of packages + ;; covered by the given updater. + (format #t (_ " - ~a: ~a (~2,1f% coverage)~%") + (upstream-updater-name updater) + (_ (upstream-updater-description updater)) + (* 100. (/ matches total))) + (+ covered matches))) + 0 + %updaters)) + + (newline) + (format #t (_ "~2,1f% of the packages are covered by these updaters.~%") + (* 100. (/ covered total)))) (exit 0)) +(define (warn-no-updater package) + (format (current-error-port) + (_ "~a: warning: no updater for ~a~%") + (location->string (package-location package)) + (package-name package))) + (define* (update-package store package updaters - #:key (key-download 'interactive)) + #:key (key-download 'interactive) warn?) "Update the source file that defines PACKAGE with the new version. KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed -values: 'interactive' (default), 'always', and 'never'." - (let-values (((version tarball) - (package-update store package updaters - #:key-download key-download)) - ((loc) - (or (package-field-location package 'version) - (package-location package)))) - (when version - (if (and=> tarball file-exists?) - (begin - (format (current-error-port) - (_ "~a: ~a: updating from version ~a to version ~a...~%") - (location->string loc) - (package-name package) - (package-version package) version) - (let ((hash (call-with-input-file tarball - port-sha256))) - (update-package-source package version hash))) - (warning (_ "~a: version ~a could not be \ +values: 'interactive' (default), 'always', and 'never'. When WARN? is true, +warn about packages that have no matching updater." + (if (lookup-updater package updaters) + (let-values (((version tarball) + (package-update store package updaters + #:key-download key-download)) + ((loc) + (or (package-field-location package 'version) + (package-location package)))) + (when version + (if (and=> tarball file-exists?) + (begin + (format (current-error-port) + (_ "~a: ~a: updating from version ~a to version ~a...~%") + (location->string loc) + (package-name package) + (package-version package) version) + (let ((hash (call-with-input-file tarball + port-sha256))) + (update-package-source package version hash))) + (warning (_ "~a: version ~a could not be \ downloaded and authenticated; not updating~%") - (package-name package) version))))) + (package-name package) version)))) + (when warn? + (warn-no-updater package)))) + +(define* (check-for-package-update package updaters #:key warn?) + "Check whether an update is available for PACKAGE and print a message. When +WARN? is true and no updater exists for PACKAGE, print a warning." + (match (package-latest-release package updaters) + ((? upstream-source? source) + (when (version>? (upstream-source-version source) + (package-version package)) + (let ((loc (or (package-field-location package 'version) + (package-location package)))) + (format (current-error-port) + (_ "~a: ~a would be upgraded from ~a to ~a~%") + (location->string loc) + (package-name package) (package-version package) + (upstream-source-version source))))) + (#f + (when warn? + (warn-no-updater package))))) + ;;; @@ -312,7 +362,7 @@ dependent packages are rebuilt: ~{~a~^ ~}~%" ;; Return the list of updaters to use. (match (filter-map (match-lambda (('updaters . names) - (map lookup-updater names)) + (map lookup-updater-by-name names)) (_ #f)) opts) (() @@ -360,6 +410,12 @@ update would trigger a complete rebuild." (updaters (options->updaters opts)) (list-dependent? (assoc-ref opts 'list-dependent?)) (key-download (assoc-ref opts 'key-download)) + + ;; Warn about missing updaters when a package is explicitly given on + ;; the command line. + (warn? (or (assoc-ref opts 'argument) + (assoc-ref opts 'expression))) + (packages (match (filter-map (match-lambda (('argument . spec) @@ -397,22 +453,14 @@ update would trigger a complete rebuild." (%gpg-command)))) (for-each (cut update-package store <> updaters - #:key-download key-download) + #:key-download key-download + #:warn? warn?) packages) (with-monad %store-monad (return #t)))) (else - (for-each (lambda (package) - (match (package-update-path package updaters) - ((? upstream-source? source) - (let ((loc (or (package-field-location package 'version) - (package-location package)))) - (format (current-error-port) - (_ "~a: ~a would be upgraded from ~a to ~a~%") - (location->string loc) - (package-name package) (package-version package) - (upstream-source-version source)))) - (#f #f))) + (for-each (cut check-for-package-update <> updaters + #:warn? warn?) packages) (with-monad %store-monad (return #t))))))))) diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm index bb373a6726..144a7fd377 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -326,7 +326,7 @@ it atomically, and then run OS's activation script." (let* ((system (derivation->output-path drv)) (number (+ 1 (generation-number profile))) (generation (generation-file-name profile number))) - (symlink system generation) + (switch-symlinks generation system) (switch-symlinks profile generation) (format #t (_ "activating system...~%")) diff --git a/guix/ssh.scm b/guix/ssh.scm new file mode 100644 index 0000000000..3548243839 --- /dev/null +++ b/guix/ssh.scm @@ -0,0 +1,226 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix ssh) + #:use-module (guix store) + #:autoload (guix ui) (N_) + #:use-module (ssh channel) + #:use-module (ssh popen) + #:use-module (ssh session) + #:use-module (ssh dist) + #:use-module (ssh dist node) + #:use-module (srfi srfi-11) + #:use-module (srfi srfi-34) + #:use-module (srfi srfi-35) + #:use-module (ice-9 match) + #:use-module (ice-9 binary-ports) + #:export (connect-to-remote-daemon + send-files + retrieve-files + remote-store-host + + file-retrieval-port)) + +;;; Commentary: +;;; +;;; This module provides tools to support communication with remote stores +;;; over SSH, using Guile-SSH. +;;; +;;; Code: + +(define* (connect-to-remote-daemon session + #:optional + (socket-name "/var/guix/daemon-socket/socket")) + "Connect to the remote build daemon listening on SOCKET-NAME over SESSION, +an SSH session. Return a <nix-server> object." + (define redirect + ;; Code run in SESSION to redirect the remote process' stdin/stdout to the + ;; daemon's socket, à la socat. The SSH protocol supports forwarding to + ;; Unix-domain sockets but libssh doesn't have an API for that, hence this + ;; hack. + `(begin + (use-modules (ice-9 match) (rnrs io ports)) + + (let ((sock (socket AF_UNIX SOCK_STREAM 0)) + (stdin (current-input-port)) + (stdout (current-output-port))) + (setvbuf stdin _IONBF) + (setvbuf stdout _IONBF) + (connect sock AF_UNIX ,socket-name) + + (let loop () + (match (select (list stdin sock) '() (list stdin stdout sock)) + ((reads writes ()) + (when (memq stdin reads) + (match (get-bytevector-some stdin) + ((? eof-object?) + (primitive-exit 0)) + (bv + (put-bytevector sock bv)))) + (when (memq sock reads) + (match (get-bytevector-some sock) + ((? eof-object?) + (primitive-exit 0)) + (bv + (put-bytevector stdout bv)))) + (loop)) + (_ + (primitive-exit 1))))))) + + (let ((channel + (open-remote-pipe* session OPEN_BOTH + ;; Sort-of shell-quote REDIRECT. + "guile" "-c" + (object->string + (object->string redirect))))) + (open-connection #:port channel))) + +(define (store-import-channel session) + "Return an output port to which archives to be exported to SESSION's store +can be written." + ;; Using the 'import-paths' RPC on a remote store would be slow because it + ;; makes a round trip every time 32 KiB have been transferred. This + ;; procedure instead opens a separate channel to use the remote + ;; 'import-paths' procedure, which consumes all the data in a single round + ;; trip. + (define import + `(begin + (use-modules (guix)) + + (with-store store + (setvbuf (current-input-port) _IONBF) + + ;; FIXME: Exceptions are silently swallowed. We should report them + ;; somehow. + (import-paths store (current-input-port))))) + + (open-remote-output-pipe session + (string-join + `("guile" "-c" + ,(object->string + (object->string import)))))) + +(define* (store-export-channel session files + #:key recursive?) + "Return an input port from which an export of FILES from SESSION's store can +be read. When RECURSIVE? is true, the closure of FILES is exported." + ;; Same as above: this is more efficient than calling 'export-paths' on a + ;; remote store. + (define export + `(begin + (use-modules (guix)) + + (with-store store + (setvbuf (current-output-port) _IONBF) + + ;; FIXME: Exceptions are silently swallowed. We should report them + ;; somehow. + (export-paths store ',files (current-output-port) + #:recursive? ,recursive?)))) + + (open-remote-input-pipe session + (string-join + `("guile" "-c" + ,(object->string + (object->string export)))))) + +(define* (send-files local files remote + #:key + recursive? + (log-port (current-error-port))) + "Send the subset of FILES from LOCAL (a local store) that's missing to +REMOTE, a remote store. When RECURSIVE? is true, send the closure of FILES. +Return the list of store items actually sent." + ;; Compute the subset of FILES missing on SESSION and send them. + (let* ((files (if recursive? (requisites local files) files)) + (session (channel-get-session (nix-server-socket remote))) + (node (make-node session)) + (missing (node-eval node + `(begin + (use-modules (guix) + (srfi srfi-1) (srfi srfi-26)) + + (with-store store + (remove (cut valid-path? store <>) + ',files))))) + (count (length missing)) + (port (store-import-channel session))) + (format log-port (N_ "sending ~a store item to '~a'...~%" + "sending ~a store items to '~a'...~%" count) + count (session-get session 'host)) + + ;; Send MISSING in topological order. + (export-paths local missing port) + + ;; Tell the remote process that we're done. (In theory the end-of-archive + ;; mark of 'export-paths' would be enough, but in practice it's not.) + (channel-send-eof port) + + ;; Wait for completion of the remote process. + (let ((result (zero? (channel-get-exit-status port)))) + (close-port port) + missing))) + +(define (remote-store-session remote) + "Return the SSH channel beneath REMOTE, a remote store as returned by +'connect-to-remote-daemon', or #f." + (channel-get-session (nix-server-socket remote))) + +(define (remote-store-host remote) + "Return the name of the host REMOTE is connected to, where REMOTE is a +remote store as returned by 'connect-to-remote-daemon'." + (match (remote-store-session remote) + (#f #f) + ((? session? session) + (session-get session 'host)))) + +(define* (file-retrieval-port files remote + #:key recursive?) + "Return an input port from which to retrieve FILES (a list of store items) +from REMOTE, along with the number of items to retrieve (lower than or equal +to the length of FILES.)" + (values (store-export-channel (remote-store-session remote) files + #:recursive? recursive?) + (length files))) ;XXX: inaccurate when RECURSIVE? is true + +(define* (retrieve-files local files remote + #:key recursive? (log-port (current-error-port))) + "Retrieve FILES from REMOTE and import them using the 'import-paths' RPC on +LOCAL. When RECURSIVE? is true, retrieve the closure of FILES." + (let-values (((port count) + (file-retrieval-port files remote + #:recursive? recursive?))) + (format #t (N_ "retrieving ~a store item from '~a'...~%" + "retrieving ~a store items from '~a'...~%" count) + count (remote-store-host remote)) + (when (eof-object? (lookahead-u8 port)) + ;; The failure could be because one of the requested store items is not + ;; valid on REMOTE, or because Guile or Guix is improperly installed. + ;; TODO: Improve error reporting. + (raise (condition + (&message + (message + (format #f + (_ "failed to retrieve store items from '~a'") + (remote-store-host remote))))))) + + (let ((result (import-paths local port))) + (close-port port) + result))) + +;;; ssh.scm ends here diff --git a/guix/store.scm b/guix/store.scm index 689a94c636..49549d0771 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -374,29 +374,36 @@ space on the file system so that the garbage collector can still operate, should the disk become full. When CPU-AFFINITY is true, it must be an integer corresponding to an OS-level CPU number to which the daemon's worker process for this connection will be pinned. Return a server object." - (let ((port (or port (open-unix-domain-socket file)))) - (write-int %worker-magic-1 port) - (let ((r (read-int port))) - (and (eqv? r %worker-magic-2) - (let ((v (read-int port))) - (and (eqv? (protocol-major %protocol-version) - (protocol-major v)) - (begin - (write-int %protocol-version port) - (when (>= (protocol-minor v) 14) - (write-int (if cpu-affinity 1 0) port) - (when cpu-affinity - (write-int cpu-affinity port))) - (when (>= (protocol-minor v) 11) - (write-int (if reserve-space? 1 0) port)) - (let ((conn (%make-nix-server port - (protocol-major v) - (protocol-minor v) - (make-hash-table 100) - (make-hash-table 100)))) - (let loop ((done? (process-stderr conn))) - (or done? (process-stderr conn))) - conn)))))))) + (guard (c ((nar-error? c) + ;; One of the 'write-' or 'read-' calls below failed, but this is + ;; really a connection error. + (raise (condition + (&nix-connection-error (file (or port file)) + (errno EPROTO)) + (&message (message "build daemon handshake failed")))))) + (let ((port (or port (open-unix-domain-socket file)))) + (write-int %worker-magic-1 port) + (let ((r (read-int port))) + (and (eqv? r %worker-magic-2) + (let ((v (read-int port))) + (and (eqv? (protocol-major %protocol-version) + (protocol-major v)) + (begin + (write-int %protocol-version port) + (when (>= (protocol-minor v) 14) + (write-int (if cpu-affinity 1 0) port) + (when cpu-affinity + (write-int cpu-affinity port))) + (when (>= (protocol-minor v) 11) + (write-int (if reserve-space? 1 0) port)) + (let ((conn (%make-nix-server port + (protocol-major v) + (protocol-minor v) + (make-hash-table 100) + (make-hash-table 100)))) + (let loop ((done? (process-stderr conn))) + (or done? (process-stderr conn))) + conn))))))))) (define (close-connection server) "Close the connection to SERVER." @@ -470,7 +477,8 @@ encoding conversion errors." ;; Write a byte stream to USER-PORT. (let* ((len (read-int p)) (m (modulo len 8))) - (dump-port p user-port len) + (dump-port p user-port len + #:buffer-size (if (<= len 16384) 16384 65536)) (unless (zero? m) ;; Consume padding, as for strings. (get-bytevector-n p (- 8 m)))) diff --git a/guix/ui.scm b/guix/ui.scm index cafb3c6705..7d4c437354 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; 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 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com> @@ -306,7 +306,13 @@ exiting. ARGS is the list of arguments received by the 'throw' handler." "Display version information for COMMAND and `(exit 0)'." (simple-format #t "~a (~a) ~a~%" command %guix-package-name %guix-version) - (display (_ "Copyright (C) 2016 the Guix authors + (format #t "Copyright ~a 2017 ~a" + ;; TRANSLATORS: Translate "(C)" to the copyright symbol + ;; (C-in-a-circle), if this symbol is available in the user's + ;; locale. Otherwise, do not translate "(C)"; leave it as-is. */ + (_ "(C)") + (_ "the Guix authors\n")) + (display (_"\ License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. diff --git a/guix/upstream.scm b/guix/upstream.scm index 18157376d2..2334c4c0a6 100644 --- a/guix/upstream.scm +++ b/guix/upstream.scm @@ -26,6 +26,11 @@ #:use-module (guix packages) #:use-module (guix ui) #:use-module (guix base32) + #:use-module (guix gexp) + #:use-module (guix store) + #:use-module ((guix derivations) + #:select (built-derivations derivation->output-path)) + #:use-module (guix monads) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) @@ -49,8 +54,11 @@ upstream-updater-predicate upstream-updater-latest + lookup-updater + download-tarball - package-update-path + package-latest-release + package-latest-release* package-update update-package-source)) @@ -127,17 +135,50 @@ them matches." (and (pred package) latest))) updaters)) -(define (package-update-path package updaters) +(define (package-latest-release package updaters) "Return an upstream source to update PACKAGE, a <package> object, or #f if -no update is needed or known." +none of UPDATERS matches PACKAGE. It is the caller's responsibility to ensure +that the returned source is newer than the current one." (match (lookup-updater package updaters) ((? procedure? latest-release) - (match (latest-release package) - ((and source ($ <upstream-source> name version)) - (and (version>? version (package-version package)) - source)) - (_ #f))) - (#f #f))) + (latest-release package)) + (_ #f))) + +(define (package-latest-release* package updaters) + "Like 'package-latest-release', but ensure that the return source is newer +than that of PACKAGE." + (match (package-latest-release package updaters) + ((and source ($ <upstream-source> name version)) + (and (version>? version (package-version package)) + source)) + (_ + #f))) + +(define (uncompressed-tarball name tarball) + "Return a derivation that decompresses TARBALL." + (define (ref package) + (module-ref (resolve-interface '(gnu packages compression)) + package)) + + (define compressor + (cond ((or (string-suffix? ".gz" tarball) + (string-suffix? ".tgz" tarball)) + (file-append (ref 'gzip) "/bin/gzip")) + ((string-suffix? ".bz2" tarball) + (file-append (ref 'bzip2) "/bin/bzip2")) + ((string-suffix? ".xz" tarball) + (file-append (ref 'xz) "/bin/xz")) + ((string-suffix? ".lz" tarball) + (file-append (ref 'lzip) "/bin/lzip")) + (else + (error "unknown archive type" tarball)))) + + (gexp->derivation (file-sans-extension name) + #~(begin + (copy-file #+tarball #+name) + (and (zero? (system* #+compressor "-d" #+name)) + (copy-file #+(file-sans-extension name) + #$output))))) (define* (download-tarball store url signature-url #:key (key-download 'interactive)) @@ -149,8 +190,22 @@ values: 'interactive' (default), 'always', and 'never'." (let ((tarball (download-to-store store url))) (if (not signature-url) tarball - (let* ((sig (download-to-store store signature-url)) - (ret (gnupg-verify* sig tarball #:key-download key-download))) + (let* ((sig (download-to-store store signature-url)) + + ;; Sometimes we get a signature over the uncompressed tarball. + ;; In that case, decompress the tarball in the store so that we + ;; can check the signature. + (data (if (string-prefix? (basename url) + (basename signature-url)) + tarball + (run-with-store store + (mlet %store-monad ((drv (uncompressed-tarball + (basename url) tarball))) + (mbegin %store-monad + (built-derivations (list drv)) + (return (derivation->output-path drv))))))) + + (ret (gnupg-verify* sig data #:key-download key-download))) (if ret tarball (begin @@ -179,19 +234,23 @@ values: the item from LST1 and the item from LST2 that match PRED." PACKAGE, or #f and #f when PACKAGE is up-to-date. KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed values: 'always', 'never', and 'interactive' (default)." - (match (package-update-path package updaters) + (match (package-latest-release* package updaters) (($ <upstream-source> _ version urls signature-urls) (let*-values (((name) (package-name package)) ((archive-type) (match (and=> (package-source package) origin-uri) ((? string? uri) - (or (file-extension uri) "gz")) + (file-extension (basename uri))) (_ "gz"))) ((url signature-url) (find2 (lambda (url sig-url) - (string-suffix? archive-type url)) + ;; Some URIs lack a file extension, like + ;; 'https://crates.io/???/0.1/download'. In that + ;; case, pick the first URL. + (or (not archive-type) + (string-suffix? archive-type url))) urls (or signature-urls (circular-list #f))))) (let ((tarball (download-tarball store url signature-url diff --git a/guix/utils.scm b/guix/utils.scm index 65a2baa0a2..06f49daca8 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -70,6 +70,7 @@ %current-system %current-target-system package-name->name+version + target-mingw? version-compare version>? version>=? @@ -508,6 +509,10 @@ returned. Both parts must not contain any '@'." (idx (values (substring spec 0 idx) (substring spec (1+ idx)))))) +(define* (target-mingw? #:optional (target (%current-target-system))) + (and target + (string-suffix? "-mingw32" target))) + (define version-compare (let ((strverscmp (let ((sym (or (dynamic-func "strverscmp" (dynamic-link)) diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index 889ee3d2bd..38048ceebc 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -1680,7 +1680,11 @@ void DerivationGoal::startBuilder() % drv.platform % settings.thisSystem % drvPath); } - useChroot = settings.useChroot; + /* Note: built-in builders are *not* running in a chroot environment so + that we can easily implement them in Guile without having it as a + derivation input (they are running under a separate build user, + though). */ + useChroot = settings.useChroot && !isBuiltin(drv); /* Construct the environment passed to the builder. */ env.clear(); @@ -2048,12 +2052,7 @@ void DerivationGoal::runChild() commonChildInit(builderOut); #if CHROOT_ENABLED - /* Note: built-in builders are *not* running in a chroot environment - so that we can easily implement them in Guile without having it as - a derivation input (they are running under a separate build user, - though). */ - - if (useChroot && !isBuiltin(drv)) { + if (useChroot) { /* Initialise the loopback interface. */ AutoCloseFD fd(socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)); if (fd == -1) throw SysError("cannot open IP socket"); @@ -2631,6 +2630,21 @@ void DerivationGoal::closeLogFile() } +static void _chown(const Path & path, uid_t uid, gid_t gid) +{ + checkInterrupt(); + + if (lchown(path.c_str(), uid, gid) == -1) { + throw SysError(format("change owner and group of `%1%'") % path); + } + struct stat st = lstat(path); + if (S_ISDIR(st.st_mode)) { + for (auto & i : readDirectory(path)) + _chown(path + "/" + i.name, uid, gid); + } +} + + void DerivationGoal::deleteTmpDir(bool force) { if (tmpDir != "") { @@ -2639,6 +2653,12 @@ void DerivationGoal::deleteTmpDir(bool force) format("note: keeping build directory `%2%'") % drvPath % tmpDir); chmod(tmpDir.c_str(), 0755); + // Change the ownership if clientUid is set. Never change the + // ownership or the group to "root" for security reasons. + if (settings.clientUid != (uid_t) -1 && settings.clientUid != 0) { + _chown(tmpDir, settings.clientUid, + settings.clientGid != 0 ? settings.clientGid : -1); + } } else deletePath(tmpDir); diff --git a/nix/libstore/globals.hh b/nix/libstore/globals.hh index 8c07e360f2..7beb1a55ca 100644 --- a/nix/libstore/globals.hh +++ b/nix/libstore/globals.hh @@ -70,6 +70,12 @@ struct Settings { subgoal of the same goal) fails. */ bool keepGoing; + /* User and groud id of the client issuing the build request. Used to set + the owner and group of the kept temporary directories of failed + builds. */ + uid_t clientUid; + gid_t clientGid; + /* Whether, if we cannot realise the known closure corresponding to a derivation, we should try to normalise the derivation instead. */ diff --git a/nix/libstore/optimise-store.cc b/nix/libstore/optimise-store.cc index 565c62ca83..9bed371c70 100644 --- a/nix/libstore/optimise-store.cc +++ b/nix/libstore/optimise-store.cc @@ -5,6 +5,7 @@ #include "globals.hh" #include <cstdlib> +#include <cstring> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> @@ -159,7 +160,8 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa /* On ext4, that probably means the directory index is full. When that happens, it's fine to ignore it: we just effectively disable deduplication of this file. */ - printMsg(lvlInfo, format("cannot link `%1%' to `%2%': %m") % linkPath % path); + printMsg(lvlInfo, format("cannot link `%1%' to `%2%': %3%") + % linkPath % path % strerror(ENOSPC)); return; default: diff --git a/nix/local.mk b/nix/local.mk index 79667ed49e..eb70d266fb 100644 --- a/nix/local.mk +++ b/nix/local.mk @@ -22,7 +22,7 @@ # BUILT_SOURCES += %D%/libstore/schema.sql.hh -CLEANFILES += $(BUILT_SOURCES) etc/guix-daemon.service etc/guix-daemon.conf +CLEANFILES += $(BUILT_SOURCES) noinst_LIBRARIES = libformat.a libutil.a libstore.a @@ -189,9 +189,9 @@ nodist_systemdservice_DATA = etc/guix-daemon.service etc/guix-publish.service etc/guix-%.service: etc/guix-%.service.in \ $(top_builddir)/config.status - $(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \ - $(SED) -e 's|@''bindir''@|$(bindir)|' < \ - "$(srcdir)/$<" > "$@.tmp"; \ + $(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \ + $(SED) -e 's|@''bindir''@|$(bindir)|' < \ + "$<" > "$@.tmp"; \ mv "$@.tmp" "$@" # The '.conf' jobs for Upstart. @@ -200,17 +200,23 @@ nodist_upstartjob_DATA = etc/guix-daemon.conf etc/guix-publish.conf etc/guix-%.conf: etc/guix-%.conf.in \ $(top_builddir)/config.status - $(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \ - $(SED) -e 's|@''bindir''@|$(bindir)|' < \ - "$(srcdir)/$<" > "$@.tmp"; \ + $(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \ + $(SED) -e 's|@''bindir''@|$(bindir)|' < \ + "$<" > "$@.tmp"; \ mv "$@.tmp" "$@" +CLEANFILES += \ + $(nodist_systemdservice_DATA) \ + $(nodist_upstartjob_DATA) + EXTRA_DIST += \ %D%/libstore/schema.sql \ %D%/AUTHORS \ %D%/COPYING \ - etc/guix-daemon.service.in \ - etc/guix-daemon.conf.in + etc/guix-daemon.service.in \ + etc/guix-daemon.conf.in \ + etc/guix-publish.service.in \ + etc/guix-publish.conf.in if CAN_RUN_TESTS diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc index 9b29b3e91d..47b67d5863 100644 --- a/nix/nix-daemon/nix-daemon.cc +++ b/nix/nix-daemon/nix-daemon.cc @@ -203,11 +203,11 @@ static void stopWork(bool success = true, const string & msg = "", unsigned int } -struct TunnelSink : Sink +struct TunnelSink : BufferedSink { Sink & to; - TunnelSink(Sink & to) : to(to) { } - virtual void operator () (const unsigned char * data, size_t len) + TunnelSink(Sink & to) : BufferedSink(64 * 1024), to(to) { } + virtual void write(const unsigned char * data, size_t len) { writeInt(STDERR_WRITE, to); writeString(data, len, to); @@ -433,6 +433,7 @@ static void performOp(bool trusted, unsigned int clientVersion, startWork(); TunnelSink sink(to); store->exportPath(path, sign, sink); + sink.flush(); stopWork(); writeInt(1, to); break; @@ -959,6 +960,18 @@ static void daemonLoop() strncpy(argvSaved[1], processName.c_str(), strlen(argvSaved[1])); } +#if defined(SO_PEERCRED) + /* Store the client's user and group for this connection. This + has to be done in the forked process since it is per + connection. */ + settings.clientUid = cred.uid; + settings.clientGid = cred.gid; +#else + /* Setting these to -1 means: do not change */ + settings.clientUid = (uid_t) -1; + settings.clientGid = (gid_t) -1; +#endif + /* Handle the connection. */ from.fd = remote; to.fd = remote; diff --git a/po/guix/POTFILES.in b/po/guix/POTFILES.in index 27cc64929d..0a2eee8170 100644 --- a/po/guix/POTFILES.in +++ b/po/guix/POTFILES.in @@ -24,6 +24,7 @@ guix/scripts/edit.scm guix/scripts/size.scm guix/scripts/graph.scm guix/scripts/challenge.scm +guix/scripts/copy.scm guix/gnu-maintenance.scm guix/scripts/container.scm guix/scripts/container/exec.scm diff --git a/po/guix/da.po b/po/guix/da.po index c494ea6b96..cf42db8658 100644 --- a/po/guix/da.po +++ b/po/guix/da.po @@ -3,146 +3,163 @@ # This file is distributed under the same license as the guix package. # Joe Hansen <joedalton2@yahoo.dk>, 2015, 2016. # +# build -> kompilering +# derivation -> derivat +# emit -> opret # garbage -> affald (spild, bedre forslag?) +# in a row -> i træk +# specify -> angiv +# unloading -> afslutter # msgid "" msgstr "" -"Project-Id-Version: guix 0.9.1\n" +"Project-Id-Version: guix 0.12.0\n" "Report-Msgid-Bugs-To: ludo@gnu.org\n" -"POT-Creation-Date: 2016-03-04 16:52+0100\n" -"PO-Revision-Date: 2016-03-27 19:30+01:00\n" +"POT-Creation-Date: 2016-12-18 15:32+0100\n" +"PO-Revision-Date: 2016-12-18 19:31+01:00\n" "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: gnu/packages.scm:73 +#: gnu/packages.scm:79 #, scheme-format msgid "~a: patch not found" msgstr "~a: rettelse blev ikke fundet" -#: gnu/packages.scm:84 +#: gnu/packages.scm:95 #, scheme-format msgid "could not find bootstrap binary '~a' for system '~a'" msgstr "kunne ikke finde bootstraps binære »~a« for system »~a«" -#: gnu/packages.scm:136 +#: gnu/packages.scm:147 #, scheme-format msgid "cannot access `~a': ~a~%" msgstr "kan ikke tilgå »~a«: ~a~%" -#: gnu/packages.scm:289 +#: gnu/packages.scm:301 #, scheme-format msgid "ambiguous package specification `~a'~%" msgstr "tvetydig pakkespecifikation »~a«~%" -#: gnu/packages.scm:290 +#: gnu/packages.scm:302 #, scheme-format msgid "choosing ~a from ~a~%" msgstr "vælger ~a fra ~a~%" -#: gnu/packages.scm:294 +#: gnu/packages.scm:306 #, scheme-format -msgid "deprecated NAME-VERSION syntax.~%" -msgstr "forældet NAVN-VERSION-syntaks.~%" +msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%" +msgstr "forældet NAVN-VERSION-syntaks; brug NAVN@VERSION i stedet for~%" -#: gnu/packages.scm:298 +#: gnu/packages.scm:311 guix/scripts/package.scm:272 +#, scheme-format +msgid "package '~a' has been superseded by '~a'~%" +msgstr "pakken »~a« er blevet efterfulgt af »~a«~%" + +#: gnu/packages.scm:318 #, scheme-format msgid "~A: package not found for version ~a~%" msgstr "~A: pakke ikke fundet for version ~a~%" -#: gnu/packages.scm:305 +#: gnu/packages.scm:328 #, scheme-format msgid "~A: unknown package~%" msgstr "~A: ukendt pakke~%" -#: gnu/packages.scm:333 +#: gnu/packages.scm:356 #, scheme-format msgid "package `~a' lacks output `~a'~%" msgstr "pakke »~a« mangler uddata »~a«~%" -#: gnu/services.scm:527 +#: gnu/services.scm:542 #, scheme-format msgid "no target of type '~a' for service ~s" msgstr "intet mål af typen »~a« for tjeneste ~s" -#: gnu/services.scm:538 gnu/services.scm:599 +#: gnu/services.scm:553 gnu/services.scm:614 #, scheme-format msgid "more than one target service of type '~a'" msgstr "mere end en måltjeneste af typen »~a«" -#: gnu/services.scm:589 +#: gnu/services.scm:604 #, scheme-format msgid "service of type '~a' not found" msgstr "tjenste af typen »~a« blev ikke fundet" -#: gnu/system.scm:546 +#: gnu/system.scm:522 #, scheme-format msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%" msgstr "brug af en streng for filen »~a« er forældet; brug »plain-file« i stedet~%" -#: gnu/system.scm:562 +#: gnu/system.scm:538 #, scheme-format msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%" msgstr "brug af en unik værdi for »~a« er forældet; brug »plain-file« i stedet~%" -#: gnu/system.scm:679 +#: gnu/system.scm:680 #, scheme-format msgid "~a: invalid locale name" -msgstr "~a: ugyldigt sprognavn" +msgstr "~a: ugyldigt navn for regionsindstillinger" -#: gnu/system.scm:798 +#: gnu/system.scm:860 +msgid "/" +msgstr "/" + +#: gnu/system.scm:862 #, scheme-format msgid "unrecognized boot parameters for '~a'~%" msgstr "ikke genkendte opstartsparametre for »~a«~%" -#: gnu/services/shepherd.scm:166 +#: gnu/services/shepherd.scm:165 #, scheme-format msgid "service '~a' provided more than once" -msgstr "tjeneste »~a« tilbudt mere end en gang" +msgstr "tjenesten »~a« tilbudt mere end en gang" -#: gnu/services/shepherd.scm:181 +#: gnu/services/shepherd.scm:180 #, scheme-format -msgid "service '~a' requires '~a', which is undefined" -msgstr "tjeneste »~a« kræver »~a«, som ikke er defineret" +msgid "service '~a' requires '~a', which is not provided by any service" +msgstr "tjenesten »~a« kræver »~a«, som ikke tilbydes af nogen tjeneste" -#: gnu/system/shadow.scm:213 +#: gnu/system/shadow.scm:220 #, scheme-format msgid "supplementary group '~a' of user '~a' is undeclared" -msgstr "supplerende gruppe »~a« for bruger »~a« er ikke deklæret" +msgstr "supplerende gruppe »~a« for bruger »~a« er ikke erklæret" -#: gnu/system/shadow.scm:223 +#: gnu/system/shadow.scm:230 #, scheme-format msgid "primary group '~a' of user '~a' is undeclared" -msgstr "primær gruppe »~a« for brugeren »~a« er ikke deklæret" +msgstr "primær gruppe »~a« for brugeren »~a« er ikke erklæret" -#: guix/scripts.scm:52 +#: guix/scripts.scm:53 #, scheme-format msgid "invalid argument: ~a~%" msgstr "ugyldigt argument: ~a~%" -#: guix/scripts.scm:78 guix/scripts/download.scm:97 guix/scripts/gc.scm:157 -#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77 -#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:874 -#: guix/scripts/publish.scm:354 guix/scripts/graph.scm:346 +#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164 +#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77 +#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042 +#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81 +#: guix/scripts/graph.scm:436 #, scheme-format msgid "~A: unrecognized option~%" msgstr "~A: ikke genkendt tilvalg~%" -#: guix/scripts/build.scm:112 +#: guix/scripts/build.scm:121 #, scheme-format msgid "failed to create GC root `~a': ~a~%" msgstr "kunne ikke oprette GC-root »~a«: ~a~%" -#: guix/scripts/build.scm:189 +#: guix/scripts/build.scm:196 #, scheme-format msgid "invalid replacement specification: ~s~%" msgstr "ugyldig erstatningsspecifikation: ~s~%" -#: guix/scripts/build.scm:237 +#: guix/scripts/build.scm:253 msgid "" "\n" " --with-source=SOURCE\n" @@ -150,9 +167,9 @@ msgid "" msgstr "" "\n" " --with-source=KILDE\n" -" brug KILDE når den tilsvarende pakke bygges" +" brug KILDE når den tilsvarende pakke kompileres" -#: guix/scripts/build.scm:240 +#: guix/scripts/build.scm:256 msgid "" "\n" " --with-input=PACKAGE=REPLACEMENT\n" @@ -162,12 +179,22 @@ msgstr "" " --with-input=PAKKE=ERSTATNING\n" " erstat afhængighedsPAKKE med ERSTATNING" -#: guix/scripts/build.scm:265 +#: guix/scripts/build.scm:259 +msgid "" +"\n" +" --with-graft=PACKAGE=REPLACEMENT\n" +" graft REPLACEMENT on packages that refer to PACKAGE" +msgstr "" +"\n" +" --with-graft=PAKKE=ERSTATNING\n" +" pod ERSTATNING på pakker som refererer til PAKKE" + +#: guix/scripts/build.scm:284 #, scheme-format msgid "transformation '~a' had no effect on ~a~%" msgstr "transformation »~a« havde ingen effekt på ~a~%" -#: guix/scripts/build.scm:283 +#: guix/scripts/build.scm:302 msgid "" "\n" " -L, --load-path=DIR prepend DIR to the package module search path" @@ -175,47 +202,47 @@ msgstr "" "\n" " -L, --load-path=MAPPE foranstil MAPPE til pakkemodulets søgesti" -#: guix/scripts/build.scm:285 +#: guix/scripts/build.scm:304 msgid "" "\n" " -K, --keep-failed keep build tree of failed builds" msgstr "" "\n" -" -K, --keep-failed bevar byggetræ for mislykkede bygninger" +" -K, --keep-failed bevar kompileringstræ for mislykkede kompileringer" -#: guix/scripts/build.scm:287 +#: guix/scripts/build.scm:306 msgid "" "\n" " -k, --keep-going keep going when some of the derivations fail" msgstr "" "\n" -" -k, --keep-going fortsæt når nogle af derivationerne fejler" +" -k, --keep-going fortsæt når nogle af derivaterne fejler" -#: guix/scripts/build.scm:289 +#: guix/scripts/build.scm:308 msgid "" "\n" " -n, --dry-run do not build the derivations" msgstr "" "\n" -" -n, --dry-run byg ikke derivationerne" +" -n, --dry-run kompiler ikke derivater" -#: guix/scripts/build.scm:291 +#: guix/scripts/build.scm:310 msgid "" "\n" " --fallback fall back to building when the substituter fails" msgstr "" "\n" -" --fallback fald tilbage til bygning når erstatningen fejler" +" --fallback fald tilbage til kompilering når erstatningen fejler" -#: guix/scripts/build.scm:293 +#: guix/scripts/build.scm:312 msgid "" "\n" " --no-substitutes build instead of resorting to pre-built substitutes" msgstr "" "\n" -" --no-substitutes byg i stedet for en ny sortering af præbyggede substitutter" +" --no-substitutes kompiler i stedet for at bruge prækompilerede substitutter" -#: guix/scripts/build.scm:295 guix/scripts/size.scm:215 +#: guix/scripts/build.scm:314 guix/scripts/size.scm:220 msgid "" "\n" " --substitute-urls=URLS\n" @@ -225,7 +252,7 @@ msgstr "" " --substitute-urls=ADRESSER\n" " hent substitut fra ADRESSER hvis de er godkendt" -#: guix/scripts/build.scm:298 +#: guix/scripts/build.scm:317 msgid "" "\n" " --no-grafts do not graft packages" @@ -233,15 +260,15 @@ msgstr "" "\n" " --no-grafts pod ikke pakker" -#: guix/scripts/build.scm:300 +#: guix/scripts/build.scm:319 msgid "" "\n" " --no-build-hook do not attempt to offload builds via the build hook" msgstr "" "\n" -" --no-build-hook forsøg ikke at aflaste bygninger via byggekrogen" +" --no-build-hook forsøg ikke at aflaste kompileringer via kompileringskrogen" -#: guix/scripts/build.scm:302 +#: guix/scripts/build.scm:321 msgid "" "\n" " --max-silent-time=SECONDS\n" @@ -249,17 +276,17 @@ msgid "" msgstr "" "\n" " --max-silent-time=SEKUNDER\n" -" marker bygningen som mislykket efter SEKUNDER af stilhed" +" marker kompileringen som mislykket efter SEKUNDERs stilhed" -#: guix/scripts/build.scm:305 +#: guix/scripts/build.scm:324 msgid "" "\n" " --timeout=SECONDS mark the build as failed after SECONDS of activity" msgstr "" "\n" -" --timeout=SEKUNDER marker bygningen som mislykket efter SEKUNDER af aktivitet" +" --timeout=SEKUNDER marker kompileringen som mislykket efter SEKUNDERs aktivitet" -#: guix/scripts/build.scm:307 +#: guix/scripts/build.scm:326 msgid "" "\n" " --verbosity=LEVEL use the given verbosity LEVEL" @@ -267,113 +294,113 @@ msgstr "" "\n" " --verbosity=NIVEAU brug det angivne uddybnings-NIVEAU" -#: guix/scripts/build.scm:309 +#: guix/scripts/build.scm:328 msgid "" "\n" " --rounds=N build N times in a row to detect non-determinism" msgstr "" "\n" -" --rounds=N byg N gange i en række for at detektere ikkedeterminisme" +" --rounds=N kompiler N gange i træk for at detektere ikkedeterminisme" -#: guix/scripts/build.scm:311 +#: guix/scripts/build.scm:330 msgid "" "\n" " -c, --cores=N allow the use of up to N CPU cores for the build" msgstr "" "\n" -" -c, --cores=N tillad brugen af op til N CPU-kerner til bygningen" +" -c, --cores=N tillad brugen af op til N cpu-kerner til kompileringen" -#: guix/scripts/build.scm:313 +#: guix/scripts/build.scm:332 msgid "" "\n" " -M, --max-jobs=N allow at most N build jobs" msgstr "" "\n" -" -M, --max-jobs=N tillad højest N-byggejob" +" -M, --max-jobs=N tillad højst N kompileringsjob" -#: guix/scripts/build.scm:419 guix/scripts/build.scm:426 +#: guix/scripts/build.scm:438 guix/scripts/build.scm:445 #, scheme-format msgid "not a number: '~a' option argument: ~a~%" msgstr "ikke et nummer: »~a« tilvalgsparameter: ~a~%" -#: guix/scripts/build.scm:446 +#: guix/scripts/build.scm:465 msgid "" "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n" "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n" msgstr "" -"Brug: guix build [TILVALG]... PAKKE-ELLER-AFLEDNING...\n" -"Byg den angivne PAKKE-ELLER-AFLEDNING og returner deres uddatastier.\n" +"Brug: guix build [TILVALG]... PAKKE-ELLER-DERIVAT...\n" +"Kompiler den angivne PAKKE-ELLER-DERIVAT og returner deres uddatastier.\n" -#: guix/scripts/build.scm:448 +#: guix/scripts/build.scm:467 msgid "" "\n" " -e, --expression=EXPR build the package or derivation EXPR evaluates to" msgstr "" "\n" " -e, --expression=UDTRYK\n" -" byg pakken eller derivationen UDTRYK evaluerer til" +" kompiler pakken eller derivatet UDTRYK evaluerer til" -#: guix/scripts/build.scm:450 +#: guix/scripts/build.scm:469 msgid "" "\n" " -f, --file=FILE build the package or derivation that the code within\n" " FILE evaluates to" msgstr "" "\n" -" -f, --file=FIL byg pakken eller derivationen som koden i FIL evaluerer\n" +" -f, --file=FIL kompiler pakken eller derivatet som koden i FIL evaluerer\n" " til" -#: guix/scripts/build.scm:453 +#: guix/scripts/build.scm:472 msgid "" "\n" " -S, --source build the packages' source derivations" msgstr "" "\n" -" -S, --source byg pakkernes kildederivationer" +" -S, --source kompiler pakkernes kildederivater" -#: guix/scripts/build.scm:455 +#: guix/scripts/build.scm:474 msgid "" "\n" " --sources[=TYPE] build source derivations; TYPE may optionally be one\n" " of \"package\", \"all\" (default), or \"transitive\"" msgstr "" "\n" -" --sources[=TYPE] bygningskildeafledninger; TYPE kan valgfrit være\n" +" --sources[=TYPE] kompileringskildederivater; TYPE kan valgfrit være\n" " »package«, »all« (standard) eller »transitive«" -#: guix/scripts/build.scm:458 +#: guix/scripts/build.scm:477 msgid "" "\n" " -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\"" msgstr "" "\n" -" -s, --system=SYSTEM forsøger at bygge for SYSTEM--f.eks., »i686-linux«" +" -s, --system=SYSTEM forsøger at kompilere for SYSTEM--f.eks. »i686-linux«" -#: guix/scripts/build.scm:460 +#: guix/scripts/build.scm:479 msgid "" "\n" " --target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\"" msgstr "" "\n" -" --target=TRIPLET krydsbyg for TRIPLET--f.eks., »armel-linux-gnu«" +" --target=TRIPLET krydskompiler for TRIPLET--f.eks. »armel-linux-gnu«" -#: guix/scripts/build.scm:462 +#: guix/scripts/build.scm:481 msgid "" "\n" " -d, --derivations return the derivation paths of the given packages" msgstr "" "\n" -" -d, --derivations returner de afledte stier for de givne pakker" +" -d, --derivations returner de derivate stier for de givne pakker" -#: guix/scripts/build.scm:464 +#: guix/scripts/build.scm:483 msgid "" "\n" " --check rebuild items to check for non-determinism issues" msgstr "" "\n" -" --check byg elementer igen for at kontrollere problemstillinger med ikkedeterminisme" +" --check kompiler elementer igen for at kontrollere ikkedeterminisme" -#: guix/scripts/build.scm:466 +#: guix/scripts/build.scm:485 msgid "" "\n" " -r, --root=FILE make FILE a symlink to the result, and register it\n" @@ -383,22 +410,30 @@ msgstr "" " -r, --root=FIL gør FIL til en symbolsk henvisning for resultatet, og\n" " registrer den som en affaldsindsamlerroot" -#: guix/scripts/build.scm:469 +#: guix/scripts/build.scm:488 +msgid "" +"\n" +" -q, --quiet do not show the build log" +msgstr "" +"\n" +" -q, --quiet vis ikke kompileringsloggen" + +#: guix/scripts/build.scm:490 msgid "" "\n" " --log-file return the log file names for the given derivations" msgstr "" "\n" -" --log-file returner logfilnavnen for de givne afledninger" +" --log-file returner logfilnavnen for de givne derivater" -#: guix/scripts/build.scm:476 guix/scripts/download.scm:54 -#: guix/scripts/package.scm:386 guix/scripts/gc.scm:70 -#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91 -#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83 -#: guix/scripts/substitute.scm:758 guix/scripts/system.scm:631 -#: guix/scripts/lint.scm:823 guix/scripts/publish.scm:63 -#: guix/scripts/edit.scm:44 guix/scripts/size.scm:223 -#: guix/scripts/graph.scm:327 guix/scripts/challenge.scm:181 +#: guix/scripts/build.scm:497 guix/scripts/download.scm:81 +#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74 +#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91 +#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83 +#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748 +#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74 +#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228 +#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43 msgid "" "\n" @@ -407,14 +442,14 @@ msgstr "" "\n" " -h, --help vis denne hjælpetekst og afslut" -#: guix/scripts/build.scm:478 guix/scripts/download.scm:56 -#: guix/scripts/package.scm:388 guix/scripts/gc.scm:72 -#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93 -#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85 -#: guix/scripts/substitute.scm:760 guix/scripts/system.scm:633 -#: guix/scripts/lint.scm:827 guix/scripts/publish.scm:65 -#: guix/scripts/edit.scm:46 guix/scripts/size.scm:225 -#: guix/scripts/graph.scm:329 guix/scripts/challenge.scm:183 +#: guix/scripts/build.scm:499 guix/scripts/download.scm:83 +#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76 +#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93 +#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85 +#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750 +#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76 +#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230 +#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45 msgid "" "\n" @@ -423,7 +458,7 @@ msgstr "" "\n" " -V, --version vis versioninformation og afslut" -#: guix/scripts/build.scm:505 +#: guix/scripts/build.scm:526 #, scheme-format msgid "" "invalid argument: '~a' option argument: ~a, ~\n" @@ -432,33 +467,38 @@ msgstr "" "ugyldigt argument: »~a« tilvalgsargumentet: ~a, ~\n" "skal være »package«, »all« eller »transitive«~%" -#: guix/scripts/build.scm:549 +#: guix/scripts/build.scm:573 #, scheme-format msgid "~s: not something we can build~%" -msgstr "~s: ikke noget vi kan bygge~%" +msgstr "~s: ikke noget vi kan kompilere~%" + +#: guix/scripts/build.scm:627 +#, scheme-format +msgid "~a: warning: package '~a' has no source~%" +msgstr "~a: advarsel: pakken »~a« har ingen kilde~%" -#: guix/scripts/build.scm:629 +#: guix/scripts/build.scm:661 #, scheme-format msgid "no build log for '~a'~%" -msgstr "ingen byggelog for »~a«~%" +msgstr "ingen kompileringslog for »~a«~%" -#: guix/scripts/download.scm:45 +#: guix/scripts/download.scm:67 msgid "" "Usage: guix download [OPTION] URL\n" -"Download the file at URL, add it to the store, and print its store path\n" -"and the hash of its contents.\n" +"Download the file at URL to the store or to the given file, and print its\n" +"file name and the hash of its contents.\n" "\n" "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n" "('hex' and 'hexadecimal' can be used as well).\n" msgstr "" "Brug: guix download [TILVALG] ADRESSE\n" -"hent filen på ADRESSE, tilføj den til lageret, og udskriv dens lagersti\n" -"og hashen for dens indhold.\n" +"Hent filen på ADRESSE til lageret eller til den angivne fil, og udskriv dens\n" +"filnavn og hashen for dens indhold.\n" "\n" "Understøttede formater: »nix-base32« (standard), »base32«, og »base16«\n" "(»hex« og »hexadecimal« kan også bruges).\n" -#: guix/scripts/download.scm:51 guix/scripts/hash.scm:51 +#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54 msgid "" "\n" " -f, --format=FMT write the hash in the given format" @@ -466,91 +506,109 @@ msgstr "" "\n" " -f, --format=FMT skriv hashen i det givne format" -#: guix/scripts/download.scm:74 guix/scripts/hash.scm:76 +#: guix/scripts/download.scm:75 +msgid "" +"\n" +" --no-check-certificate\n" +" do not validate the certificate of HTTPS servers " +msgstr "" +"\n" +" --no-check-certificate\n" +" valider ikke certifikatet for HTTPS-servere" + +#: guix/scripts/download.scm:78 +msgid "" +"\n" +" -o, --output=FILE download to FILE" +msgstr "" +"\n" +" -o, --output=FIL hent til FIL" + +#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82 #, scheme-format msgid "unsupported hash format: ~a~%" msgstr "ikke understøttet hash-format: ~a~%" -#: guix/scripts/download.scm:100 guix/scripts/package.scm:836 -#: guix/scripts/publish.scm:356 +#: guix/scripts/download.scm:136 guix/scripts/package.scm:879 +#: guix/scripts/publish.scm:558 #, scheme-format msgid "~A: extraneous argument~%" msgstr "~A: uvedkommende argument~%" -#: guix/scripts/download.scm:109 +#: guix/scripts/download.scm:144 #, scheme-format msgid "no download URI was specified~%" msgstr "ingen overførselsadresse var angivet~%" -#: guix/scripts/download.scm:111 +#: guix/scripts/download.scm:146 #, scheme-format msgid "~a: failed to parse URI~%" msgstr "~a: kunne ikke fortolke URI~%" -#: guix/scripts/download.scm:122 +#: guix/scripts/download.scm:156 #, scheme-format msgid "~a: download failed~%" msgstr "~a: overførsel mislykkede~%" -#: guix/scripts/package.scm:103 +#: guix/scripts/package.scm:107 #, scheme-format msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%" msgstr "Prøv »info '(guix) Invoking guix package'« for yderligere information.~%" -#: guix/scripts/package.scm:125 +#: guix/scripts/package.scm:129 #, scheme-format msgid "error: while creating directory `~a': ~a~%" msgstr "fejl: under oprettelse af mappe »~a«: ~a~%" -#: guix/scripts/package.scm:129 +#: guix/scripts/package.scm:133 #, scheme-format msgid "Please create the `~a' directory, with you as the owner.~%" msgstr "Opret venligst mappen »~a«, med dig som ejer.~%" -#: guix/scripts/package.scm:136 +#: guix/scripts/package.scm:140 #, scheme-format msgid "error: directory `~a' is not owned by you~%" msgstr "fejl: mappen »~a« er ikke ejet af dig~%" -#: guix/scripts/package.scm:139 +#: guix/scripts/package.scm:143 #, scheme-format msgid "Please change the owner of `~a' to user ~s.~%" msgstr "Ændr venligst ejeren af »~a« til brugeren ~s.~%" -#: guix/scripts/package.scm:174 +#: guix/scripts/package.scm:178 #, scheme-format msgid "not removing generation ~a, which is current~%" msgstr "fjerner ikke generation ~a, som er nuværende~%" -#: guix/scripts/package.scm:181 +#: guix/scripts/package.scm:185 #, scheme-format msgid "no matching generation~%" msgstr "ingen matchende generation~%" -#: guix/scripts/package.scm:184 guix/scripts/package.scm:657 -#: guix/scripts/system.scm:459 +#: guix/scripts/package.scm:188 guix/scripts/package.scm:699 +#: guix/scripts/system.scm:549 #, scheme-format msgid "invalid syntax: ~a~%" msgstr "ugyldig syntaks: ~a~%" -#: guix/scripts/package.scm:209 +#: guix/scripts/package.scm:214 #, scheme-format msgid "nothing to be done~%" msgstr "intet at udføre~%" -#: guix/scripts/package.scm:223 +#: guix/scripts/package.scm:228 #, scheme-format msgid "~a package in profile~%" msgid_plural "~a packages in profile~%" msgstr[0] "~a pakke i profil~%" msgstr[1] "~a pakker i profil~%" -#: guix/scripts/package.scm:311 +#: guix/scripts/package.scm:344 #, scheme-format msgid "The following environment variable definitions may be needed:~%" msgstr "De følgende miljøvariabeldefinitioner kan være krævet:~%" -#: guix/scripts/package.scm:327 +#: guix/scripts/package.scm:360 msgid "" "Usage: guix package [OPTION]...\n" "Install, remove, or upgrade packages in a single transaction.\n" @@ -558,7 +616,7 @@ msgstr "" "Brug: guix-pakke [TILVALG] ... \n" "Installer, fjern eller opgrader pakker i en enkel transaktion.\n" -#: guix/scripts/package.scm:329 +#: guix/scripts/package.scm:362 msgid "" "\n" " -i, --install PACKAGE ...\n" @@ -568,7 +626,7 @@ msgstr "" " -i, --install PAKKE ...\n" " installer PAKKER" -#: guix/scripts/package.scm:332 +#: guix/scripts/package.scm:365 msgid "" "\n" " -e, --install-from-expression=EXP\n" @@ -578,7 +636,7 @@ msgstr "" " -e, --install-from-expression=UDTRYK\n" " installer pakken UDTRYK evaluerer til" -#: guix/scripts/package.scm:335 +#: guix/scripts/package.scm:368 msgid "" "\n" " -f, --install-from-file=FILE\n" @@ -590,7 +648,7 @@ msgstr "" " installer pakken som koden i FIL evaluerer\n" " til" -#: guix/scripts/package.scm:339 +#: guix/scripts/package.scm:372 msgid "" "\n" " -r, --remove PACKAGE ...\n" @@ -600,7 +658,7 @@ msgstr "" " -r, --remove PAKKE ...\n" " fjern PAKKER" -#: guix/scripts/package.scm:342 +#: guix/scripts/package.scm:375 msgid "" "\n" " -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP" @@ -610,7 +668,7 @@ msgstr "" " opgrader alle de installerede pakker der matcher\n" " REGUDTRYK" -#: guix/scripts/package.scm:344 +#: guix/scripts/package.scm:377 msgid "" "\n" " -m, --manifest=FILE create a new profile generation with the manifest\n" @@ -620,7 +678,7 @@ msgstr "" " -m, --manifest=FIL opret en ny profiloprettelse med manifestet fra\n" " FIL" -#: guix/scripts/package.scm:347 +#: guix/scripts/package.scm:380 msgid "" "\n" " --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP" @@ -628,7 +686,7 @@ msgstr "" "\n" " --do-not--upgrade[=REGUDTRYK] opgrader ikke pakker der matcher REGUDTRYK" -#: guix/scripts/package.scm:349 +#: guix/scripts/package.scm:382 msgid "" "\n" " --roll-back roll back to the previous generation" @@ -636,7 +694,7 @@ msgstr "" "\n" " --roll-back rul tilbage til den forrige generation" -#: guix/scripts/package.scm:351 +#: guix/scripts/package.scm:384 msgid "" "\n" " --search-paths[=KIND]\n" @@ -646,7 +704,7 @@ msgstr "" " --search-paths[=KIND]\n" " vis krævede miljøvariabeldefinitioner" -#: guix/scripts/package.scm:354 +#: guix/scripts/package.scm:387 msgid "" "\n" " -l, --list-generations[=PATTERN]\n" @@ -656,7 +714,7 @@ msgstr "" " -l, --list-generations[=MØNSTER]\n" " vis generationer der matcher MØNSTER" -#: guix/scripts/package.scm:357 +#: guix/scripts/package.scm:390 msgid "" "\n" " -d, --delete-generations[=PATTERN]\n" @@ -666,7 +724,7 @@ msgstr "" " -d, --delete-generations[=MØNSTER]\n" " slet generationer der matcher MØNSTER" -#: guix/scripts/package.scm:360 +#: guix/scripts/package.scm:393 msgid "" "\n" " -S, --switch-generation=PATTERN\n" @@ -676,7 +734,7 @@ msgstr "" " -S, --switch-generation=MØNSTER\n" " skift til et generationsmatchende MØNSTER" -#: guix/scripts/package.scm:363 +#: guix/scripts/package.scm:396 msgid "" "\n" " -p, --profile=PROFILE use PROFILE instead of the user's default profile" @@ -684,15 +742,15 @@ msgstr "" "\n" " -p, --profile=PROFIL brug PROFIL i stedet for brugerens standardprofil" -#: guix/scripts/package.scm:366 +#: guix/scripts/package.scm:399 msgid "" "\n" " --bootstrap use the bootstrap Guile to build the profile" msgstr "" "\n" -" --bootstrap brug bootstrap Guile til at bygge profilen" +" --bootstrap brug bootstrap Guile til at kompilere profilen" -#: guix/scripts/package.scm:368 guix/scripts/pull.scm:76 +#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76 msgid "" "\n" " --verbose produce verbose output" @@ -700,7 +758,7 @@ msgstr "" "\n" " --verbose lav uddybende uddata" -#: guix/scripts/package.scm:371 +#: guix/scripts/package.scm:404 msgid "" "\n" " -s, --search=REGEXP search in synopsis and description using REGEXP" @@ -708,7 +766,7 @@ msgstr "" "\n" " -s, --search=REGUDTRYK søg i synopsis og beskrivelse via REGUDTRYK" -#: guix/scripts/package.scm:373 +#: guix/scripts/package.scm:406 msgid "" "\n" " -I, --list-installed[=REGEXP]\n" @@ -718,7 +776,7 @@ msgstr "" " -I, --list-installed[=REGUDTRYK]\n" " vis installerede pakker der matcher REGUDTRYK" -#: guix/scripts/package.scm:376 +#: guix/scripts/package.scm:409 msgid "" "\n" " -A, --list-available[=REGEXP]\n" @@ -728,7 +786,7 @@ msgstr "" " -A, --list-available[=REGUDTRYK]\n" " vis tilgængelige pakker der matcher REGUDTRYK" -#: guix/scripts/package.scm:379 +#: guix/scripts/package.scm:412 msgid "" "\n" " --show=PACKAGE show details about PACKAGE" @@ -736,27 +794,27 @@ msgstr "" "\n" " --show=PACKAGE vis detaljer om PAKKE" -#: guix/scripts/package.scm:474 +#: guix/scripts/package.scm:507 #, scheme-format msgid "~a: unsupported kind of search path~%" msgstr "~a: ikke understøttet type af søgesti%" -#: guix/scripts/package.scm:753 +#: guix/scripts/package.scm:790 #, scheme-format msgid "cannot switch to generation '~a'~%" msgstr "kan ikke skifte til generation »~a«~%" -#: guix/scripts/package.scm:769 +#: guix/scripts/package.scm:806 #, scheme-format msgid "would install new manifest from '~a' with ~d entries~%" msgstr "vil installere nyt manifest fra »~a« med ~d poster~%" -#: guix/scripts/package.scm:771 +#: guix/scripts/package.scm:808 #, scheme-format msgid "installing new manifest from '~a' with ~d entries~%" msgstr "installerer nyt manifest fra »~a« med ~d poster~%" -#: guix/scripts/gc.scm:40 +#: guix/scripts/gc.scm:42 msgid "" "Usage: guix gc [OPTION]... PATHS...\n" "Invoke the garbage collector.\n" @@ -764,7 +822,7 @@ msgstr "" "Brug: guix gc [TILVALG]... STIER...\n" "Start affaldsindsamleren.\n" -#: guix/scripts/gc.scm:42 +#: guix/scripts/gc.scm:44 msgid "" "\n" " -C, --collect-garbage[=MIN]\n" @@ -774,7 +832,15 @@ msgstr "" " -C, --collect-garbage[=MIN]\n" " saml mindst MIN byte affald" -#: guix/scripts/gc.scm:45 +#: guix/scripts/gc.scm:47 +msgid "" +"\n" +" -F, --free-space=FREE attempt to reach FREE available space in the store" +msgstr "" +"\n" +" -F, --free-space=FRI forsøger at nå FRI tilgængelig plads i lageret" + +#: guix/scripts/gc.scm:49 msgid "" "\n" " -d, --delete attempt to delete PATHS" @@ -782,7 +848,7 @@ msgstr "" "\n" " -d, --delete forsøg at slette STIER" -#: guix/scripts/gc.scm:47 +#: guix/scripts/gc.scm:51 msgid "" "\n" " --optimize optimize the store by deduplicating identical files" @@ -790,7 +856,7 @@ msgstr "" "\n" " --optimize optimer lageret ved at fjerne identiske filer" -#: guix/scripts/gc.scm:49 +#: guix/scripts/gc.scm:53 msgid "" "\n" " --list-dead list dead paths" @@ -798,7 +864,7 @@ msgstr "" "\n" " --list-dead vis døde stier" -#: guix/scripts/gc.scm:51 +#: guix/scripts/gc.scm:55 msgid "" "\n" " --list-live list live paths" @@ -806,7 +872,7 @@ msgstr "" "\n" " --list-live vis live stier" -#: guix/scripts/gc.scm:54 +#: guix/scripts/gc.scm:58 msgid "" "\n" " --references list the references of PATHS" @@ -814,7 +880,7 @@ msgstr "" "\n" " --references vis referencerne for STIER" -#: guix/scripts/gc.scm:56 +#: guix/scripts/gc.scm:60 msgid "" "\n" " -R, --requisites list the requisites of PATHS" @@ -822,7 +888,7 @@ msgstr "" "\n" " -R, --requisites vis rekvisitter for STIER" -#: guix/scripts/gc.scm:58 +#: guix/scripts/gc.scm:62 msgid "" "\n" " --referrers list the referrers of PATHS" @@ -830,7 +896,7 @@ msgstr "" "\n" " --referrers vis henvisninger for STIER" -#: guix/scripts/gc.scm:61 +#: guix/scripts/gc.scm:65 msgid "" "\n" " --verify[=OPTS] verify the integrity of the store; OPTS is a\n" @@ -842,15 +908,15 @@ msgstr "" " kommaadskilt kombination af »repair« og \n" " »contents«" -#: guix/scripts/gc.scm:65 +#: guix/scripts/gc.scm:69 msgid "" "\n" " --list-failures list cached build failures" msgstr "" "\n" -" --list-failures vis mellemlagrede byggefejl" +" --list-failures vis mellemlagrede kompileringsfejl" -#: guix/scripts/gc.scm:67 +#: guix/scripts/gc.scm:71 msgid "" "\n" " --clear-failures remove PATHS from the set of cached failures" @@ -858,17 +924,29 @@ msgstr "" "\n" " --clear-failures fjern STIER fra sættet med mellemlagrede fejl" -#: guix/scripts/gc.scm:96 +#: guix/scripts/gc.scm:100 #, scheme-format msgid "invalid amount of storage: ~a~%" msgstr "ugyldig lagermængde: ~a~%" -#: guix/scripts/gc.scm:187 +#: guix/scripts/gc.scm:191 +msgid "already ~h bytes available on ~a, nothing to do~%" +msgstr "der er allerede ~h byte tilgængelige på ~a, intet at udføre~%" + +#: guix/scripts/gc.scm:194 +msgid "freeing ~h bytes~%" +msgstr "frigiver ~h byte~%" + +#: guix/scripts/gc.scm:206 #, scheme-format msgid "extraneous arguments: ~{~a ~}~%" msgstr "uvedkommende argumenter: ~{~a ~}~%" -#: guix/scripts/hash.scm:46 +#: guix/scripts/gc.scm:226 guix/scripts/gc.scm:229 +msgid "freed ~h bytes~%" +msgstr "frigav ~h byte~%" + +#: guix/scripts/hash.scm:47 msgid "" "Usage: guix hash [OPTION] FILE\n" "Return the cryptographic hash of FILE.\n" @@ -882,7 +960,15 @@ msgstr "" "Understøttede formater: »nix-base32« (standard), »base32« og »base16« (»hex«\n" "og »hexadecimal« kan også bruges).\n" -#: guix/scripts/hash.scm:53 +#: guix/scripts/hash.scm:52 +msgid "" +"\n" +" -x, --exclude-vcs exclude version control directories" +msgstr "" +"\n" +" -x, --exclude-vcs ekskluder versionskontrolmapper" + +#: guix/scripts/hash.scm:56 msgid "" "\n" " -r, --recursive compute the hash on FILE recursively" @@ -890,17 +976,18 @@ msgstr "" "\n" " -r, --recursive beregn hashen på FIL rekursivt" -#: guix/scripts/hash.scm:104 +#: guix/scripts/hash.scm:109 #, scheme-format msgid "unrecognized option: ~a~%" msgstr "tilvalg blev ikke genkendt: ~a~%" -#: guix/scripts/hash.scm:135 guix/ui.scm:460 +#: guix/scripts/hash.scm:152 guix/ui.scm:478 #, scheme-format msgid "~a~%" msgstr "~a~%" -#: guix/scripts/hash.scm:138 guix/scripts/system.scm:761 +#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879 +#: guix/scripts/system.scm:886 guix/scripts/system.scm:893 #, scheme-format msgid "wrong number of arguments~%" msgstr "forkert antal argumenter~%" @@ -922,12 +1009,17 @@ msgstr "IMPORTER skal være en af importørerne vist nedenfor:\n" msgid "guix import: missing importer name~%" msgstr "guix import: mangler importørnavn~%" -#: guix/scripts/import.scm:113 +#: guix/scripts/import.scm:122 #, scheme-format -msgid "guix import: invalid importer~%" -msgstr "guix import: ugyldig importør~%" +msgid "'~a' import failed~%" +msgstr "import af »~a« mislykkedes~%" -#: guix/scripts/import/cran.scm:42 +#: guix/scripts/import.scm:123 +#, scheme-format +msgid "~a: invalid importer~%" +msgstr "~a: ugyldigt importprogram~%" + +#: guix/scripts/import/cran.scm:43 msgid "" "Usage: guix import cran PACKAGE-NAME\n" "Import and convert the CRAN package for PACKAGE-NAME.\n" @@ -935,25 +1027,25 @@ msgstr "" "Usage: guix import cran PAKKENAVN\n" "Importer og konverter pakken CRAN for PAKKENAVN.\n" -#: guix/scripts/import/cran.scm:44 +#: guix/scripts/import/cran.scm:45 msgid "" "\n" " -a, --archive=ARCHIVE specify the archive repository" msgstr "" "\n" -" -a, --archive=ARKIV specificer arkivet" +" -a, --archive=ARKIV angiv arkivet" -#: guix/scripts/import/cran.scm:94 +#: guix/scripts/import/cran.scm:108 #, scheme-format msgid "failed to download description for package '~a'~%" msgstr "kunne ikke hente beskrivelse for pakke »~a«:~%" -#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95 +#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95 #, scheme-format msgid "too few arguments~%" msgstr "for få argumenter~%" -#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97 +#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97 #, scheme-format msgid "too many arguments~%" msgstr "for mange argumenter~%" @@ -972,7 +1064,7 @@ msgid "" " -a, --archive=ARCHIVE specify the archive repository" msgstr "" "\n" -" -a, --archive=ARKIV specificer arkivet" +" -a, --archive=ARKIV angiv arkivet" #: guix/scripts/import/elpa.scm:45 msgid "" @@ -1017,7 +1109,7 @@ msgid "" " --bootstrap use the bootstrap Guile to build the new Guix" msgstr "" "\n" -" --bootstrap brug bootstrap Guile til at bygge den nye Guix" +" --bootstrap brug bootstrap Guile til at kompilere den nye Guix" #: guix/scripts/pull.scm:134 msgid "tarball did not produce a single source directory" @@ -1044,7 +1136,7 @@ msgstr "opdaterede ~a der med succes blev udrullet undet »~a«~%" #: guix/scripts/pull.scm:212 #, scheme-format msgid "failed to update Guix, check the build log~%" -msgstr "kunne ikke opdatere Guix, kontroller byggeloggen~%" +msgstr "kunne ikke opdatere Guix; kontroller kompileringsloggen~%" #: guix/scripts/pull.scm:221 #, scheme-format @@ -1055,100 +1147,135 @@ msgstr "~A: uventet argument~%" msgid "failed to download up-to-date source, exiting\n" msgstr "kunne ikke hente opdateret kilde, afslutter\n" -#: guix/scripts/substitute.scm:103 +#: guix/scripts/substitute.scm:112 #, scheme-format msgid "authentication and authorization of substitutes disabled!~%" msgstr "godkendelse og autorisation af substitutter er deaktiveret!~%" -#: guix/scripts/substitute.scm:179 +#: guix/scripts/substitute.scm:187 #, scheme-format msgid "download from '~a' failed: ~a, ~s~%" msgstr "hent fra »~a« mislykkedes: ~a, ~s~%" -#: guix/scripts/substitute.scm:191 +#: guix/scripts/substitute.scm:200 #, scheme-format msgid "while fetching ~a: server is somewhat slow~%" msgstr "under overførsel af ~a: server er noget langsom~%" -#: guix/scripts/substitute.scm:193 +#: guix/scripts/substitute.scm:202 #, scheme-format msgid "try `--no-substitutes' if the problem persists~%" msgstr "prøv »--no-substitutes« hvis problemet fortsætter~%" -#: guix/scripts/substitute.scm:266 +#: guix/scripts/substitute.scm:220 +#, scheme-format +msgid "unsupported substitute URI scheme: ~a~%" +msgstr "ikke understøttet substitut-URI-skema: ~a~%" + +#: guix/scripts/substitute.scm:254 +#, scheme-format +msgid "while fetching '~a': ~a (~s)~%" +msgstr "under overførsel af »~a«: ~a (~s)~%" + +#: guix/scripts/substitute.scm:259 +#, scheme-format +msgid "ignoring substitute server at '~s'~%" +msgstr "ignorerer substitutserver »~s«~%" + +#: guix/scripts/substitute.scm:309 #, scheme-format msgid "signature version must be a number: ~s~%" msgstr "signaturversion skal være et nummer: ~s~%" -#: guix/scripts/substitute.scm:270 +#: guix/scripts/substitute.scm:313 #, scheme-format msgid "unsupported signature version: ~a~%" msgstr "signaturversion er ikke understøttet: ~a~%" -#: guix/scripts/substitute.scm:278 +#: guix/scripts/substitute.scm:321 #, scheme-format msgid "signature is not a valid s-expression: ~s~%" msgstr "signatur er ikke et gyldigt s-udtryk: ~s~%" -#: guix/scripts/substitute.scm:282 +#: guix/scripts/substitute.scm:325 #, scheme-format msgid "invalid format of the signature field: ~a~%" msgstr "ugyldigt format for signaturfeltet: ~a~%" -#: guix/scripts/substitute.scm:317 +#: guix/scripts/substitute.scm:360 #, scheme-format msgid "invalid signature for '~a'~%" msgstr "ugyldig signatur for »~a«~%" -#: guix/scripts/substitute.scm:319 +#: guix/scripts/substitute.scm:362 #, scheme-format msgid "hash mismatch for '~a'~%" msgstr "hash mismatch for »~a«~%" -#: guix/scripts/substitute.scm:321 +#: guix/scripts/substitute.scm:364 #, scheme-format msgid "'~a' is signed with an unauthorized key~%" msgstr "»~a« er underskrevet med en uautoriseret nøgle~%" -#: guix/scripts/substitute.scm:323 +#: guix/scripts/substitute.scm:366 #, scheme-format msgid "signature on '~a' is corrupt~%" msgstr "signatur på »~a« er ødelagt~%" -#: guix/scripts/substitute.scm:361 +#: guix/scripts/substitute.scm:404 #, scheme-format msgid "substitute at '~a' lacks a signature~%" msgstr "substitut på »~a« mangler en signatur~%" -#: guix/scripts/substitute.scm:537 +#: guix/scripts/substitute.scm:411 +#, scheme-format +msgid "Found valid signature for ~a~%" +msgstr "Fandt gyldig signatur for ~a~%" + +#: guix/scripts/substitute.scm:414 +#, scheme-format +msgid "From ~a~%" +msgstr "Fra ~a~%" + +#: guix/scripts/substitute.scm:454 +#, scheme-format +msgid "'~a' does not name a store item~%" +msgstr "»~a« nævner ikke et lagerelement~%" + +#: guix/scripts/substitute.scm:600 #, scheme-format msgid "updating list of substitutes from '~a'... ~5,1f%" msgstr "opdaterer liste af substitutter fra »~a«... ~5,1f%" -#: guix/scripts/substitute.scm:585 +#: guix/scripts/substitute.scm:655 #, scheme-format msgid "~s: unsupported server URI scheme~%" msgstr "~s: ikke understøttet server-URI-skema~%" -#: guix/scripts/substitute.scm:596 +#: guix/scripts/substitute.scm:665 #, scheme-format msgid "'~a' uses different store '~a'; ignoring it~%" msgstr "»~a« bruger et andet lager »~a«; ignorerer~%" -#: guix/scripts/substitute.scm:739 +#: guix/scripts/substitute.scm:810 #, scheme-format msgid "host name lookup error: ~a~%" msgstr "opslagsfejl for værtsnavn: ~a~%" -#: guix/scripts/substitute.scm:748 +#: guix/scripts/substitute.scm:815 +#, scheme-format +msgid "TLS error in procedure '~a': ~a~%" +msgstr "TLS-fejl i proceduren »~a«: ~a~%" + +#: guix/scripts/substitute.scm:826 msgid "" "Usage: guix substitute [OPTION]...\n" "Internal tool to substitute a pre-built binary to a local build.\n" msgstr "" "Brug: guix substitute [TILVALG] ...\n" -"Internt værktøj til at erstatte en præbygget binær fil med en lokal bygning.\n" +"Internt værktøj til at erstatte en prækompileret binær fil med en lokal kompilering.\n" -#: guix/scripts/substitute.scm:750 +#: guix/scripts/substitute.scm:828 msgid "" "\n" " --query report on the availability of substitutes for the\n" @@ -1158,7 +1285,7 @@ msgstr "" " --query rapport om tilgængeligheden for substitutter for\n" " lagerfilnavnene sendt til standardind" -#: guix/scripts/substitute.scm:753 +#: guix/scripts/substitute.scm:831 msgid "" "\n" " --substitute STORE-FILE DESTINATION\n" @@ -1170,36 +1297,44 @@ msgstr "" " hent LAGER-FIL og lagr den som en Nar i filen\n" " DESTINATION" -#: guix/scripts/substitute.scm:878 +#. TRANSLATORS: The second part of this message looks like +#. "(4.1MiB installed)"; it shows the size of the package once +#. installed. +#: guix/scripts/substitute.scm:904 +#, scheme-format +msgid "Downloading ~a~:[~*~; (~a installed)~]...~%" +msgstr "Henter ~a~:[~*~; (~a installeret)~]...~%" + +#: guix/scripts/substitute.scm:961 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n" msgstr "ACL for arkivimporter ser ikke ud til at være initialiseret, substitutter kan være utilgængelige\n" -#: guix/scripts/substitute.scm:960 +#: guix/scripts/substitute.scm:1057 #, scheme-format msgid "~a: unrecognized options~%" msgstr "~a: ikke genkendte tilvalg~%" -#: guix/scripts/authenticate.scm:58 +#: guix/scripts/authenticate.scm:59 #, scheme-format msgid "cannot find public key for secret key '~a'~%" msgstr "kan ikke finde offentlig nøgle for hemmelig nøgle »~a«~%" -#: guix/scripts/authenticate.scm:78 +#: guix/scripts/authenticate.scm:79 #, scheme-format msgid "error: invalid signature: ~a~%" msgstr "fejl: ugyldig signatur: ~a~%" -#: guix/scripts/authenticate.scm:80 +#: guix/scripts/authenticate.scm:81 #, scheme-format msgid "error: unauthorized public key: ~a~%" msgstr "fejl: ikke autoriseret offentlig nøgle: ~a~%" -#: guix/scripts/authenticate.scm:82 +#: guix/scripts/authenticate.scm:83 #, scheme-format msgid "error: corrupt signature data: ~a~%" msgstr "fejl: ødelagt signaturdata: ~a~%" -#: guix/scripts/authenticate.scm:120 +#: guix/scripts/authenticate.scm:121 msgid "" "Usage: guix authenticate OPTION...\n" "Sign or verify the signature on the given file. This tool is meant to\n" @@ -1209,150 +1344,215 @@ msgstr "" "Underskriv eller verificer signaturen på den givne fil. Dette værktøj skal\n" "bruges internt af »guix-daemon«.\n" -#: guix/scripts/authenticate.scm:126 +#: guix/scripts/authenticate.scm:127 msgid "wrong arguments" msgstr "forkerte argumenter" -#: guix/scripts/system.scm:111 +#: guix/scripts/system.scm:109 #, scheme-format msgid "failed to register '~a' under '~a'~%" msgstr "kunne ikke registrere »~a« under »~a«~%" -#: guix/scripts/system.scm:143 +#: guix/scripts/system.scm:142 #, scheme-format msgid "failed to install GRUB on device '~a'~%" msgstr "kunne ikke installere GRUB på enhed »~a«~%" -#: guix/scripts/system.scm:161 +#: guix/scripts/system.scm:160 #, scheme-format msgid "initializing the current root file system~%" msgstr "initialiserer det nuværende root-filsystem~%" -#: guix/scripts/system.scm:175 +#: guix/scripts/system.scm:174 #, scheme-format msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%" msgstr "kører ikke som »root«, så ejerskabet af »~a« kan være forkert!~%" -#: guix/scripts/system.scm:233 +#: guix/scripts/system.scm:238 #, scheme-format msgid "while talking to shepherd: ~a~%" msgstr "under kommunikation med shepherd: ~a~%" -#: guix/scripts/system.scm:279 +#: guix/scripts/system.scm:245 +#, scheme-format +msgid "service '~a' could not be found~%" +msgstr "tjensten »~a« blev ikke fundet~%" + +#: guix/scripts/system.scm:248 +#, scheme-format +msgid "service '~a' does not have an action '~a'~%" +msgstr "tjenesten »~a« har ikke en handling »~a«~%" + +#: guix/scripts/system.scm:252 +#, scheme-format +msgid "exception caught while executing '~a' on service '~a':~%" +msgstr "undtagelse fanget under kørsel af »~a« på tjenesten »~a«:~%" + +#: guix/scripts/system.scm:260 +#, scheme-format +msgid "something went wrong: ~s~%" +msgstr "noget gik galt: ~s~%" + +#: guix/scripts/system.scm:263 +#, scheme-format +msgid "shepherd error~%" +msgstr "shepherd-fejl~%" + +#: guix/scripts/system.scm:280 +#, scheme-format +msgid "failed to obtain list of shepherd services~%" +msgstr "kunne ikke indhente liste over shepherd-tjenester~%" + +#: guix/scripts/system.scm:300 #, scheme-format msgid "unloading service '~a'...~%" -msgstr "udlæser tjeneste »~a« ...~%" +msgstr "afslutter tjeneste »~a« ...~%" -#: guix/scripts/system.scm:287 +#: guix/scripts/system.scm:308 #, scheme-format msgid "loading new services:~{ ~a~}...~%" msgstr "indlæser nye tjenester:~{ ~a~}...~%" -#: guix/scripts/system.scm:311 +#: guix/scripts/system.scm:332 #, scheme-format msgid "activating system...~%" msgstr "aktiverer system ...~%" -#: guix/scripts/system.scm:402 +#: guix/scripts/system.scm:425 +#, scheme-format +msgid "cannot switch to system generation '~a'~%" +msgstr "kan ikke skifte til systemoprettelse »~a«~%" + +#: guix/scripts/system.scm:459 +#, scheme-format +msgid "failed to re-install GRUB configuration file: '~a'~%" +msgstr "kunne ikke geninstallere GRUB-konfigurationsfilen: »~a«~%" + +#: guix/scripts/system.scm:489 msgid "the DAG of services" -msgstr "DAG'en for tjenester" +msgstr "DAGen for tjenester" -#: guix/scripts/system.scm:415 +#: guix/scripts/system.scm:502 msgid "the dependency graph of shepherd services" msgstr "afhængighedsgrafen for shepherd-tjenester" -#: guix/scripts/system.scm:436 +#: guix/scripts/system.scm:526 #, scheme-format msgid " file name: ~a~%" msgstr " filnavn: ~a~%" -#: guix/scripts/system.scm:437 +#: guix/scripts/system.scm:527 #, scheme-format msgid " canonical file name: ~a~%" msgstr " kanonisk filnavn: ~a~%" #. TRANSLATORS: Please preserve the two-space indentation. -#: guix/scripts/system.scm:439 +#: guix/scripts/system.scm:529 #, scheme-format msgid " label: ~a~%" msgstr " etikelt: ~a~%" -#: guix/scripts/system.scm:440 +#: guix/scripts/system.scm:530 #, scheme-format msgid " root device: ~a~%" msgstr " root-enhed: ~a~%" -#: guix/scripts/system.scm:441 +#: guix/scripts/system.scm:531 #, scheme-format msgid " kernel: ~a~%" msgstr " kerne: ~a~%" -#: guix/scripts/system.scm:549 +#: guix/scripts/system.scm:588 +#, scheme-format +msgid "~a not found: 'guix pull' was never run~%" +msgstr "~a blev ikke fundet: »guix pull« blev aldrig kørt~%" + +#: guix/scripts/system.scm:589 +#, scheme-format +msgid "Consider running 'guix pull' before 'reconfigure'.~%" +msgstr "Overvej at køre »guix pull« før »reconfigure«.~%" + +#: guix/scripts/system.scm:590 +#, scheme-format +msgid "Failing to do that may downgrade your system!~%" +msgstr "Hvis dette ikke gøres, kan dit system blive nedgraderet!~%" + +#: guix/scripts/system.scm:661 #, scheme-format msgid "initializing operating system under '~a'...~%" msgstr "initialiserer operativsystem under »~a«...~%" -#: guix/scripts/system.scm:588 +#: guix/scripts/system.scm:700 msgid "" -"Usage: guix system [OPTION] ACTION [FILE]\n" +"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n" "Build the operating system declared in FILE according to ACTION.\n" +"Some ACTIONS support additional ARGS.\n" msgstr "" -"Brug: guix system [TILVALG] HANDLING [FIL]\n" -"Byg operativsystemet deklæret i FIL jævnfør HANDLING.\n" +"Brug: guix system [TILVALG] HANDLING [ARG ...] [FIL]\n" +"Kompiler operativsystemet erklæret i FIL jævnfør HANDLING.\n" +"Nogle HANDLINGER understøtter yderligere ARGUMENTER.\n" -#: guix/scripts/system.scm:591 guix/scripts/container.scm:28 +#: guix/scripts/system.scm:704 guix/scripts/container.scm:28 msgid "The valid values for ACTION are:\n" msgstr "De gyldige værdier for HANDLING er:\n" -#: guix/scripts/system.scm:593 +#: guix/scripts/system.scm:706 msgid " reconfigure switch to a new operating system configuration\n" msgstr " reconfigure skift til en ny operativsystemkonfiguration\n" -#: guix/scripts/system.scm:595 +#: guix/scripts/system.scm:708 +msgid " roll-back switch to the previous operating system configuration\n" +msgstr " roll-back skift til den forrige operativsystemkonfiguration\n" + +#: guix/scripts/system.scm:710 +msgid " switch-generation switch to an existing operating system configuration\n" +msgstr " switch-generation skift til en eksisterende operativsystemkonfiguration\n" + +#: guix/scripts/system.scm:712 msgid " list-generations list the system generations\n" msgstr " list-generations viser systemoprettelserne\n" -#: guix/scripts/system.scm:597 +#: guix/scripts/system.scm:714 msgid " build build the operating system without installing anything\n" -msgstr " build byg operativsystemet uden at installere noget\n" +msgstr " build kompiler operativsystemet uden at installere noget\n" -#: guix/scripts/system.scm:599 +#: guix/scripts/system.scm:716 msgid " container build a container that shares the host's store\n" -msgstr " container byg en container som deler værtens lager\n" +msgstr " container kompiler en container som deler værtens lager\n" -#: guix/scripts/system.scm:601 +#: guix/scripts/system.scm:718 msgid " vm build a virtual machine image that shares the host's store\n" -msgstr " vm byg et virtuelt maskinaftryk som deler værtens lager\n" +msgstr " vm kompiler et virtuelt maskinaftryk som deler værtens lager\n" -#: guix/scripts/system.scm:603 +#: guix/scripts/system.scm:720 msgid " vm-image build a freestanding virtual machine image\n" -msgstr " vm-image byg et fritstående virtuelt maskinaftryk\n" +msgstr " vm-image kompiler et fritstående virtuelt maskinaftryk\n" -#: guix/scripts/system.scm:605 +#: guix/scripts/system.scm:722 msgid " disk-image build a disk image, suitable for a USB stick\n" -msgstr " disk-image byg et diskaftryk, egnet for et USB-drev\n" +msgstr " disk-image kompiler et diskaftryk, som egner sig til et USB-drev\n" -#: guix/scripts/system.scm:607 +#: guix/scripts/system.scm:724 msgid " init initialize a root file system to run GNU\n" msgstr " init initialiser et rootfilsystem til at køre GNU.\n" -#: guix/scripts/system.scm:609 +#: guix/scripts/system.scm:726 msgid " extension-graph emit the service extension graph in Dot format\n" -msgstr " extension-graph udsend tjenesteudvidelsesgrafen i Dot-format\n" +msgstr " extension-graph opret tjenesteudvidelsesgrafen i Dot-format\n" -#: guix/scripts/system.scm:611 +#: guix/scripts/system.scm:728 msgid " shepherd-graph emit the graph of shepherd services in Dot format\n" -msgstr " shepherd-graph udsend grafen for shepherd-tjenester i Dot-format\n" +msgstr " shepherd-graph opret grafen for shepherd-tjenester i Dot-format\n" -#: guix/scripts/system.scm:615 +#: guix/scripts/system.scm:732 msgid "" "\n" " -d, --derivation return the derivation of the given system" msgstr "" "\n" -" -d, --derivation returner de afledte stier for det givne system" +" -d, --derivation returner de derivate stier for det givne system" -#: guix/scripts/system.scm:617 +#: guix/scripts/system.scm:734 msgid "" "\n" " --on-error=STRATEGY\n" @@ -1362,7 +1562,7 @@ msgstr "" " --on-error=STRATEGI\n" " brug STRATEGI når den opstår en fejl under læsning af FIL" -#: guix/scripts/system.scm:620 +#: guix/scripts/system.scm:737 msgid "" "\n" " --image-size=SIZE for 'vm-image', produce an image of SIZE" @@ -1370,7 +1570,7 @@ msgstr "" "\n" " --image-size=STR for »vm-image«, lav et aftryk af STR" -#: guix/scripts/system.scm:622 +#: guix/scripts/system.scm:739 msgid "" "\n" " --no-grub for 'init', do not install GRUB" @@ -1378,7 +1578,7 @@ msgstr "" "\n" " --no-grub for »init«, installer ikke GRUB" -#: guix/scripts/system.scm:624 +#: guix/scripts/system.scm:741 msgid "" "\n" " --share=SPEC for 'vm', share host file system according to SPEC" @@ -1386,7 +1586,7 @@ msgstr "" "\n" " --share=SPEC for »vm«, del værtsfilsystem jævnfør SPEC" -#: guix/scripts/system.scm:626 +#: guix/scripts/system.scm:743 msgid "" "\n" " --expose=SPEC for 'vm', expose host file system according to SPEC" @@ -1394,7 +1594,7 @@ msgstr "" "\n" " --expose=SPEC for »vm«, fremvis værtsfilsystem jævnfør SPEC" -#: guix/scripts/system.scm:628 +#: guix/scripts/system.scm:745 msgid "" "\n" " --full-boot for 'vm', make a full boot sequence" @@ -1402,50 +1602,65 @@ msgstr "" "\n" " --full-boot for »vm«, lav en fuld opstartssekvens" -#: guix/scripts/system.scm:713 +#: guix/scripts/system.scm:830 #, scheme-format msgid "no configuration file specified~%" msgstr "ingen konfigurationsfil angivet~%" -#: guix/scripts/system.scm:776 +#: guix/scripts/system.scm:912 #, scheme-format msgid "~a: unknown action~%" msgstr "~a: ukendt handling~%" -#: guix/scripts/system.scm:791 +#: guix/scripts/system.scm:927 #, scheme-format msgid "wrong number of arguments for action '~a'~%" msgstr "forkert antal argumenter for handling »~a«~%" -#: guix/scripts/system.scm:796 +#: guix/scripts/system.scm:932 #, scheme-format msgid "guix system: missing command name~%" msgstr "guix system: mangler kommandonavn~%" -#: guix/scripts/system.scm:798 +#: guix/scripts/system.scm:934 #, scheme-format msgid "Try 'guix system --help' for more information.~%" msgstr "Prøv »guix system --help« for yderligere information.~%" -#: guix/scripts/lint.scm:127 +#: guix/scripts/lint.scm:133 #, scheme-format msgid "Available checkers:~%" msgstr "Tilgængelige kontrolprogrammer:~%" -#: guix/scripts/lint.scm:147 +#: guix/scripts/lint.scm:157 msgid "description should not be empty" msgstr "beskrivelse skal være udfyldt" -#: guix/scripts/lint.scm:157 +#: guix/scripts/lint.scm:167 msgid "Texinfo markup in description is invalid" msgstr "Texinfo-opmærkning i beskrivelse er ugyldig" -#: guix/scripts/lint.scm:165 +#: guix/scripts/lint.scm:177 +#, scheme-format +msgid "" +"description should not contain ~\n" +"trademark sign '~a' at ~d" +msgstr "" +"beskrivelse må ikke indeholde ~\n" +"varemærketegn »~a« på ~d" + +#. TRANSLATORS: '@code' is Texinfo markup and must be kept +#. as is. +#: guix/scripts/lint.scm:190 +msgid "use @code or similar ornament instead of quotes" +msgstr "brug @code eller lignende ornament i stedet for citationstegn" + +#: guix/scripts/lint.scm:197 msgid "description should start with an upper-case letter or digit" msgstr "beskrivelse skal starte med et stort bogstav eller et tal" # arg, hvad foregår der her -#: guix/scripts/lint.scm:181 +#: guix/scripts/lint.scm:213 #, scheme-format msgid "" "sentences in description should be followed ~\n" @@ -1454,185 +1669,227 @@ msgstr "" "sætninger i beskrivelsen skal efterfølges ~\n" "af to mellemrum; mulig infraction~p ved ~{~a~^, ~}" -#: guix/scripts/lint.scm:205 -msgid "pkg-config should probably be a native input" -msgstr "pkg-config skal sandsynligvis være standarddata" +#: guix/scripts/lint.scm:231 +#, scheme-format +msgid "invalid description: ~s" +msgstr "ugyldig beskrivelse: ~s" + +# native kan evt. være platformsspecifik +# Det er dog svært at gætte med sikkerhed hvad det betyder her +#: guix/scripts/lint.scm:256 +#, scheme-format +msgid "'~a' should probably be a native input" +msgstr "»~a« skal sandsynligvis være standarddata" + +#: guix/scripts/lint.scm:280 +#, scheme-format +msgid "'~a' should probably not be an input at all" +msgstr "»~a« skal sandsynligvis ikke være inddata" -#: guix/scripts/lint.scm:220 +#: guix/scripts/lint.scm:306 msgid "synopsis should not be empty" msgstr "synopsis skal være udfyldt" -#: guix/scripts/lint.scm:228 +#: guix/scripts/lint.scm:314 msgid "no period allowed at the end of the synopsis" msgstr "ingen periode er tilladt i slutningen af synopsen" -#: guix/scripts/lint.scm:240 +#: guix/scripts/lint.scm:326 msgid "no article allowed at the beginning of the synopsis" msgstr "ingen artikel er tilladt i begyndelsen af synopsen" -#: guix/scripts/lint.scm:247 +#: guix/scripts/lint.scm:333 msgid "synopsis should be less than 80 characters long" msgstr "synopsis skal være mindre end 80 tegn lang" -#: guix/scripts/lint.scm:253 +#: guix/scripts/lint.scm:339 msgid "synopsis should start with an upper-case letter or digit" msgstr "synopsis skal starte med et stort bogstav eller et tal" -#: guix/scripts/lint.scm:260 +#: guix/scripts/lint.scm:346 msgid "synopsis should not start with the package name" msgstr "synopsis skal ikke starte med pakkenavnet" -#: guix/scripts/lint.scm:354 guix/scripts/lint.scm:366 +#: guix/scripts/lint.scm:360 +#, scheme-format +msgid "invalid synopsis: ~s" +msgstr "ugyldig synopsis: ~s" + +#: guix/scripts/lint.scm:459 +#, scheme-format +msgid "URI ~a returned suspiciously small file (~a bytes)" +msgstr "URI'en ~a returnerede mistænkelig lille fil (~a byte)" + +#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480 #, scheme-format msgid "URI ~a not reachable: ~a (~s)" msgstr "URI ~a kan ikke nås: ~a (~s)" -#: guix/scripts/lint.scm:373 +#: guix/scripts/lint.scm:487 #, scheme-format msgid "URI ~a domain not found: ~a" msgstr "URI ~a domæne blev ikke fundet: ~a" -#: guix/scripts/lint.scm:381 +#: guix/scripts/lint.scm:495 #, scheme-format msgid "URI ~a unreachable: ~a" msgstr "URI ~a kan ikke nås: ~a" -#: guix/scripts/lint.scm:407 +#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761 +#, scheme-format +msgid "TLS certificate error: ~a" +msgstr "TLS-certifikatfejl: ~a" + +#: guix/scripts/lint.scm:525 msgid "invalid value for home page" msgstr "ugyldig værdi for hjemmeside" -#: guix/scripts/lint.scm:410 +#: guix/scripts/lint.scm:528 #, scheme-format msgid "invalid home page URL: ~s" msgstr "ugyldig hjemmesideadresse: ~s" -#: guix/scripts/lint.scm:430 +#: guix/scripts/lint.scm:548 msgid "file names of patches should start with the package name" msgstr "filnavn for rettelser skal starte med pakkenavnet" -#: guix/scripts/lint.scm:467 +#: guix/scripts/lint.scm:587 #, scheme-format msgid "~a: ~a: proposed synopsis: ~s~%" msgstr "~a: ~a: foreslået synopsis: ~s~%" -#: guix/scripts/lint.scm:479 +#: guix/scripts/lint.scm:600 #, scheme-format msgid "~a: ~a: proposed description:~% \"~a\"~%" msgstr "~a: ~a: foreslået beskrivelse:~% »~a«~%" -#: guix/scripts/lint.scm:516 +#: guix/scripts/lint.scm:642 msgid "all the source URIs are unreachable:" msgstr "alle kilde-URI'erne kan ikke nås:" -#: guix/scripts/lint.scm:539 +#: guix/scripts/lint.scm:665 msgid "the source file name should contain the package name" msgstr "kildefilnavnet skal indeholde pakkenavnet" -#: guix/scripts/lint.scm:548 guix/scripts/lint.scm:552 +#: guix/scripts/lint.scm:681 +#, scheme-format +msgid "URL should be 'mirror://~a/~a'" +msgstr "Adresse skal være »mirror://~a/~a«" + +#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703 #, scheme-format msgid "failed to create derivation: ~a" -msgstr "kunne ikke oprette afledning: ~a" +msgstr "kunne ikke oprette derivat: ~a" -#: guix/scripts/lint.scm:566 +#: guix/scripts/lint.scm:717 #, scheme-format msgid "failed to create derivation: ~s~%" -msgstr "kunne ikke oprette afledning: ~s~%" +msgstr "kunne ikke oprette derivat: ~s~%" -#: guix/scripts/lint.scm:576 +#: guix/scripts/lint.scm:727 msgid "invalid license field" msgstr "ugyldigt licensfelt" -#: guix/scripts/lint.scm:602 +#: guix/scripts/lint.scm:744 #, scheme-format msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%" msgstr "kunne ikke indhente CVE-sårbarheder fra ~s: ~a (~s)~%" -#: guix/scripts/lint.scm:607 guix/scripts/lint.scm:615 +#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758 +#: guix/scripts/lint.scm:763 #, scheme-format msgid "assuming no CVE vulnerabilities~%" msgstr "antager ingen CVE-sårbarheder~%" -#: guix/scripts/lint.scm:613 +#: guix/scripts/lint.scm:756 #, scheme-format msgid "failed to lookup NIST host: ~a~%" msgstr "kunne ikke slå NIST-vært op: ~a~%" -#: guix/scripts/lint.scm:644 +#: guix/scripts/lint.scm:801 #, scheme-format msgid "probably vulnerable to ~a" msgstr "sandsynligvis sårbar for ~a" -#: guix/scripts/lint.scm:659 +#: guix/scripts/lint.scm:816 #, scheme-format msgid "tabulation on line ~a, column ~a" msgstr "tabulering på linje ~a, kolonne ~a" -#: guix/scripts/lint.scm:668 +#: guix/scripts/lint.scm:825 #, scheme-format msgid "trailing white space on line ~a" msgstr "efterstillet mellemrum på linje ~a" -#: guix/scripts/lint.scm:678 +#: guix/scripts/lint.scm:835 #, scheme-format msgid "line ~a is way too long (~a characters)" msgstr "linjen ~a er alt for lang (~a tegn)" -#: guix/scripts/lint.scm:689 +#: guix/scripts/lint.scm:846 #, scheme-format msgid "line ~a: parentheses feel lonely, move to the previous or next line" msgstr "linjen ~a: parenteser er ensomme, flyt til den forrige eller næste linje" -#: guix/scripts/lint.scm:744 +#: guix/scripts/lint.scm:901 msgid "Validate package descriptions" msgstr "Valider pakkebeskrivelser" -#: guix/scripts/lint.scm:748 +#: guix/scripts/lint.scm:905 msgid "Validate synopsis & description of GNU packages" msgstr "Valider synopsis og beskrivelse for GNU-pakker" -#: guix/scripts/lint.scm:752 +#: guix/scripts/lint.scm:909 msgid "Identify inputs that should be native inputs" msgstr "Identificer inddata som skal være standarddata" -#: guix/scripts/lint.scm:756 +#: guix/scripts/lint.scm:913 +msgid "Identify inputs that should be inputs at all" +msgstr "Identificer inddata som skal være inddata" + +#: guix/scripts/lint.scm:917 msgid "Validate file names and availability of patches" msgstr "Valider filnavne og tilgængelighed for rettelser" -#: guix/scripts/lint.scm:760 +#: guix/scripts/lint.scm:921 msgid "Validate home-page URLs" msgstr "Valider hjemmesiders adresser" #. TRANSLATORS: <license> is the name of a data type and must not be #. translated. -#: guix/scripts/lint.scm:766 +#: guix/scripts/lint.scm:927 msgid "Make sure the 'license' field is a <license> or a list thereof" msgstr "Sikr at feltet »license« er en <license> eller en liste deraf" -#: guix/scripts/lint.scm:771 +#: guix/scripts/lint.scm:932 msgid "Validate source URLs" msgstr "Valider kildeadresser" -#: guix/scripts/lint.scm:775 +#: guix/scripts/lint.scm:936 +msgid "Suggest 'mirror://' URLs" +msgstr "Foreslå »mirror://«-adresser" + +#: guix/scripts/lint.scm:940 msgid "Validate file names of sources" msgstr "Valider filnavne for kilder" -#: guix/scripts/lint.scm:779 +#: guix/scripts/lint.scm:944 msgid "Report failure to compile a package to a derivation" -msgstr "Rapporter mislykket kompilering af en pakke til en afledning" +msgstr "Rapporter mislykket kompilering af en pakke til et derivat" -#: guix/scripts/lint.scm:783 +#: guix/scripts/lint.scm:948 msgid "Validate package synopses" msgstr "Valider pakkesynopser" -#: guix/scripts/lint.scm:787 +#: guix/scripts/lint.scm:952 msgid "Check the Common Vulnerabilities and Exposures (CVE) database" msgstr "Kontroller databasen Common Vulnerabilities and Exposures (CVE)" -#: guix/scripts/lint.scm:792 +#: guix/scripts/lint.scm:957 msgid "Look for formatting issues in the source" msgstr "Kig efter formateringsproblemstillinger i kilden" -#: guix/scripts/lint.scm:817 +#: guix/scripts/lint.scm:985 msgid "" "Usage: guix lint [OPTION]... [PACKAGE]...\n" "Run a set of checkers on the specified package; if none is specified,\n" @@ -1642,7 +1899,7 @@ msgstr "" "Kør et sæt af kontroller på den specificerede pakke; hvis ingen er specificeret,\n" "så kør kontrollerne på alle pakker.\n" -#: guix/scripts/lint.scm:820 +#: guix/scripts/lint.scm:988 msgid "" "\n" " -c, --checkers=CHECKER1,CHECKER2...\n" @@ -1652,7 +1909,7 @@ msgstr "" " -c, --checkers=KONTROL1,KONTROL2...\n" " kør kun de specificerede kontroller" -#: guix/scripts/lint.scm:825 +#: guix/scripts/lint.scm:993 msgid "" "\n" " -l, --list-checkers display the list of available lint checkers" @@ -1660,12 +1917,12 @@ msgstr "" "\n" " -l, --list-checkers vis listen med tilgængelige lint-kontroller" -#: guix/scripts/lint.scm:845 +#: guix/scripts/lint.scm:1013 #, scheme-format msgid "~a: invalid checker~%" msgstr "~a: ugyldig kontrol~%" -#: guix/scripts/publish.scm:52 +#: guix/scripts/publish.scm:58 #, scheme-format msgid "" "Usage: guix publish [OPTION]...\n" @@ -1674,7 +1931,7 @@ msgstr "" "Brug: guix publish [TILVALG] ...\n" "Udgiv ~a over HTTP.\n" -#: guix/scripts/publish.scm:54 +#: guix/scripts/publish.scm:60 msgid "" "\n" " -p, --port=PORT listen on PORT" @@ -1682,7 +1939,7 @@ msgstr "" "\n" " -p, --port=PORT lyt på PORT" -#: guix/scripts/publish.scm:56 +#: guix/scripts/publish.scm:62 msgid "" "\n" " --listen=HOST listen on the network interface for HOST" @@ -1690,7 +1947,7 @@ msgstr "" "\n" " --listen=VÆRT lyt på netværksgrænsefladen efter VÆRT" -#: guix/scripts/publish.scm:58 +#: guix/scripts/publish.scm:64 msgid "" "\n" " -u, --user=USER change privileges to USER as soon as possible" @@ -1698,7 +1955,25 @@ msgstr "" "\n" " -u, --user=BRUGER ændr privilegier for BRUGER så snart som muligt" -#: guix/scripts/publish.scm:60 +#: guix/scripts/publish.scm:66 +msgid "" +"\n" +" -C, --compression[=LEVEL]\n" +" compress archives at LEVEL" +msgstr "" +"\n" +" -C, --compression[=NIVEAU]\n" +" komprimer arkiver med NIVEAU" + +#: guix/scripts/publish.scm:69 +msgid "" +"\n" +" --ttl=TTL announce narinfos can be cached for TTL seconds" +msgstr "" +"\n" +" --ttl=TTL announce narinfos kan mellemlagres i TTL sekunder" + +#: guix/scripts/publish.scm:71 msgid "" "\n" " -r, --repl[=PORT] spawn REPL server on PORT" @@ -1706,27 +1981,37 @@ msgstr "" "\n" " -r, --repl[=PORT] udsend REPL-server on PORT" -#: guix/scripts/publish.scm:76 +#: guix/scripts/publish.scm:87 #, scheme-format msgid "lookup of host '~a' failed: ~a~%" msgstr "opslag efter værten »~a« mislykkedes: ~a~%" -#: guix/scripts/publish.scm:100 +#: guix/scripts/publish.scm:125 #, scheme-format msgid "lookup of host '~a' returned nothing" msgstr "opslag efter værten »~a« returnerede intet" -#: guix/scripts/publish.scm:342 +#: guix/scripts/publish.scm:138 +#, scheme-format +msgid "zlib support is missing; compression disabled~%" +msgstr "zlib-understøttelse mangler; komprimering deaktiveret~%" + +#: guix/scripts/publish.scm:145 +#, scheme-format +msgid "~a: invalid duration~%" +msgstr "~a: ugyldig varighed~%" + +#: guix/scripts/publish.scm:544 #, scheme-format msgid "user '~a' not found: ~a~%" msgstr "brugeren »~a« blev ikke fundet: ~a~%" -#: guix/scripts/publish.scm:377 +#: guix/scripts/publish.scm:581 #, scheme-format msgid "server running as root; consider using the '--user' option!~%" msgstr "server kører som root; overvej at bruge tilvalget »--user«!~%" -#: guix/scripts/publish.scm:379 +#: guix/scripts/publish.scm:583 #, scheme-format msgid "publishing ~a on ~a, port ~d~%" msgstr "udgiver ~a på ~a, port ~d~%" @@ -1744,41 +2029,46 @@ msgstr "" msgid "file '~a' not found in search path ~s~%" msgstr "filen »~a« blev ikke fundet i søgestien ~s~%" -#: guix/scripts/edit.scm:83 +#: guix/scripts/edit.scm:90 #, scheme-format msgid "source location of package '~a' is unknown~%" msgstr "kildeplacering for pakken »~a« er ukendt~%" -#: guix/scripts/edit.scm:96 +#: guix/scripts/edit.scm:103 #, scheme-format msgid "failed to launch '~a': ~a~%" msgstr "kunne ikke starte »~a«: ~a~%" -#: guix/scripts/size.scm:75 +#: guix/scripts/size.scm:77 #, scheme-format msgid "no available substitute information for '~a'~%" msgstr "ingen tilgængelig substitutinformation for »~a«~%" -#: guix/scripts/size.scm:83 +#: guix/scripts/size.scm:85 msgid "store item" msgstr "lagerpost" -#: guix/scripts/size.scm:83 +#: guix/scripts/size.scm:85 msgid "total" msgstr "i alt" -#: guix/scripts/size.scm:83 +#: guix/scripts/size.scm:85 msgid "self" msgstr "selv" +#: guix/scripts/size.scm:96 +#, scheme-format +msgid "total: ~,1f MiB~%" +msgstr "i alt: ~,1f MiB~%" + #. TRANSLATORS: This is the title of a graph, meaning that the graph #. represents a profile of the store (the "store" being the place where #. packages are stored.) -#: guix/scripts/size.scm:204 +#: guix/scripts/size.scm:209 msgid "store profile" msgstr "lagerprofil" -#: guix/scripts/size.scm:213 +#: guix/scripts/size.scm:218 msgid "" "Usage: guix size [OPTION]... PACKAGE\n" "Report the size of PACKAGE and its dependencies.\n" @@ -1786,7 +2076,7 @@ msgstr "" "Brug: guix size [TILVALG]... PAKKE\n" "Rapporter størrelsen for PAKKE og dens afhængigheder.\n" -#: guix/scripts/size.scm:218 +#: guix/scripts/size.scm:223 msgid "" "\n" " -s, --system=SYSTEM consider packages for SYSTEM--e.g., \"i686-linux\"" @@ -1794,7 +2084,7 @@ msgstr "" "\n" " -s, --system=SYSTEM overvej pakker for SYSTEM--f.eks., »i686-linux«" -#: guix/scripts/size.scm:220 +#: guix/scripts/size.scm:225 msgid "" "\n" " -m, --map-file=FILE write to FILE a graphical map of disk usage" @@ -1802,63 +2092,101 @@ msgstr "" "\n" " -m, --map-file=FIL skriv til FIL et grafisk kort over diskforbrug" -#: guix/scripts/size.scm:274 +#: guix/scripts/size.scm:279 msgid "missing store item argument\n" msgstr "manglende lagerpostargument\n" -#: guix/scripts/size.scm:292 -msgid "too many arguments\n" -msgstr "for mange argumenter\n" +#: guix/scripts/graph.scm:83 +#, scheme-format +msgid "~a: invalid argument (package name expected)" +msgstr "~a: ugyldigt argument (forventede et pakkenavn)" -#: guix/scripts/graph.scm:77 +#: guix/scripts/graph.scm:94 msgid "the DAG of packages, excluding implicit inputs" -msgstr "DAG'en for pakker, ekskluderende implicitte inddata" +msgstr "DAGen for pakker, eksklusive implicitte inddata" -#: guix/scripts/graph.scm:133 +#: guix/scripts/graph.scm:151 msgid "the DAG of packages, including implicit inputs" -msgstr "DAG'en for pakker, inkluderende implicitte inddata" +msgstr "DAGen for pakker, inklusive implicitte inddata" -#: guix/scripts/graph.scm:142 +#: guix/scripts/graph.scm:161 msgid "the DAG of packages and origins, including implicit inputs" -msgstr "DAG'en for pakker og oprindelser, inkluderende implicitte inddata" +msgstr "DAGen for pakker og oprindelser, inklusive implicitte inddata" -#: guix/scripts/graph.scm:172 +#: guix/scripts/graph.scm:192 msgid "same as 'bag', but without the bootstrap nodes" msgstr "samme som »bag«m uden bootstrap-knuder" -#: guix/scripts/graph.scm:217 +#: guix/scripts/graph.scm:238 msgid "the DAG of derivations" -msgstr "DAG'en for afledninger" +msgstr "DAGen for derivater" -#: guix/scripts/graph.scm:241 +#: guix/scripts/graph.scm:250 +msgid "unsupported argument for derivation graph" +msgstr "argument for derivatgraf er ikke understøttet" + +#: guix/scripts/graph.scm:276 +msgid "unsupported argument for this type of graph" +msgstr "ikke understøttet argument for denne graftype" + +#: guix/scripts/graph.scm:289 #, scheme-format msgid "references for '~a' are not known~%" msgstr "referencer for »~a« er ikke kendt~%" -#: guix/scripts/graph.scm:248 +#: guix/scripts/graph.scm:296 msgid "the DAG of run-time dependencies (store references)" -msgstr "DAG'en for kørselstidsafhængigheder (lagerreferencer)" +msgstr "DAGen for kørselstidsafhængigheder (lagerreferencer)" + +#: guix/scripts/graph.scm:312 +msgid "the DAG of referrers in the store" +msgstr "DAGen for referencer i lageret" -#: guix/scripts/graph.scm:278 +#: guix/scripts/graph.scm:338 #, scheme-format msgid "~a: unknown node type~%" msgstr "~a: ukendt knudetype~%" -#: guix/scripts/graph.scm:282 +#: guix/scripts/graph.scm:345 +#, scheme-format +msgid "~a: unknown backend~%" +msgstr "~a: ukendt motor~%" + +#: guix/scripts/graph.scm:349 msgid "The available node types are:\n" msgstr "De gyldige knudetyper er:\n" +#: guix/scripts/graph.scm:359 +msgid "The available backend types are:\n" +msgstr "De gyldige motortyper er:\n" + #. TRANSLATORS: Here 'dot' is the name of a program; it must not be #. translated. -#: guix/scripts/graph.scm:318 +#: guix/scripts/graph.scm:403 msgid "" "Usage: guix graph PACKAGE...\n" "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n" msgstr "" "Brug: guix graph PAKKE...\n" -"Udsend en Graphviz-repræsentation (dot) af afhængighederne for PAKKE...\n" +"Opret en Graphviz-repræsentation (dot) af afhængighederne for PAKKE...\n" -#: guix/scripts/graph.scm:320 +#: guix/scripts/graph.scm:405 +msgid "" +"\n" +" -b, --backend=TYPE produce a graph with the given backend TYPE" +msgstr "" +"\n" +" -b, --backend=TYPE fremstil en graf med den angivne motor-TYPE" + +#: guix/scripts/graph.scm:407 +msgid "" +"\n" +" --list-backends list the available graph backends" +msgstr "" +"\n" +" --list-backends vis de tilgængelige grafmotorer" + +#: guix/scripts/graph.scm:409 msgid "" "\n" " -t, --type=TYPE represent nodes of the given TYPE" @@ -1866,7 +2194,7 @@ msgstr "" "\n" " -t, --type=TYPE repræsenter knuder for den givne TYPE" -#: guix/scripts/graph.scm:322 +#: guix/scripts/graph.scm:411 msgid "" "\n" " --list-types list the available graph types" @@ -1874,7 +2202,7 @@ msgstr "" "\n" " --list-types vis de tilgængelige graftyper" -#: guix/scripts/graph.scm:324 +#: guix/scripts/graph.scm:413 msgid "" "\n" " -e, --expression=EXPR consider the package EXPR evaluates to" @@ -1882,42 +2210,42 @@ msgstr "" "\n" " -e, --expression=UDTRYK overvej pakken UDTRYK evaluerer til" -#: guix/scripts/challenge.scm:104 +#: guix/scripts/challenge.scm:105 #, scheme-format msgid "~a: no substitute at '~a'~%" msgstr "~a: ingen substitut på »~a«~%" -#: guix/scripts/challenge.scm:120 +#: guix/scripts/challenge.scm:121 #, scheme-format msgid "no substitutes for '~a'~%" msgstr "ingen substitutter for »~a«~%" -#: guix/scripts/challenge.scm:137 guix/scripts/challenge.scm:157 +#: guix/scripts/challenge.scm:138 guix/scripts/challenge.scm:158 #, scheme-format msgid "no local build for '~a'~%" -msgstr "ingen lokal bygning for »~a«~%" +msgstr "ingen lokal kompilering for »~a«~%" -#: guix/scripts/challenge.scm:154 +#: guix/scripts/challenge.scm:155 #, scheme-format msgid "~a contents differ:~%" msgstr "~a indhold er forskelligt:~%" -#: guix/scripts/challenge.scm:156 +#: guix/scripts/challenge.scm:157 #, scheme-format msgid " local hash: ~a~%" msgstr " lokal hash: ~a~%" -#: guix/scripts/challenge.scm:161 +#: guix/scripts/challenge.scm:162 #, scheme-format msgid " ~50a: ~a~%" msgstr " ~50a: ~a~%" -#: guix/scripts/challenge.scm:165 +#: guix/scripts/challenge.scm:166 #, scheme-format msgid " ~50a: unavailable~%" msgstr " ~50a: utilgængelig~%" -#: guix/scripts/challenge.scm:175 +#: guix/scripts/challenge.scm:176 msgid "" "Usage: guix challenge [PACKAGE...]\n" "Challenge the substitutes for PACKAGE... provided by one or more servers.\n" @@ -1925,7 +2253,7 @@ msgstr "" "Brug: guix challenge [PAKKE...]\n" "Ændr substitutterne for PAKKE... tilbudt af en eller flere servere.\n" -#: guix/scripts/challenge.scm:177 +#: guix/scripts/challenge.scm:178 msgid "" "\n" " --substitute-urls=URLS\n" @@ -1933,19 +2261,27 @@ msgid "" msgstr "" "\n" " --substitute-urls=ADRESSER\n" -" sammenlign byggeresultater med dem på ADRESSER" +" sammenlign kompileringsresultater med dem på ADRESSER" -#: guix/gnu-maintenance.scm:542 +#: guix/gnu-maintenance.scm:555 msgid "Updater for GNU packages" msgstr "Opdater for GNU-pakker" -#: guix/gnu-maintenance.scm:549 +#: guix/gnu-maintenance.scm:562 msgid "Updater for GNOME packages" -msgstr "Opdater for GNOME-pakker" +msgstr "Opdateringsprogram for GNOME-pakker" + +#: guix/gnu-maintenance.scm:569 +msgid "Updater for KDE packages" +msgstr "Opdateringsprogram for KDE-pakker" -#: guix/gnu-maintenance.scm:556 +#: guix/gnu-maintenance.scm:576 msgid "Updater for X.org packages" -msgstr "Opdater for X.org-pakker" +msgstr "Opdateringsprogram for X.org-pakker" + +#: guix/gnu-maintenance.scm:583 +msgid "Updater for packages hosted on kernel.org" +msgstr "Opdateringsprogram for pakker fra kernel.org" #: guix/scripts/container.scm:25 msgid "" @@ -1953,7 +2289,7 @@ msgid "" "Build and manipulate Linux containers.\n" msgstr "" "Brug: guix container HANDLING ARG ...\n" -"Byg og manipuler Linuxcontainere.\n" +"Kompiler og manipuler Linuxcontainere.\n" #: guix/scripts/container.scm:30 msgid " exec execute a command inside of an existing container\n" @@ -1975,7 +2311,7 @@ msgid "" "Execute COMMMAND within the container process PID.\n" msgstr "" "Brug: guix container exec PID KOMMANDO [ARG ...]\n" -"Kør KOMMANDO inden i containerproces-PID'en.\n" +"Kør KOMMANDO inden i containerprocessen PID.\n" #: guix/scripts/container/exec.scm:69 #, scheme-format @@ -2002,70 +2338,70 @@ msgstr "ingen sådan proces ~d~%" msgid "exec failed with status ~d~%" msgstr "exec mislykkedes med status ~d~%" -#: guix/upstream.scm:158 +#: guix/upstream.scm:212 #, scheme-format msgid "signature verification failed for `~a'~%" msgstr "signaturverifikation mislykkedes for »~a«~%" -#: guix/upstream.scm:160 +#: guix/upstream.scm:214 #, scheme-format msgid "(could be because the public key is not in your keyring)~%" msgstr "(kunne være fordi den offentlige nøgle ikke er i din nøglering)~%" -#: guix/upstream.scm:192 +#: guix/upstream.scm:246 msgid "gz" msgstr "gz" -#: guix/upstream.scm:255 +#: guix/upstream.scm:293 #, scheme-format msgid "~a: could not locate source file" msgstr "~a: kunne ikke lokalisere kildefil" -#: guix/upstream.scm:260 +#: guix/upstream.scm:298 #, scheme-format msgid "~a: ~a: no `version' field in source; skipping~%" msgstr "~a: ~a: intet »versionsfelt« i kilde; udelader~%" -#: guix/ui.scm:236 +#: guix/ui.scm:239 msgid "entering debugger; type ',bt' for a backtrace\n" msgstr "går i fejlsøger; tast »,bt« for en tilbagesporing\n" -#: guix/ui.scm:252 guix/ui.scm:269 +#: guix/ui.scm:255 guix/ui.scm:272 #, scheme-format msgid "failed to load '~a': ~a~%" msgstr "kunne ikke indlæse »~a«: ~a~%" -#: guix/ui.scm:255 +#: guix/ui.scm:258 #, scheme-format msgid "~a: error: ~a~%" msgstr "~a: fejl: ~a~%" -#: guix/ui.scm:258 guix/ui.scm:512 +#: guix/ui.scm:261 guix/ui.scm:530 #, scheme-format msgid "exception thrown: ~s~%" msgstr "undtagelse smidt: ~s~%" -#: guix/ui.scm:260 guix/ui.scm:278 +#: guix/ui.scm:263 guix/ui.scm:281 #, scheme-format msgid "failed to load '~a':~%" msgstr "kunne ikke indlæse »~a«:~%" -#: guix/ui.scm:272 +#: guix/ui.scm:275 #, scheme-format msgid "~a: warning: ~a~%" msgstr "~a: advarsel: ~a~%" -#: guix/ui.scm:275 +#: guix/ui.scm:278 #, scheme-format msgid "failed to load '~a': exception thrown: ~s~%" msgstr "kunne ikke indlæse »~a«: undtagelse smidt: ~s~%" -#: guix/ui.scm:287 +#: guix/ui.scm:290 #, scheme-format msgid "failed to install locale: ~a~%" msgstr "kunne ikke installere sprog: ~a~%" -#: guix/ui.scm:306 +#: guix/ui.scm:309 msgid "" "Copyright (C) 2016 the Guix authors\n" "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n" @@ -2077,7 +2413,11 @@ msgstr "" "Dette er et frit program; du kan frit ændre og videredistribuere programmet.\n" "Der er INGEN GARANTI, inden for lovens rammer.\n" -#: guix/ui.scm:314 +#. TRANSLATORS: The placeholder indicates the bug-reporting address for this +#. package. Please add another line saying "Report translation bugs to +#. ...\n" with the address for translation bugs (typically your translation +#. team's web or email address). +#: guix/ui.scm:321 #, scheme-format msgid "" "\n" @@ -2086,7 +2426,7 @@ msgstr "" "\n" "Rapporter fejl til: ~a." -#: guix/ui.scm:316 +#: guix/ui.scm:323 #, scheme-format msgid "" "\n" @@ -2095,7 +2435,7 @@ msgstr "" "\n" "~a hjemmeside: <~a>" -#: guix/ui.scm:318 +#: guix/ui.scm:325 msgid "" "\n" "General help using GNU software: <http://www.gnu.org/gethelp/>" @@ -2103,219 +2443,227 @@ msgstr "" "\n" "Generel hjælp til brugen af GNU-programmer: <http://www.gnu.org/gethelp/>" -#: guix/ui.scm:363 +#: guix/ui.scm:370 #, scheme-format msgid "'~a' is not a valid regular expression: ~a~%" msgstr "»~a« er ikke et gyldigt regulært udtryk: ~a~%" -#: guix/ui.scm:369 +#: guix/ui.scm:376 #, scheme-format msgid "~a: invalid number~%" msgstr "~a: ugyldigt nummer~%" -#: guix/ui.scm:386 +#: guix/ui.scm:393 #, scheme-format msgid "invalid number: ~a~%" msgstr "ugyldigt nummer: ~a~%" -#: guix/ui.scm:409 +#: guix/ui.scm:416 #, scheme-format msgid "unknown unit: ~a~%" msgstr "ukendt enhed: ~a~%" -#: guix/ui.scm:420 +#: guix/ui.scm:433 #, scheme-format msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%" msgstr "~a:~a:~a: pakken »~a« har ugyldige inddata: ~s~%" -#: guix/ui.scm:427 +#: guix/ui.scm:440 #, scheme-format msgid "~a: ~a: build system `~a' does not support cross builds~%" -msgstr "~a: ~a: byggesystem »~a« understøtter ikke krydsbygninger~%" +msgstr "~a: ~a: kompileringssystem »~a« understøtter ikke krydskompileringer~%" -#: guix/ui.scm:432 +#: guix/ui.scm:445 #, scheme-format msgid "profile '~a' does not exist~%" msgstr "profilen »~a« findes ikke~%" -#: guix/ui.scm:435 +#: guix/ui.scm:448 #, scheme-format msgid "generation ~a of profile '~a' does not exist~%" msgstr "oprettelse ~a af profilen »~a« findes ikke~%" -#: guix/ui.scm:442 +#: guix/ui.scm:455 #, scheme-format msgid "corrupt input while restoring '~a' from ~s~%" msgstr "ødelagte inddata under gendannelse af »~a« fra ~s~%" -#: guix/ui.scm:444 +#: guix/ui.scm:457 #, scheme-format msgid "corrupt input while restoring archive from ~s~%" msgstr "ødelagte inddata under gendannelse af arkiv fra ~s~%" -#: guix/ui.scm:447 +#: guix/ui.scm:460 #, scheme-format msgid "failed to connect to `~a': ~a~%" msgstr "kunne ikke forbinde til »~a«: ~a~%" -#: guix/ui.scm:452 +#: guix/ui.scm:465 #, scheme-format msgid "build failed: ~a~%" -msgstr "bygning mislykkedes: ~a~%" +msgstr "kompilering mislykkedes: ~a~%" -#: guix/ui.scm:455 +#: guix/ui.scm:468 #, scheme-format msgid "reference to invalid output '~a' of derivation '~a'~%" -msgstr "reference til ugyldige uddata »~a« for afledning »~a«~%" +msgstr "reference til ugyldige uddata »~a« for derivat »~a«~%" + +#: guix/ui.scm:472 +#, scheme-format +msgid "file '~a' could not be found in these directories:~{ ~a~}~%" +msgstr "filen »~a« blev ikke fundet i disse mapper:~{ ~a~}~%" -#: guix/ui.scm:466 +#: guix/ui.scm:484 #, scheme-format msgid "~a: ~a~%" msgstr "~a: ~a~%" -#: guix/ui.scm:501 +#: guix/ui.scm:519 #, scheme-format msgid "failed to read expression ~s: ~s~%" msgstr "kunne ikke læse udtryk ~s: ~s~%" -#: guix/ui.scm:507 +#: guix/ui.scm:525 #, scheme-format msgid "failed to evaluate expression '~a':~%" msgstr "kunne ikke evaluere udtryk »~a«:~%" -#: guix/ui.scm:510 +#: guix/ui.scm:528 #, scheme-format msgid "syntax error: ~a~%" msgstr "syntaksfejl: ~a~%" -#: guix/ui.scm:524 +#: guix/ui.scm:542 #, scheme-format msgid "expression ~s does not evaluate to a package~%" msgstr "udtryk ~s evaluerer ikke til en pakke~%" -#: guix/ui.scm:586 +#: guix/ui.scm:604 #, scheme-format msgid "~:[The following derivation would be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations would be built:~%~{ ~a~%~}~;~]" -msgstr[0] "~:[Den følgende afledning ville blive bygget:~%~{ ~a~%~}~;~]" -msgstr[1] "~:[De følgende afledninger ville blive bygget:~%~{ ~a~%~}~;~]" +msgstr[0] "~:[Det følgende derivat ville blive kompileret:~%~{ ~a~%~}~;~]" +msgstr[1] "~:[De følgende derivater ville blive kompileret:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:591 +#: guix/ui.scm:609 #, scheme-format msgid "~:[The following file would be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files would be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[Den følgende fil ville blive hentet:~%~{ ~a~%~}~;~]" msgstr[1] "~:[De følgende filer ville blive hentet:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:597 +#: guix/ui.scm:615 #, scheme-format msgid "~:[The following derivation will be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations will be built:~%~{ ~a~%~}~;~]" -msgstr[0] "~:[Den følgende afledning vil blive bygget:~%~{ ~a~%~}~;~]" -msgstr[1] "~:[De følgende afledninger vil blive bygget:~%~{ ~a~%~}~;~]" +msgstr[0] "~:[Det følgende derivat vil blive kompileret:~%~{ ~a~%~}~;~]" +msgstr[1] "~:[De følgende derivater vil blive kompileret:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:602 +#: guix/ui.scm:620 #, scheme-format msgid "~:[The following file will be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files will be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[Den følgende fil vil blive hentet:~%~{ ~a~%~}~;~]" msgstr[1] "~:[De følgende filer vil blive hentet:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:657 +#: guix/ui.scm:675 #, scheme-format msgid "The following package would be removed:~%~{~a~%~}~%" msgid_plural "The following packages would be removed:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke ville blive fjernet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker ville blive fjernet:~%~{~a~%~}~%" -#: guix/ui.scm:662 +#: guix/ui.scm:680 #, scheme-format msgid "The following package will be removed:~%~{~a~%~}~%" msgid_plural "The following packages will be removed:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke vil blive fjernet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker vil blive fjernet:~%~{~a~%~}~%" -#: guix/ui.scm:675 +#: guix/ui.scm:693 #, scheme-format msgid "The following package would be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke ville blive nedgraderet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker ville blive nedgraderet:~%~{~a~%~}~%" -#: guix/ui.scm:680 +#: guix/ui.scm:698 #, scheme-format msgid "The following package will be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke vil blive nedgraderet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker vil blive nedgraderet:~%~{~a~%~}~%" -#: guix/ui.scm:693 +#: guix/ui.scm:711 #, scheme-format msgid "The following package would be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke ville blive opgraderet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker ville blive opgraderet:~%~{~a~%~}~%" -#: guix/ui.scm:698 +#: guix/ui.scm:716 #, scheme-format msgid "The following package will be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke vil blive opgraderet:~%~{~a~%~}~%" msgstr[1] "De følgende pakker vil blive opgraderet:~%~{~a~%~}~%" -#: guix/ui.scm:709 +#: guix/ui.scm:727 #, scheme-format msgid "The following package would be installed:~%~{~a~%~}~%" msgid_plural "The following packages would be installed:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke ville blive installeret:~%~{~a~%~}~%" msgstr[1] "De følgende pakker ville blive installeret:~%~{~a~%~}~%" -#: guix/ui.scm:714 +#: guix/ui.scm:732 #, scheme-format msgid "The following package will be installed:~%~{~a~%~}~%" msgid_plural "The following packages will be installed:~%~{~a~%~}~%" msgstr[0] "Den følgende pakke vil blive installeret:~%~{~a~%~}~%" msgstr[1] "De følgende pakker vil blive installeret:~%~{~a~%~}~%" -#: guix/ui.scm:731 +#: guix/ui.scm:749 msgid "<unknown location>" msgstr "<ukendt sted>" -#: guix/ui.scm:750 +#: guix/ui.scm:768 #, scheme-format msgid "failed to create configuration directory `~a': ~a~%" msgstr "kunne ikke oprette konfiguratinsmappe »~a«: ~a~%" -#: guix/ui.scm:869 guix/ui.scm:883 +#: guix/ui.scm:891 guix/ui.scm:905 msgid "unknown" msgstr "ukendt" -#: guix/ui.scm:1033 +#: guix/ui.scm:1063 #, scheme-format msgid "Generation ~a\t~a" msgstr "Generation ~a\t~a" -#: guix/ui.scm:1040 +#. TRANSLATORS: The word "current" here is an adjective for +#. "Generation", as in "current generation". Use the appropriate +#. gender where applicable. +#: guix/ui.scm:1073 #, scheme-format msgid "~a\t(current)~%" msgstr "~a\t(nuværende)~%" -#: guix/ui.scm:1057 +#: guix/ui.scm:1116 #, scheme-format msgid "switched from generation ~a to ~a~%" msgstr "skiftede fra generation ~a til ~a~%" -#: guix/ui.scm:1073 +#: guix/ui.scm:1132 #, scheme-format msgid "deleting ~a~%" msgstr "sletter ~a~%" -#: guix/ui.scm:1121 +#: guix/ui.scm:1163 #, scheme-format msgid "Try `guix --help' for more information.~%" msgstr "Prøv »guix --help« for yderligere information.~%" -#: guix/ui.scm:1148 +#: guix/ui.scm:1191 msgid "" "Usage: guix COMMAND ARGS...\n" "Run COMMAND with ARGS.\n" @@ -2323,31 +2671,31 @@ msgstr "" "Brug: guix KOMMANDO ARG...\n" "Kør KOMMANDO med ARG.\n" -#: guix/ui.scm:1151 +#: guix/ui.scm:1194 msgid "COMMAND must be one of the sub-commands listed below:\n" msgstr "KOMMANDO skal være en af underkommandoerne vist nedenfor:\n" -#: guix/ui.scm:1171 +#: guix/ui.scm:1214 #, scheme-format msgid "guix: ~a: command not found~%" msgstr "guix: ~a: kommando blev ikke fundet~%" -#: guix/ui.scm:1188 +#: guix/ui.scm:1233 #, scheme-format msgid "guix: missing command name~%" msgstr "guix: mangler kommandonavn~%" -#: guix/ui.scm:1196 +#: guix/ui.scm:1241 #, scheme-format msgid "guix: unrecognized option '~a'~%" msgstr "guix: ikke genkendt tilvalg »~a«~%" -#: guix/http-client.scm:261 +#: guix/http-client.scm:270 #, scheme-format msgid "following redirection to `~a'...~%" msgstr "følger omdirigering til »~a«...~%" -#: guix/http-client.scm:270 +#: guix/http-client.scm:279 msgid "download failed" msgstr "overførsel mislykkedes" @@ -2395,11 +2743,11 @@ msgstr "ugyldig arkivmærke for mellemfil" #: nix/nix-daemon/guix-daemon.cc:61 msgid "guix-daemon -- perform derivation builds and store accesses" -msgstr "guix-daemon - udfør afledningsbygninger og lageradgange" +msgstr "guix-daemon – udfør derivatkompileringer og lageradgange" #: nix/nix-daemon/guix-daemon.cc:63 msgid "This program is a daemon meant to run in the background. It serves requests sent over a Unix-domain socket. It accesses the store, and builds derivations on behalf of its clients." -msgstr "Dette program er en ædmon lavet til at køre i baggrunden. Den betjener forespørgsler sendt over en Unix-domænesokkel. Den tilgår lageret, og bgyger afledninger på vegne af dens klienter." +msgstr "Dette program er en ædmon lavet til at køre i baggrunden. Den betjener forespørgsler sendt over en Unix-domænesokkel. Den tilgår lageret, og bygger derivater på vegne af dens klienter." #: nix/nix-daemon/guix-daemon.cc:87 msgid "SYSTEM" @@ -2415,15 +2763,15 @@ msgstr "N" #: nix/nix-daemon/guix-daemon.cc:90 msgid "use N CPU cores to build each derivation; 0 means as many as available" -msgstr "brug N CPU-kerner til at bygge hver afledning; 0 betyder så mange som er tilgængelige" +msgstr "brug N cpu-kerner til at kompilere hvert derivat; 0 betyder så mange som er tilgængelige" #: nix/nix-daemon/guix-daemon.cc:93 msgid "allow at most N build jobs" -msgstr "tillad højest N-byggejob" +msgstr "tillad højst N kompileringsjob" #: nix/nix-daemon/guix-daemon.cc:95 msgid "disable chroot builds" -msgstr "deaktiver chroot-bygninger" +msgstr "deaktiver chroot-kompileringer" #: nix/nix-daemon/guix-daemon.cc:96 msgid "DIR" @@ -2431,7 +2779,7 @@ msgstr "MAPPE" #: nix/nix-daemon/guix-daemon.cc:97 msgid "add DIR to the build chroot" -msgstr "tilføj MAPPE til byggechrooten" +msgstr "tilføj MAPPE til kompileringschrooten" #: nix/nix-daemon/guix-daemon.cc:98 msgid "GROUP" @@ -2439,7 +2787,7 @@ msgstr "GRUPPE" #: nix/nix-daemon/guix-daemon.cc:99 msgid "perform builds as a user of GROUP" -msgstr "udfør bygninger som en bruger i GRUPPE" +msgstr "udfør kompileringer som en bruger i GRUPPE" #: nix/nix-daemon/guix-daemon.cc:101 msgid "do not use substitutes" @@ -2459,19 +2807,19 @@ msgstr "brug ikke »build hook«" #: nix/nix-daemon/guix-daemon.cc:107 msgid "cache build failures" -msgstr "mellemlagerbyggefejl" +msgstr "kompileringsfejl i mellemlageret" #: nix/nix-daemon/guix-daemon.cc:109 msgid "build each derivation N times in a row" -msgstr "byg hver derivation N gange i en række" +msgstr "kompiler hvert derivat N gange i træk" #: nix/nix-daemon/guix-daemon.cc:111 msgid "do not keep build logs" -msgstr "bevar ikke byggelogge" +msgstr "bevar ikke kompileringslogge" #: nix/nix-daemon/guix-daemon.cc:113 msgid "disable compression of the build logs" -msgstr "deaktiver komprimering af byggelogge" +msgstr "deaktiver komprimering af kompileringslogge" #: nix/nix-daemon/guix-daemon.cc:118 msgid "disable automatic file \"deduplication\" in the store" @@ -2483,11 +2831,11 @@ msgstr "udgiv Linux 2.6" #: nix/nix-daemon/guix-daemon.cc:132 msgid "tell whether the GC must keep outputs of live derivations" -msgstr "fortæl om GC'en skal bevare uddata for live afledninger" +msgstr "fortæl om GC'en skal bevare uddata for live derivater" #: nix/nix-daemon/guix-daemon.cc:135 msgid "tell whether the GC must keep derivations corresponding to live outputs" -msgstr "fortæl om GC'en skal bevare afledninger svarende til live uddata" +msgstr "fortæl om GC'en skal bevare derivater svarende til live uddata" #: nix/nix-daemon/guix-daemon.cc:138 msgid "SOCKET" diff --git a/po/guix/fr.po b/po/guix/fr.po index f641339e05..990b83926f 100644 --- a/po/guix/fr.po +++ b/po/guix/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: guix 0.11.0\n" +"Project-Id-Version: guix 0.12.0\n" "Report-Msgid-Bugs-To: ludo@gnu.org\n" -"POT-Creation-Date: 2016-07-29 10:16+0200\n" -"PO-Revision-Date: 2016-11-11 10:43+0100\n" +"POT-Creation-Date: 2016-12-18 15:32+0100\n" +"PO-Revision-Date: 2016-12-19 07:40+0100\n" "Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n" "Language-Team: French <traduc@traduc.org>\n" "Language: fr\n" @@ -53,85 +53,95 @@ msgstr "choix de ~a parmi ~a~%" msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%" msgstr "syntaxe NOM-VERSION dépréciée. Utilisez plutôt NOM@VERSION~%" -#: gnu/packages.scm:311 +#: gnu/packages.scm:311 guix/scripts/package.scm:272 +#, scheme-format +msgid "package '~a' has been superseded by '~a'~%" +msgstr "le paquet « ~a » a été remplacé par « ~a »~%" + +#: gnu/packages.scm:318 #, scheme-format msgid "~A: package not found for version ~a~%" msgstr "~A: paquet introuvable pour la version ~a~%" -#: gnu/packages.scm:321 +#: gnu/packages.scm:328 #, scheme-format msgid "~A: unknown package~%" msgstr "~A: paquet inconnu~%" -#: gnu/packages.scm:349 +#: gnu/packages.scm:356 #, scheme-format msgid "package `~a' lacks output `~a'~%" msgstr "le paquet « ~a » requiert la sortie « ~a »~%" -#: gnu/services.scm:540 +#: gnu/services.scm:542 #, scheme-format msgid "no target of type '~a' for service ~s" msgstr "pas de cible de type « ~a » pour le service ~s" -#: gnu/services.scm:551 gnu/services.scm:612 +#: gnu/services.scm:553 gnu/services.scm:614 #, scheme-format msgid "more than one target service of type '~a'" msgstr "plus d'un service cible de type « ~a »" -#: gnu/services.scm:602 +#: gnu/services.scm:604 #, scheme-format msgid "service of type '~a' not found" msgstr "service de type « ~a » pas trouvé" -#: gnu/system.scm:500 +#: gnu/system.scm:522 #, scheme-format msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%" msgstr "l'utilisation d'une chaîne pour le fichier « ~a » est dépréciée. Utilisez plutôt « plain-file »~%" -#: gnu/system.scm:516 +#: gnu/system.scm:538 #, scheme-format msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%" msgstr "l'utilisation d'une valeur monadic pour « ~a » est dépréciée. Utilisez plutôt « plain-file »~%" -#: gnu/system.scm:650 +#: gnu/system.scm:680 #, scheme-format msgid "~a: invalid locale name" msgstr "~a: nom d'environnement linguistique non valide" -#: gnu/system.scm:770 +#: gnu/system.scm:860 +msgid "/" +msgstr "/" + +#: gnu/system.scm:862 #, scheme-format msgid "unrecognized boot parameters for '~a'~%" msgstr "paramètres de démarrage non reconnus pour « ~a »~%" -#: gnu/services/shepherd.scm:162 +#: gnu/services/shepherd.scm:165 #, scheme-format msgid "service '~a' provided more than once" msgstr "service « ~a » fourni plus d'une fois" -#: gnu/services/shepherd.scm:177 +#: gnu/services/shepherd.scm:180 #, scheme-format msgid "service '~a' requires '~a', which is not provided by any service" msgstr "le service « ~a » requiert « ~a » qui n'est fourni pas aucun service" -#: gnu/system/shadow.scm:240 +#: gnu/system/shadow.scm:220 #, scheme-format msgid "supplementary group '~a' of user '~a' is undeclared" msgstr "le groupe supplémentaire « ~a » de l'utilisateur « ~a » n'est pas déclaré" -#: gnu/system/shadow.scm:250 +#: gnu/system/shadow.scm:230 #, scheme-format msgid "primary group '~a' of user '~a' is undeclared" msgstr "le groupe primaire « ~a » de l'utilisateur « ~a » n'est pas déclaré" -#: guix/scripts.scm:52 +#: guix/scripts.scm:53 #, scheme-format msgid "invalid argument: ~a~%" msgstr "argument non valide: ~a~%" -#: guix/scripts.scm:78 guix/scripts/download.scm:99 guix/scripts/gc.scm:164 -#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77 -#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:916 -#: guix/scripts/publish.scm:549 guix/scripts/graph.scm:383 +#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164 +#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77 +#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042 +#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81 +#: guix/scripts/graph.scm:436 #, scheme-format msgid "~A: unrecognized option~%" msgstr "~A: option non reconnue~%" @@ -141,12 +151,12 @@ msgstr "~A: option non reconnue~%" msgid "failed to create GC root `~a': ~a~%" msgstr "impossible de créer la racine du GC « ~a »: ~a~%" -#: guix/scripts/build.scm:198 +#: guix/scripts/build.scm:196 #, scheme-format msgid "invalid replacement specification: ~s~%" msgstr "spécification de remplacement invalide: ~s~%" -#: guix/scripts/build.scm:246 +#: guix/scripts/build.scm:253 msgid "" "\n" " --with-source=SOURCE\n" @@ -156,7 +166,7 @@ msgstr "" " --with-source=SOURCE\n" " utiliser la SOURCE donnée pour compiler le paquet correspondant" -#: guix/scripts/build.scm:249 +#: guix/scripts/build.scm:256 msgid "" "\n" " --with-input=PACKAGE=REPLACEMENT\n" @@ -166,12 +176,22 @@ msgstr "" " --with-input=PAQUET=REMPLACEMENT\n" " remplacer le paquet de dépendance PAQUET par REMPLACEMENT" -#: guix/scripts/build.scm:274 +#: guix/scripts/build.scm:259 +msgid "" +"\n" +" --with-graft=PACKAGE=REPLACEMENT\n" +" graft REPLACEMENT on packages that refer to PACKAGE" +msgstr "" +"\n" +" --with-graft=PAQUET=REMPLACEMENT\n" +" greffer le paquet REMPLACEMENT sur les paquets qui font référence à PAQUET" + +#: guix/scripts/build.scm:284 #, scheme-format msgid "transformation '~a' had no effect on ~a~%" msgstr "la transformation « ~a » n'a pas d'effet sur ~a~%" -#: guix/scripts/build.scm:292 +#: guix/scripts/build.scm:302 msgid "" "\n" " -L, --load-path=DIR prepend DIR to the package module search path" @@ -179,7 +199,7 @@ msgstr "" "\n" " -L, --load-path=REP préfixer le chemin de recherche par REP " -#: guix/scripts/build.scm:294 +#: guix/scripts/build.scm:304 msgid "" "\n" " -K, --keep-failed keep build tree of failed builds" @@ -187,7 +207,7 @@ msgstr "" "\n" " -K, --keep-failed garder l'arbre de compilation pour les compilations ayant échoué" -#: guix/scripts/build.scm:296 +#: guix/scripts/build.scm:306 msgid "" "\n" " -k, --keep-going keep going when some of the derivations fail" @@ -195,7 +215,7 @@ msgstr "" "\n" " -k, --keep-going continuer si certaines dérivations échouent" -#: guix/scripts/build.scm:298 +#: guix/scripts/build.scm:308 msgid "" "\n" " -n, --dry-run do not build the derivations" @@ -203,7 +223,7 @@ msgstr "" "\n" " -n, --dry-run ne pas compiler les dérivations" -#: guix/scripts/build.scm:300 +#: guix/scripts/build.scm:310 msgid "" "\n" " --fallback fall back to building when the substituter fails" @@ -211,7 +231,7 @@ msgstr "" "\n" " --fallback revenir à la compilation quand le substitut échoue" -#: guix/scripts/build.scm:302 +#: guix/scripts/build.scm:312 msgid "" "\n" " --no-substitutes build instead of resorting to pre-built substitutes" @@ -219,7 +239,7 @@ msgstr "" "\n" " --no-substitutes compiler plutôt que recourir à des substituts pré-compilés" -#: guix/scripts/build.scm:304 guix/scripts/size.scm:217 +#: guix/scripts/build.scm:314 guix/scripts/size.scm:220 msgid "" "\n" " --substitute-urls=URLS\n" @@ -229,7 +249,7 @@ msgstr "" " --substitute-urls=URLS\n" " récupérer les substituts depuis les URLS si elles sont autorisées" -#: guix/scripts/build.scm:307 +#: guix/scripts/build.scm:317 msgid "" "\n" " --no-grafts do not graft packages" @@ -237,7 +257,7 @@ msgstr "" "\n" " --no-grafts ne pas greffer les paquets" -#: guix/scripts/build.scm:309 +#: guix/scripts/build.scm:319 msgid "" "\n" " --no-build-hook do not attempt to offload builds via the build hook" @@ -245,7 +265,7 @@ msgstr "" "\n" " --no-build-hook ne pas essayer de décharger les compilations via le hook de compilation" -#: guix/scripts/build.scm:311 +#: guix/scripts/build.scm:321 msgid "" "\n" " --max-silent-time=SECONDS\n" @@ -255,7 +275,7 @@ msgstr "" " --max-silent-time=N\n" " marquer la compilation comme ayant échouée après N secondes de silence" -#: guix/scripts/build.scm:314 +#: guix/scripts/build.scm:324 msgid "" "\n" " --timeout=SECONDS mark the build as failed after SECONDS of activity" @@ -263,7 +283,7 @@ msgstr "" "\n" " --timeout=N marquer la compilation comme ayant échouée après N secondes d'activité" -#: guix/scripts/build.scm:316 +#: guix/scripts/build.scm:326 msgid "" "\n" " --verbosity=LEVEL use the given verbosity LEVEL" @@ -271,7 +291,7 @@ msgstr "" "\n" " --verbosity=NIVEAU utiliser le NIVEAU de verbosité donné" -#: guix/scripts/build.scm:318 +#: guix/scripts/build.scm:328 msgid "" "\n" " --rounds=N build N times in a row to detect non-determinism" @@ -279,7 +299,7 @@ msgstr "" "\n" " --rounds=N compiler N fois de suite pour détecter les non déterminismes" -#: guix/scripts/build.scm:320 +#: guix/scripts/build.scm:330 msgid "" "\n" " -c, --cores=N allow the use of up to N CPU cores for the build" @@ -287,7 +307,7 @@ msgstr "" "\n" " -c, --cores=N utiliser jusqu'à N cœurs CPU pour la compilation" -#: guix/scripts/build.scm:322 +#: guix/scripts/build.scm:332 msgid "" "\n" " -M, --max-jobs=N allow at most N build jobs" @@ -295,12 +315,12 @@ msgstr "" "\n" " -M, --max-jobs=N autoriser au plus N tâches de compilation" -#: guix/scripts/build.scm:428 guix/scripts/build.scm:435 +#: guix/scripts/build.scm:438 guix/scripts/build.scm:445 #, scheme-format msgid "not a number: '~a' option argument: ~a~%" msgstr "pas un nombre: argument d'option « ~a »: ~a~%" -#: guix/scripts/build.scm:455 +#: guix/scripts/build.scm:465 msgid "" "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n" "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n" @@ -308,7 +328,7 @@ msgstr "" "Usage: guix build [OPTION]... PAQUET-OU-DERIVATION...\n" "Compiler le PAQUET-OU-DERIVATION donné et retourner leur chemin de sortie.\n" -#: guix/scripts/build.scm:457 +#: guix/scripts/build.scm:467 msgid "" "\n" " -e, --expression=EXPR build the package or derivation EXPR evaluates to" @@ -316,7 +336,7 @@ msgstr "" "\n" " -e, --expression=EXPR compiler le paquet ou la dérivation évalué par EXPR" -#: guix/scripts/build.scm:459 +#: guix/scripts/build.scm:469 msgid "" "\n" " -f, --file=FILE build the package or derivation that the code within\n" @@ -326,7 +346,7 @@ msgstr "" " -f, --file=FICHIER compiler le paquet ou la dérivation qui est évaluée\n" " par le code dans FICHIER" -#: guix/scripts/build.scm:462 +#: guix/scripts/build.scm:472 msgid "" "\n" " -S, --source build the packages' source derivations" @@ -334,7 +354,7 @@ msgstr "" "\n" " -S, --source compiler les dérivations de source du paquet" -#: guix/scripts/build.scm:464 +#: guix/scripts/build.scm:474 msgid "" "\n" " --sources[=TYPE] build source derivations; TYPE may optionally be one\n" @@ -344,7 +364,7 @@ msgstr "" " --sources[=TYPE] compiler les dérivations sources. TYPE peut optionnellement\n" " être « package », « all » (défaut) ou « transitive »" -#: guix/scripts/build.scm:467 +#: guix/scripts/build.scm:477 msgid "" "\n" " -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\"" @@ -352,7 +372,7 @@ msgstr "" "\n" " -s, --system=SYSTÈME essayer de compiler pour le SYSTÈME donné, par exemple « i686-linux »" -#: guix/scripts/build.scm:469 +#: guix/scripts/build.scm:479 msgid "" "\n" " --target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\"" @@ -360,7 +380,7 @@ msgstr "" "\n" " --target=TRIPLET effectuer une compilation croisée pour TRIPLET, par exemple « armel-linux-gnu »" -#: guix/scripts/build.scm:471 +#: guix/scripts/build.scm:481 msgid "" "\n" " -d, --derivations return the derivation paths of the given packages" @@ -368,7 +388,7 @@ msgstr "" "\n" " -d, --derivations retourner les chemins de dérivation pour les paquets donnés" -#: guix/scripts/build.scm:473 +#: guix/scripts/build.scm:483 msgid "" "\n" " --check rebuild items to check for non-determinism issues" @@ -376,7 +396,7 @@ msgstr "" "\n" " --check recompiler les éléments pour détecter des problèmes de non déterminisme" -#: guix/scripts/build.scm:475 +#: guix/scripts/build.scm:485 msgid "" "\n" " -r, --root=FILE make FILE a symlink to the result, and register it\n" @@ -386,7 +406,7 @@ msgstr "" " -r, --root=FICHIER faire de FICHIER un lien symbolique pointant sur le résultat\n" " et l'enregistrer en tant que racine du garbage collector" -#: guix/scripts/build.scm:478 +#: guix/scripts/build.scm:488 msgid "" "\n" " -q, --quiet do not show the build log" @@ -394,7 +414,7 @@ msgstr "" "\n" " -q, --quiet ne pas montrer le journal de compilation" -#: guix/scripts/build.scm:480 +#: guix/scripts/build.scm:490 msgid "" "\n" " --log-file return the log file names for the given derivations" @@ -402,14 +422,14 @@ msgstr "" "\n" " --log-file retourner les fichiers de journalisation pour les dérivations données" -#: guix/scripts/build.scm:487 guix/scripts/download.scm:56 -#: guix/scripts/package.scm:388 guix/scripts/gc.scm:74 -#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91 -#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83 -#: guix/scripts/substitute.scm:827 guix/scripts/system.scm:695 -#: guix/scripts/lint.scm:865 guix/scripts/publish.scm:73 -#: guix/scripts/edit.scm:44 guix/scripts/size.scm:225 -#: guix/scripts/graph.scm:364 guix/scripts/challenge.scm:182 +#: guix/scripts/build.scm:497 guix/scripts/download.scm:81 +#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74 +#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91 +#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83 +#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748 +#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74 +#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228 +#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43 msgid "" "\n" @@ -418,14 +438,14 @@ msgstr "" "\n" " -h, --help afficher cette aide et quitter" -#: guix/scripts/build.scm:489 guix/scripts/download.scm:58 -#: guix/scripts/package.scm:390 guix/scripts/gc.scm:76 -#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93 -#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85 -#: guix/scripts/substitute.scm:829 guix/scripts/system.scm:697 -#: guix/scripts/lint.scm:869 guix/scripts/publish.scm:75 -#: guix/scripts/edit.scm:46 guix/scripts/size.scm:227 -#: guix/scripts/graph.scm:366 guix/scripts/challenge.scm:184 +#: guix/scripts/build.scm:499 guix/scripts/download.scm:83 +#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76 +#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93 +#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85 +#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750 +#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76 +#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230 +#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45 msgid "" "\n" @@ -434,7 +454,7 @@ msgstr "" "\n" " -V, --version afficher les informations sur la version et quitter" -#: guix/scripts/build.scm:516 +#: guix/scripts/build.scm:526 #, scheme-format msgid "" "invalid argument: '~a' option argument: ~a, ~\n" @@ -443,33 +463,39 @@ msgstr "" "argument invalide: argument en option « ~a »: ~a, ~\n" "doit être « package », « all » ou « transitive »~%" -#: guix/scripts/build.scm:563 +#: guix/scripts/build.scm:573 #, scheme-format msgid "~s: not something we can build~%" msgstr "~s: pas quelque chose qu'on sait compiler~%" -#: guix/scripts/build.scm:643 +#: guix/scripts/build.scm:627 +#, scheme-format +msgid "~a: warning: package '~a' has no source~%" +msgstr "~a: attention: le paquet « ~a » n'a pas de source~%" + +#: guix/scripts/build.scm:661 #, scheme-format msgid "no build log for '~a'~%" msgstr "aucun journal de compilation pour « ~a »~%" -#: guix/scripts/download.scm:47 +#: guix/scripts/download.scm:67 msgid "" "Usage: guix download [OPTION] URL\n" -"Download the file at URL, add it to the store, and print its store path\n" -"and the hash of its contents.\n" +"Download the file at URL to the store or to the given file, and print its\n" +"file name and the hash of its contents.\n" "\n" "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n" "('hex' and 'hexadecimal' can be used as well).\n" msgstr "" "Usage: guix download [OPTION] URL\n" -"Télécharger le fichier à partir de l'URL spécifiée, l'ajouter au dépôt et\n" -"afficher son chemin et l'empreinte de son contenu.\n" +"Télécharger le fichier à partir de l'URL spécifiée et l'ajouter au dépôt ou\n" +"au fichier spécifié puis afficher son nom de fichier et l'empreinte de son\n" +"contenu.\n" "\n" "Formats supportés: 'nix-base32' (défaut), 'base32', et 'base16'\n" "('hex' et 'hexadecimal' peuvent aussi être utilisés).\n" -#: guix/scripts/download.scm:53 guix/scripts/hash.scm:51 +#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54 msgid "" "\n" " -f, --format=FMT write the hash in the given format" @@ -477,91 +503,109 @@ msgstr "" "\n" " -f, --format=FORMAT écrire l'empreinte dans le FORMAT donné" -#: guix/scripts/download.scm:76 guix/scripts/hash.scm:76 +#: guix/scripts/download.scm:75 +msgid "" +"\n" +" --no-check-certificate\n" +" do not validate the certificate of HTTPS servers " +msgstr "" +"\n" +" --no-check-certificate\n" +" ne valide pas les certificats des serveurs HTTPS " + +#: guix/scripts/download.scm:78 +msgid "" +"\n" +" -o, --output=FILE download to FILE" +msgstr "" +"\n" +" -o, --output=FICHIER télécharge dans le FICHIER" + +#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82 #, scheme-format msgid "unsupported hash format: ~a~%" msgstr "format d'empreinte non supporté: ~a~%" -#: guix/scripts/download.scm:102 guix/scripts/package.scm:842 -#: guix/scripts/publish.scm:551 +#: guix/scripts/download.scm:136 guix/scripts/package.scm:879 +#: guix/scripts/publish.scm:558 #, scheme-format msgid "~A: extraneous argument~%" msgstr "~A: argument superflu~%" -#: guix/scripts/download.scm:111 +#: guix/scripts/download.scm:144 #, scheme-format msgid "no download URI was specified~%" msgstr "aucune URI de téléchargement spécifiée~%" -#: guix/scripts/download.scm:113 +#: guix/scripts/download.scm:146 #, scheme-format msgid "~a: failed to parse URI~%" msgstr "~a: impossible d'évaluer l'URI~%" -#: guix/scripts/download.scm:126 +#: guix/scripts/download.scm:156 #, scheme-format msgid "~a: download failed~%" msgstr "~a: le téléchargement a échoué~%" -#: guix/scripts/package.scm:104 +#: guix/scripts/package.scm:107 #, scheme-format msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%" msgstr "Essayez « info '(guix) Invoking guix package' » pour plus d'information.~%" -#: guix/scripts/package.scm:126 +#: guix/scripts/package.scm:129 #, scheme-format msgid "error: while creating directory `~a': ~a~%" msgstr "erreur: pendant la création du répertoire « ~a »: ~a~%" -#: guix/scripts/package.scm:130 +#: guix/scripts/package.scm:133 #, scheme-format msgid "Please create the `~a' directory, with you as the owner.~%" msgstr "Veuillez créer le répertoire « ~a » dont vous êtes le propriétaire.~%" -#: guix/scripts/package.scm:137 +#: guix/scripts/package.scm:140 #, scheme-format msgid "error: directory `~a' is not owned by you~%" msgstr "erreur: vous ne possédez pas le répertoire « ~a »" -#: guix/scripts/package.scm:140 +#: guix/scripts/package.scm:143 #, scheme-format msgid "Please change the owner of `~a' to user ~s.~%" msgstr "Veuillez définir ~s comme propriétaire de « ~a ».~%" -#: guix/scripts/package.scm:175 +#: guix/scripts/package.scm:178 #, scheme-format msgid "not removing generation ~a, which is current~%" msgstr "la génération ~a n'est pas supprimée car elle est actuelle~%" -#: guix/scripts/package.scm:182 +#: guix/scripts/package.scm:185 #, scheme-format msgid "no matching generation~%" msgstr "aucune génération correspondante~%" -#: guix/scripts/package.scm:185 guix/scripts/package.scm:659 -#: guix/scripts/system.scm:502 +#: guix/scripts/package.scm:188 guix/scripts/package.scm:699 +#: guix/scripts/system.scm:549 #, scheme-format msgid "invalid syntax: ~a~%" msgstr "syntaxe non valide: ~a~%" -#: guix/scripts/package.scm:210 +#: guix/scripts/package.scm:214 #, scheme-format msgid "nothing to be done~%" msgstr "aucune action à faire~%" -#: guix/scripts/package.scm:224 +#: guix/scripts/package.scm:228 #, scheme-format msgid "~a package in profile~%" msgid_plural "~a packages in profile~%" msgstr[0] "~a paquet dans le profile~%" msgstr[1] "~a paquets dans le profile~%" -#: guix/scripts/package.scm:313 +#: guix/scripts/package.scm:344 #, scheme-format msgid "The following environment variable definitions may be needed:~%" msgstr "Il pourrait être nécessaire de définir les variables d'environnement suivantes:~%" -#: guix/scripts/package.scm:329 +#: guix/scripts/package.scm:360 msgid "" "Usage: guix package [OPTION]...\n" "Install, remove, or upgrade packages in a single transaction.\n" @@ -569,7 +613,7 @@ msgstr "" "Usage: guix package [OPTION]...\n" "Installer, supprimer ou mettre à jour les paquets en une seule transaction.\n" -#: guix/scripts/package.scm:331 +#: guix/scripts/package.scm:362 msgid "" "\n" " -i, --install PACKAGE ...\n" @@ -579,7 +623,7 @@ msgstr "" " -i, --install=PAQUET ...\n" " installer PAQUETs" -#: guix/scripts/package.scm:334 +#: guix/scripts/package.scm:365 msgid "" "\n" " -e, --install-from-expression=EXP\n" @@ -589,7 +633,7 @@ msgstr "" " -e, --install-from-expression=EXP\n" " installer le paquet évalué par EXP" -#: guix/scripts/package.scm:337 +#: guix/scripts/package.scm:368 msgid "" "\n" " -f, --install-from-file=FILE\n" @@ -601,7 +645,7 @@ msgstr "" " installer le paquet évalué par le code dans\n" " FICHIER" -#: guix/scripts/package.scm:341 +#: guix/scripts/package.scm:372 msgid "" "\n" " -r, --remove PACKAGE ...\n" @@ -611,7 +655,7 @@ msgstr "" " -r, --remove=PAQUET ...\n" " supprimer PAQUETs" -#: guix/scripts/package.scm:344 +#: guix/scripts/package.scm:375 msgid "" "\n" " -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP" @@ -619,7 +663,7 @@ msgstr "" "\n" " -u, --upgrade[=REGEXP] mettre à jour tous les paquets installés correspondant à REGEXP" -#: guix/scripts/package.scm:346 +#: guix/scripts/package.scm:377 msgid "" "\n" " -m, --manifest=FILE create a new profile generation with the manifest\n" @@ -629,7 +673,7 @@ msgstr "" " -m, --manifest=FICHIER créer une nouvelle génération de profil avec le\n" " manifeste dans FICHIER" -#: guix/scripts/package.scm:349 +#: guix/scripts/package.scm:380 msgid "" "\n" " --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP" @@ -637,7 +681,7 @@ msgstr "" "\n" " --do-not-upgrade[=REGEXP] ne pas mettre à jour les paquets correspondant à REGEXP" -#: guix/scripts/package.scm:351 +#: guix/scripts/package.scm:382 msgid "" "\n" " --roll-back roll back to the previous generation" @@ -645,7 +689,7 @@ msgstr "" "\n" " --roll-back revenir à la génération antérieure" -#: guix/scripts/package.scm:353 +#: guix/scripts/package.scm:384 msgid "" "\n" " --search-paths[=KIND]\n" @@ -655,7 +699,7 @@ msgstr "" " --search-paths=[GENRE]\n" " afficher les définitions de variables d'environnement requises" -#: guix/scripts/package.scm:356 +#: guix/scripts/package.scm:387 msgid "" "\n" " -l, --list-generations[=PATTERN]\n" @@ -665,7 +709,7 @@ msgstr "" " -l, --list-generations[=MOTIF]\n" " lister les générations correspondant à MOTIF" -#: guix/scripts/package.scm:359 +#: guix/scripts/package.scm:390 msgid "" "\n" " -d, --delete-generations[=PATTERN]\n" @@ -675,7 +719,7 @@ msgstr "" " -d, --delete-generations[=MOTIF]\n" " supprimer les générations correspondant à MOTIF" -#: guix/scripts/package.scm:362 +#: guix/scripts/package.scm:393 msgid "" "\n" " -S, --switch-generation=PATTERN\n" @@ -685,7 +729,7 @@ msgstr "" " -S, --switch-generation=MOTIF\n" " basculer vers une génération correspondant à MOTIF" -#: guix/scripts/package.scm:365 +#: guix/scripts/package.scm:396 msgid "" "\n" " -p, --profile=PROFILE use PROFILE instead of the user's default profile" @@ -693,7 +737,7 @@ msgstr "" "\n" " -p, --profile=PROFIL utiliser PROFIL au lieu du profil par défaut de l'utilisateur" -#: guix/scripts/package.scm:368 +#: guix/scripts/package.scm:399 msgid "" "\n" " --bootstrap use the bootstrap Guile to build the profile" @@ -701,7 +745,7 @@ msgstr "" "\n" " --bootstrap utiliser le programme d'amorçage Guile pour compiler le profil" -#: guix/scripts/package.scm:370 guix/scripts/pull.scm:76 +#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76 msgid "" "\n" " --verbose produce verbose output" @@ -709,7 +753,7 @@ msgstr "" "\n" " --verbose produire une sortie verbeuse" -#: guix/scripts/package.scm:373 +#: guix/scripts/package.scm:404 msgid "" "\n" " -s, --search=REGEXP search in synopsis and description using REGEXP" @@ -717,7 +761,7 @@ msgstr "" "\n" " -s, --search=REGEXP chercher dans le synopsis et la description en utilisant REGEXP" -#: guix/scripts/package.scm:375 +#: guix/scripts/package.scm:406 msgid "" "\n" " -I, --list-installed[=REGEXP]\n" @@ -727,7 +771,7 @@ msgstr "" " -I, --list-installed[=REGEXP]\n" " lister les paquets installés correspondant à REGEXP" -#: guix/scripts/package.scm:378 +#: guix/scripts/package.scm:409 msgid "" "\n" " -A, --list-available[=REGEXP]\n" @@ -737,7 +781,7 @@ msgstr "" " -A, --list-available[=REGEXP]\n" " lister les paquets disponibles correspondant à REGEXP" -#: guix/scripts/package.scm:381 +#: guix/scripts/package.scm:412 msgid "" "\n" " --show=PACKAGE show details about PACKAGE" @@ -745,22 +789,22 @@ msgstr "" "\n" " --show=PAQUET montrer des détails du PAQUET" -#: guix/scripts/package.scm:476 +#: guix/scripts/package.scm:507 #, scheme-format msgid "~a: unsupported kind of search path~%" msgstr "~a: type de chemin de recherche non supporté~%" -#: guix/scripts/package.scm:755 +#: guix/scripts/package.scm:790 #, scheme-format msgid "cannot switch to generation '~a'~%" msgstr "impossible de passer à la génération « ~a »~%" -#: guix/scripts/package.scm:771 +#: guix/scripts/package.scm:806 #, scheme-format msgid "would install new manifest from '~a' with ~d entries~%" msgstr "installerait le nouveau manifeste depuis « ~a » avec ~d entrées~%" -#: guix/scripts/package.scm:773 +#: guix/scripts/package.scm:808 #, scheme-format msgid "installing new manifest from '~a' with ~d entries~%" msgstr "installation du nouveau manifeste depuis « ~a » avec ~d entrées~%" @@ -897,7 +941,7 @@ msgstr "arguments superflus: ~{~a ~}~%" msgid "freed ~h bytes~%" msgstr "~h octets libérés~%" -#: guix/scripts/hash.scm:46 +#: guix/scripts/hash.scm:47 msgid "" "Usage: guix hash [OPTION] FILE\n" "Return the cryptographic hash of FILE.\n" @@ -911,7 +955,15 @@ msgstr "" "Formats supportés: « nix-base32 » (défaut), « base32 », et « base16 » (« hex »\n" "et « hexadecimal » peuvent également être utilisés).\n" -#: guix/scripts/hash.scm:53 +#: guix/scripts/hash.scm:52 +msgid "" +"\n" +" -x, --exclude-vcs exclude version control directories" +msgstr "" +"\n" +" -x, --exclude-vcs exclure les répertoires de contrôle de versions" + +#: guix/scripts/hash.scm:56 msgid "" "\n" " -r, --recursive compute the hash on FILE recursively" @@ -919,17 +971,18 @@ msgstr "" "\n" " -r, --recursive calculer l'empreinte de FICHIER de manière récursive" -#: guix/scripts/hash.scm:104 +#: guix/scripts/hash.scm:109 #, scheme-format msgid "unrecognized option: ~a~%" msgstr "option non reconnue: ~a~%" -#: guix/scripts/hash.scm:135 guix/ui.scm:477 +#: guix/scripts/hash.scm:152 guix/ui.scm:478 #, scheme-format msgid "~a~%" msgstr "~a~%" -#: guix/scripts/hash.scm:138 guix/scripts/system.scm:825 +#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879 +#: guix/scripts/system.scm:886 guix/scripts/system.scm:893 #, scheme-format msgid "wrong number of arguments~%" msgstr "nombre d'arguments incorrect~%" @@ -951,17 +1004,17 @@ msgstr "IMPORTATEUR doit être un des importateurs listés ci-dessous:\n" msgid "guix import: missing importer name~%" msgstr "guix import: nom d'importateur manquant~%" -#: guix/scripts/import.scm:115 +#: guix/scripts/import.scm:122 #, scheme-format msgid "'~a' import failed~%" msgstr "l'importateur « ~a » a échoué~%" -#: guix/scripts/import.scm:116 +#: guix/scripts/import.scm:123 #, scheme-format msgid "~a: invalid importer~%" msgstr "~a: importateur non valide~%" -#: guix/scripts/import/cran.scm:42 +#: guix/scripts/import/cran.scm:43 msgid "" "Usage: guix import cran PACKAGE-NAME\n" "Import and convert the CRAN package for PACKAGE-NAME.\n" @@ -969,7 +1022,7 @@ msgstr "" "Usage: guix import cran PAQUET-NOM\n" "Importer et convertir le paquet CAN pour PAQUET-NOM.\n" -#: guix/scripts/import/cran.scm:44 +#: guix/scripts/import/cran.scm:45 msgid "" "\n" " -a, --archive=ARCHIVE specify the archive repository" @@ -977,17 +1030,17 @@ msgstr "" "\n" " -a, --archive=ARCHIVE spécifier le dépôt de l'archive" -#: guix/scripts/import/cran.scm:94 +#: guix/scripts/import/cran.scm:108 #, scheme-format msgid "failed to download description for package '~a'~%" msgstr "échec lors du téléchargement de la description du paquet « ~a »~%" -#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95 +#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95 #, scheme-format msgid "too few arguments~%" msgstr "trop peux d'arguments~%" -#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97 +#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97 #, scheme-format msgid "too many arguments~%" msgstr "trop d'arguments~%" @@ -1089,127 +1142,127 @@ msgstr "~A: argument inattendu~%" msgid "failed to download up-to-date source, exiting\n" msgstr "impossible de télécharger une source à jour; fin\n" -#: guix/scripts/substitute.scm:113 +#: guix/scripts/substitute.scm:112 #, scheme-format msgid "authentication and authorization of substitutes disabled!~%" msgstr "authentification et autorisation des substituts désactivées !~%" -#: guix/scripts/substitute.scm:188 +#: guix/scripts/substitute.scm:187 #, scheme-format msgid "download from '~a' failed: ~a, ~s~%" msgstr "le téléchargement depuis « ~a » a échoué: ~a, ~s~%" -#: guix/scripts/substitute.scm:201 +#: guix/scripts/substitute.scm:200 #, scheme-format msgid "while fetching ~a: server is somewhat slow~%" msgstr "pendant la récupération de ~a: le serveur est plutôt lent~%" -#: guix/scripts/substitute.scm:203 +#: guix/scripts/substitute.scm:202 #, scheme-format msgid "try `--no-substitutes' if the problem persists~%" msgstr "essayez l'option « --no-substitutes » si le problème persiste~%" -#: guix/scripts/substitute.scm:219 +#: guix/scripts/substitute.scm:220 #, scheme-format msgid "unsupported substitute URI scheme: ~a~%" msgstr "schéma de substitution URI non supporté: ~a~%" -#: guix/scripts/substitute.scm:252 +#: guix/scripts/substitute.scm:254 #, scheme-format msgid "while fetching '~a': ~a (~s)~%" msgstr "pendant la récupération de « ~a »: ~a (~s)~%" -#: guix/scripts/substitute.scm:257 +#: guix/scripts/substitute.scm:259 #, scheme-format msgid "ignoring substitute server at '~s'~%" msgstr "ignore le serveur de substitution à « ~s »~%" -#: guix/scripts/substitute.scm:306 +#: guix/scripts/substitute.scm:309 #, scheme-format msgid "signature version must be a number: ~s~%" msgstr "la version de la signature doit être un nombre: ~s~%" -#: guix/scripts/substitute.scm:310 +#: guix/scripts/substitute.scm:313 #, scheme-format msgid "unsupported signature version: ~a~%" msgstr "version de signature non supportée: ~a~%" -#: guix/scripts/substitute.scm:318 +#: guix/scripts/substitute.scm:321 #, scheme-format msgid "signature is not a valid s-expression: ~s~%" msgstr "la signature n'est pas une s-expression valide: ~s~%" -#: guix/scripts/substitute.scm:322 +#: guix/scripts/substitute.scm:325 #, scheme-format msgid "invalid format of the signature field: ~a~%" msgstr "format invalide du champ de signature: ~a~%" -#: guix/scripts/substitute.scm:357 +#: guix/scripts/substitute.scm:360 #, scheme-format msgid "invalid signature for '~a'~%" msgstr "signature non valide pour « ~a »~%" -#: guix/scripts/substitute.scm:359 +#: guix/scripts/substitute.scm:362 #, scheme-format msgid "hash mismatch for '~a'~%" msgstr "l'empreinte ne correspond pas pour « ~a »~%" -#: guix/scripts/substitute.scm:361 +#: guix/scripts/substitute.scm:364 #, scheme-format msgid "'~a' is signed with an unauthorized key~%" msgstr "« ~a » est signé avec une clé non autorisée~%" -#: guix/scripts/substitute.scm:363 +#: guix/scripts/substitute.scm:366 #, scheme-format msgid "signature on '~a' is corrupt~%" msgstr "la signature de « ~a » est corrompue~%" -#: guix/scripts/substitute.scm:401 +#: guix/scripts/substitute.scm:404 #, scheme-format msgid "substitute at '~a' lacks a signature~%" msgstr "le substitut à « ~a » n'a pas de signature~%" -#: guix/scripts/substitute.scm:409 +#: guix/scripts/substitute.scm:411 #, scheme-format -msgid "~%Found valid signature for ~a~%" -msgstr "~%Signature valide trouvée pour ~a~%" +msgid "Found valid signature for ~a~%" +msgstr "Signature valide trouvée pour ~a~%" -#: guix/scripts/substitute.scm:412 +#: guix/scripts/substitute.scm:414 #, scheme-format msgid "From ~a~%" msgstr "De ~a~%" -#: guix/scripts/substitute.scm:452 +#: guix/scripts/substitute.scm:454 #, scheme-format msgid "'~a' does not name a store item~%" msgstr "« ~a » ne nomme pas un élément du stockage~%" -#: guix/scripts/substitute.scm:596 +#: guix/scripts/substitute.scm:600 #, scheme-format msgid "updating list of substitutes from '~a'... ~5,1f%" msgstr "mise à jour de la liste des substituts depuis « ~a »... ~5,1f%" -#: guix/scripts/substitute.scm:646 +#: guix/scripts/substitute.scm:655 #, scheme-format msgid "~s: unsupported server URI scheme~%" msgstr "~s: schéma de URI serveur non supporté~%" -#: guix/scripts/substitute.scm:656 +#: guix/scripts/substitute.scm:665 #, scheme-format msgid "'~a' uses different store '~a'; ignoring it~%" msgstr "« ~a » utilise un stockage « ~a » différent. Il est ignoré~%" -#: guix/scripts/substitute.scm:801 +#: guix/scripts/substitute.scm:810 #, scheme-format msgid "host name lookup error: ~a~%" msgstr "erreur lors de la consultation du nom d'hôte: ~a~%" -#: guix/scripts/substitute.scm:806 +#: guix/scripts/substitute.scm:815 #, scheme-format msgid "TLS error in procedure '~a': ~a~%" msgstr "erreur TLS dans la procédure « ~a »: ~a~%" -#: guix/scripts/substitute.scm:817 +#: guix/scripts/substitute.scm:826 msgid "" "Usage: guix substitute [OPTION]...\n" "Internal tool to substitute a pre-built binary to a local build.\n" @@ -1217,7 +1270,7 @@ msgstr "" "Usage: guix substitute [OPTION]...\n" "Outil interne pour substituer un binaire pré-compilé à une compilation locale.\n" -#: guix/scripts/substitute.scm:819 +#: guix/scripts/substitute.scm:828 msgid "" "\n" " --query report on the availability of substitutes for the\n" @@ -1228,7 +1281,7 @@ msgstr "" " noms de fichiers de dépôt passés sur l'entrée\n" " standard" -#: guix/scripts/substitute.scm:822 +#: guix/scripts/substitute.scm:831 msgid "" "\n" " --substitute STORE-FILE DESTINATION\n" @@ -1243,41 +1296,41 @@ msgstr "" #. TRANSLATORS: The second part of this message looks like #. "(4.1MiB installed)"; it shows the size of the package once #. installed. -#: guix/scripts/substitute.scm:895 +#: guix/scripts/substitute.scm:904 #, scheme-format msgid "Downloading ~a~:[~*~; (~a installed)~]...~%" msgstr "Téléchargement de ~a~:[~*~; (~a installé)~]...~%" -#: guix/scripts/substitute.scm:951 +#: guix/scripts/substitute.scm:961 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n" msgstr "l'ACL pour l'import d'archives ne semble pas initialisée ; les substituts pourraient être indisponibles\n" -#: guix/scripts/substitute.scm:1047 +#: guix/scripts/substitute.scm:1057 #, scheme-format msgid "~a: unrecognized options~%" msgstr "~a: options non reconnues~%" -#: guix/scripts/authenticate.scm:58 +#: guix/scripts/authenticate.scm:59 #, scheme-format msgid "cannot find public key for secret key '~a'~%" msgstr "impossible de trouver la clé publique correspondant à la clé secrète « ~a »~%" -#: guix/scripts/authenticate.scm:78 +#: guix/scripts/authenticate.scm:79 #, scheme-format msgid "error: invalid signature: ~a~%" msgstr "erreur: signature non valide: ~a~%" -#: guix/scripts/authenticate.scm:80 +#: guix/scripts/authenticate.scm:81 #, scheme-format msgid "error: unauthorized public key: ~a~%" msgstr "erreur: clé publique non autorisée: ~a~%" -#: guix/scripts/authenticate.scm:82 +#: guix/scripts/authenticate.scm:83 #, scheme-format msgid "error: corrupt signature data: ~a~%" msgstr "erreur: signature corrompue: ~a~%" -#: guix/scripts/authenticate.scm:120 +#: guix/scripts/authenticate.scm:121 msgid "" "Usage: guix authenticate OPTION...\n" "Sign or verify the signature on the given file. This tool is meant to\n" @@ -1287,187 +1340,207 @@ msgstr "" "Signer ou vérifier la signature du fichier donné. Cet outil est destiné\n" "à être utilisé en interne par « guix-daemon ».\n" -#: guix/scripts/authenticate.scm:126 +#: guix/scripts/authenticate.scm:127 msgid "wrong arguments" msgstr "mauvais arguments" -#: guix/scripts/system.scm:111 +#: guix/scripts/system.scm:109 #, scheme-format msgid "failed to register '~a' under '~a'~%" msgstr "impossible d'enregistrer « ~a » sous « ~a »~%" -#: guix/scripts/system.scm:144 +#: guix/scripts/system.scm:142 #, scheme-format msgid "failed to install GRUB on device '~a'~%" msgstr "échec de l'installation de GRUB sur le périphérique « ~a »~%" -#: guix/scripts/system.scm:162 +#: guix/scripts/system.scm:160 #, scheme-format msgid "initializing the current root file system~%" msgstr "initialisation du système de fichier racine courant~%" -#: guix/scripts/system.scm:176 +#: guix/scripts/system.scm:174 #, scheme-format msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%" msgstr "n'est pas exécuté en tant que « root » donc le propriétaire de « ~a » pourrait être incorrect !~%" -#: guix/scripts/system.scm:234 +#: guix/scripts/system.scm:238 #, scheme-format msgid "while talking to shepherd: ~a~%" msgstr "en parlant à shepherd: ~a~%" -#: guix/scripts/system.scm:248 +#: guix/scripts/system.scm:245 #, scheme-format msgid "service '~a' could not be found~%" msgstr "service: « ~a » introuvable~%" -#: guix/scripts/system.scm:251 +#: guix/scripts/system.scm:248 #, scheme-format msgid "service '~a' does not have an action '~a'~%" msgstr "le service « ~a » n'a pas d'action « ~a »~%" -#: guix/scripts/system.scm:255 +#: guix/scripts/system.scm:252 #, scheme-format msgid "exception caught while executing '~a' on service '~a':~%" msgstr "exception interceptée pendant l'exécution de « ~a » sur le service « ~a »:~%" -#: guix/scripts/system.scm:263 +#: guix/scripts/system.scm:260 #, scheme-format msgid "something went wrong: ~s~%" msgstr "quelque chose s'est mal passé: ~s~%" -#: guix/scripts/system.scm:266 +#: guix/scripts/system.scm:263 #, scheme-format msgid "shepherd error~%" msgstr "erreur de shepherd~%" -#: guix/scripts/system.scm:302 +#: guix/scripts/system.scm:280 #, scheme-format msgid "failed to obtain list of shepherd services~%" msgstr "erreur en essayant d'obtenir la liste des services de shepherd~%" -#: guix/scripts/system.scm:322 +#: guix/scripts/system.scm:300 #, scheme-format msgid "unloading service '~a'...~%" msgstr "déchargement du service « ~a »...~%" -#: guix/scripts/system.scm:330 +#: guix/scripts/system.scm:308 #, scheme-format msgid "loading new services:~{ ~a~}...~%" msgstr "Chargement des nouveaux services:~{ ~a~}...~%" -#: guix/scripts/system.scm:354 +#: guix/scripts/system.scm:332 #, scheme-format msgid "activating system...~%" msgstr "activation du système...~%" -#: guix/scripts/system.scm:445 +#: guix/scripts/system.scm:425 +#, scheme-format +msgid "cannot switch to system generation '~a'~%" +msgstr "impossible de passer à la génération « ~a » du système~%" + +#: guix/scripts/system.scm:459 +#, scheme-format +msgid "failed to re-install GRUB configuration file: '~a'~%" +msgstr "échec à la ré-installation du fichier de configuration de GRUB: « ~a »~%" + +#: guix/scripts/system.scm:489 msgid "the DAG of services" msgstr "le graphe orienté acyclique (DAG) des services" -#: guix/scripts/system.scm:458 +#: guix/scripts/system.scm:502 msgid "the dependency graph of shepherd services" msgstr "le graphique des dépendances des services de shepherd" -#: guix/scripts/system.scm:479 +#: guix/scripts/system.scm:526 #, scheme-format msgid " file name: ~a~%" msgstr " nom de fichier: ~a~%" -#: guix/scripts/system.scm:480 +#: guix/scripts/system.scm:527 #, scheme-format msgid " canonical file name: ~a~%" msgstr " nom de fichier canonique: ~a~%" #. TRANSLATORS: Please preserve the two-space indentation. -#: guix/scripts/system.scm:482 +#: guix/scripts/system.scm:529 #, scheme-format msgid " label: ~a~%" msgstr " étiquette: ~a~%" -#: guix/scripts/system.scm:483 +#: guix/scripts/system.scm:530 #, scheme-format msgid " root device: ~a~%" msgstr " périphérique racine: ~a~%" -#: guix/scripts/system.scm:484 +#: guix/scripts/system.scm:531 #, scheme-format msgid " kernel: ~a~%" msgstr " noyau: ~a~%" -#: guix/scripts/system.scm:541 +#: guix/scripts/system.scm:588 #, scheme-format msgid "~a not found: 'guix pull' was never run~%" msgstr "~a pas trouvé: « guix pull » n'a jamais été exécuté~%" -#: guix/scripts/system.scm:542 +#: guix/scripts/system.scm:589 #, scheme-format msgid "Consider running 'guix pull' before 'reconfigure'.~%" msgstr "Envisagez d'exécuter « guix pull » avant « reconfigure ».~%" -#: guix/scripts/system.scm:543 +#: guix/scripts/system.scm:590 #, scheme-format msgid "Failing to do that may downgrade your system!~%" msgstr "Si vous ne le faites pas, votre système pourrait être amené à une version inférieure !~%" -#: guix/scripts/system.scm:613 +#: guix/scripts/system.scm:661 #, scheme-format msgid "initializing operating system under '~a'...~%" msgstr "initialisation du système d'exploitation sous « ~a »...~%" -#: guix/scripts/system.scm:652 +#: guix/scripts/system.scm:700 msgid "" -"Usage: guix system [OPTION] ACTION [FILE]\n" +"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n" "Build the operating system declared in FILE according to ACTION.\n" +"Some ACTIONS support additional ARGS.\n" msgstr "" -"Usage: guix system [OPTION] ACTION [FICHIER]\n" +"Usage: guix system [OPTION ...] ACTION [ARG ...] [FICHIER]\n" "Compiler le système d'exploitation déclaré dans FICHER en suivant ACTION.\n" +"Certaines ACTIONS supportent des ARGUMENTS supplémentaires.\n" -#: guix/scripts/system.scm:655 guix/scripts/container.scm:28 +#: guix/scripts/system.scm:704 guix/scripts/container.scm:28 msgid "The valid values for ACTION are:\n" msgstr "Les valeurs possibles pour ACTION sont:\n" -#: guix/scripts/system.scm:657 +#: guix/scripts/system.scm:706 msgid " reconfigure switch to a new operating system configuration\n" msgstr " reconfigure basculer vers une nouvelle configuration du système d'exploitation\n" -#: guix/scripts/system.scm:659 +#: guix/scripts/system.scm:708 +msgid " roll-back switch to the previous operating system configuration\n" +msgstr " roll-back basculer vers la configuration du système d'exploitation précédente\n" + +#: guix/scripts/system.scm:710 +msgid " switch-generation switch to an existing operating system configuration\n" +msgstr " switch-generation basculer vers une configuration du système d'exploitation existante\n" + +#: guix/scripts/system.scm:712 msgid " list-generations list the system generations\n" msgstr " list-generations lister les générations du système\n" -#: guix/scripts/system.scm:661 +#: guix/scripts/system.scm:714 msgid " build build the operating system without installing anything\n" msgstr " build compiler le système d'exploitation sans rien installer\n" -#: guix/scripts/system.scm:663 +#: guix/scripts/system.scm:716 msgid " container build a container that shares the host's store\n" msgstr " container compiler un conteneur qui partage le stockage de l'hôte\n" -#: guix/scripts/system.scm:665 +#: guix/scripts/system.scm:718 msgid " vm build a virtual machine image that shares the host's store\n" msgstr " vm compiler une machine virtuelle partageant le dépôt de l'hôte\n" -#: guix/scripts/system.scm:667 +#: guix/scripts/system.scm:720 msgid " vm-image build a freestanding virtual machine image\n" msgstr " vm-image compiler une image autonome de machine virtuelle\n" -#: guix/scripts/system.scm:669 +#: guix/scripts/system.scm:722 msgid " disk-image build a disk image, suitable for a USB stick\n" msgstr " disk-image compiler une image disque adaptée pour une clé USB\n" -#: guix/scripts/system.scm:671 +#: guix/scripts/system.scm:724 msgid " init initialize a root file system to run GNU\n" msgstr " init initialiser un système de fichier racine pour lancer GNU.\n" -#: guix/scripts/system.scm:673 +#: guix/scripts/system.scm:726 msgid " extension-graph emit the service extension graph in Dot format\n" msgstr " extension-graph produire le graphique d'extension de service au format Dot\n" -#: guix/scripts/system.scm:675 +#: guix/scripts/system.scm:728 msgid " shepherd-graph emit the graph of shepherd services in Dot format\n" msgstr " shepherd-graph produire le graphique des services de shepherd au format Dot\n" -#: guix/scripts/system.scm:679 +#: guix/scripts/system.scm:732 msgid "" "\n" " -d, --derivation return the derivation of the given system" @@ -1475,7 +1548,7 @@ msgstr "" "\n" " -d, --derivation retourner les dérivations pour le système donné" -#: guix/scripts/system.scm:681 +#: guix/scripts/system.scm:734 msgid "" "\n" " --on-error=STRATEGY\n" @@ -1485,7 +1558,7 @@ msgstr "" " --on-error=STRATÉGIE\n" " appliquer la STRATÉGIE quand une erreur survient en lisant le FICHIER" -#: guix/scripts/system.scm:684 +#: guix/scripts/system.scm:737 msgid "" "\n" " --image-size=SIZE for 'vm-image', produce an image of SIZE" @@ -1494,7 +1567,7 @@ msgstr "" " --image-size=TAILLE\n" " pour « vm-image », produire une image de TAILLE" -#: guix/scripts/system.scm:686 +#: guix/scripts/system.scm:739 msgid "" "\n" " --no-grub for 'init', do not install GRUB" @@ -1502,7 +1575,7 @@ msgstr "" "\n" " --no-grub pour « init », ne pas installer GRUB" -#: guix/scripts/system.scm:688 +#: guix/scripts/system.scm:741 msgid "" "\n" " --share=SPEC for 'vm', share host file system according to SPEC" @@ -1511,7 +1584,7 @@ msgstr "" " --share=SPEC pour « vm », partager le système de fichiers hôte selon\n" " SPEC" -#: guix/scripts/system.scm:690 +#: guix/scripts/system.scm:743 msgid "" "\n" " --expose=SPEC for 'vm', expose host file system according to SPEC" @@ -1520,7 +1593,7 @@ msgstr "" " --expose=SPEC pour « vm », exposer le système de fichiers hôte selon\n" " SPEC" -#: guix/scripts/system.scm:692 +#: guix/scripts/system.scm:745 msgid "" "\n" " --full-boot for 'vm', make a full boot sequence" @@ -1528,49 +1601,64 @@ msgstr "" "\n" " --full-boot pour « vm », accomplir une séquence complète de démarrage" -#: guix/scripts/system.scm:777 +#: guix/scripts/system.scm:830 #, scheme-format msgid "no configuration file specified~%" msgstr "aucun fichier de configuration spécifié~%" -#: guix/scripts/system.scm:840 +#: guix/scripts/system.scm:912 #, scheme-format msgid "~a: unknown action~%" msgstr "~a: action inconnue~%" -#: guix/scripts/system.scm:855 +#: guix/scripts/system.scm:927 #, scheme-format msgid "wrong number of arguments for action '~a'~%" msgstr "nombre d'arguments incorrect pour l'action « ~a »~%" -#: guix/scripts/system.scm:860 +#: guix/scripts/system.scm:932 #, scheme-format msgid "guix system: missing command name~%" msgstr "système guix: nom de commande manquant~%" -#: guix/scripts/system.scm:862 +#: guix/scripts/system.scm:934 #, scheme-format msgid "Try 'guix system --help' for more information.~%" msgstr "Essayez « guix system --help » pour plus d'informations.~%" -#: guix/scripts/lint.scm:130 +#: guix/scripts/lint.scm:133 #, scheme-format msgid "Available checkers:~%" msgstr "Vérificateurs disponibles:~%" -#: guix/scripts/lint.scm:150 +#: guix/scripts/lint.scm:157 msgid "description should not be empty" msgstr "la description ne devrait pas être vide" -#: guix/scripts/lint.scm:160 +#: guix/scripts/lint.scm:167 msgid "Texinfo markup in description is invalid" msgstr "l'utilisation de balises Texinfo dans la description est invalide" -#: guix/scripts/lint.scm:168 +#: guix/scripts/lint.scm:177 +#, scheme-format +msgid "" +"description should not contain ~\n" +"trademark sign '~a' at ~d" +msgstr "" +"la description ne devrait pas contenir ~\n" +"le signe de marque déposée « ~a » à ~d" + +#. TRANSLATORS: '@code' is Texinfo markup and must be kept +#. as is. +#: guix/scripts/lint.scm:190 +msgid "use @code or similar ornament instead of quotes" +msgstr "utiliser @code ou une décoration similaire au lieu des guillemets" + +#: guix/scripts/lint.scm:197 msgid "description should start with an upper-case letter or digit" msgstr "La description devrait commencer par une majuscule ou un chiffre" -#: guix/scripts/lint.scm:184 +#: guix/scripts/lint.scm:213 #, scheme-format msgid "" "sentences in description should be followed ~\n" @@ -1579,201 +1667,225 @@ msgstr "" "les phrases dans la description devraient être suivies ~\n" "par deux espaces. Infraction probable~p à ~{~a~^, ~}" -#: guix/scripts/lint.scm:200 +#: guix/scripts/lint.scm:231 #, scheme-format msgid "invalid description: ~s" msgstr "description invalide: ~s" -#: guix/scripts/lint.scm:220 +#: guix/scripts/lint.scm:256 #, scheme-format msgid "'~a' should probably be a native input" msgstr "« ~a » devrait sans doute être une entrée native" -#: guix/scripts/lint.scm:238 +#: guix/scripts/lint.scm:280 +#, scheme-format +msgid "'~a' should probably not be an input at all" +msgstr "« ~a » ne devrait probablement pas être une entrée du tout" + +#: guix/scripts/lint.scm:306 msgid "synopsis should not be empty" msgstr "le synopsis ne devrait pas être vide" -#: guix/scripts/lint.scm:246 +#: guix/scripts/lint.scm:314 msgid "no period allowed at the end of the synopsis" msgstr "un point n'est pas autorisé à la fin du synopsis" -#: guix/scripts/lint.scm:258 +#: guix/scripts/lint.scm:326 msgid "no article allowed at the beginning of the synopsis" msgstr "les articles ne sont pas permis au début du synopsis" -#: guix/scripts/lint.scm:265 +#: guix/scripts/lint.scm:333 msgid "synopsis should be less than 80 characters long" msgstr "le synopsis devrait être plus court que 80 caractères" -#: guix/scripts/lint.scm:271 +#: guix/scripts/lint.scm:339 msgid "synopsis should start with an upper-case letter or digit" msgstr "le synopsis devrait commencer par une majuscule ou un chiffre" -#: guix/scripts/lint.scm:278 +#: guix/scripts/lint.scm:346 msgid "synopsis should not start with the package name" msgstr "le synopsis ne devrait pas commencer par un nom de paquet" -#: guix/scripts/lint.scm:292 +#: guix/scripts/lint.scm:360 #, scheme-format msgid "invalid synopsis: ~s" msgstr "synopsis non valide: ~s" -#: guix/scripts/lint.scm:383 +#: guix/scripts/lint.scm:459 #, scheme-format msgid "URI ~a returned suspiciously small file (~a bytes)" msgstr "l'URI ~a a renvoyé un fichier étrangement petit (~a octets)" -#: guix/scripts/lint.scm:392 guix/scripts/lint.scm:404 +#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480 #, scheme-format msgid "URI ~a not reachable: ~a (~s)" msgstr "l'URI ~a n'a pu être atteinte: ~a (~s)" -#: guix/scripts/lint.scm:411 +#: guix/scripts/lint.scm:487 #, scheme-format msgid "URI ~a domain not found: ~a" msgstr "le domaine de l'URI ~a pas trouvé: ~a" -#: guix/scripts/lint.scm:419 +#: guix/scripts/lint.scm:495 #, scheme-format msgid "URI ~a unreachable: ~a" msgstr "l'URI ~a n'a pu être atteinte: ~a" -#: guix/scripts/lint.scm:445 +#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761 +#, scheme-format +msgid "TLS certificate error: ~a" +msgstr "erreur de certificat TLS: ~a" + +#: guix/scripts/lint.scm:525 msgid "invalid value for home page" msgstr "valeur invalide pour la page d'accueil" -#: guix/scripts/lint.scm:448 +#: guix/scripts/lint.scm:528 #, scheme-format msgid "invalid home page URL: ~s" msgstr "URL de la page d'accueil invalide: ~s" -#: guix/scripts/lint.scm:468 +#: guix/scripts/lint.scm:548 msgid "file names of patches should start with the package name" msgstr "les noms de fichiers des correctifs devraient commencer par le nom du paquet" -#: guix/scripts/lint.scm:507 +#: guix/scripts/lint.scm:587 #, scheme-format msgid "~a: ~a: proposed synopsis: ~s~%" msgstr "~a: ~a: synopsis proposé: ~s~%" -#: guix/scripts/lint.scm:520 +#: guix/scripts/lint.scm:600 #, scheme-format msgid "~a: ~a: proposed description:~% \"~a\"~%" msgstr "~a: ~a: description proposée:~% « ~a »~%" -#: guix/scripts/lint.scm:557 +#: guix/scripts/lint.scm:642 msgid "all the source URIs are unreachable:" msgstr "toutes les URI sources sont inatteignables:" -#: guix/scripts/lint.scm:580 +#: guix/scripts/lint.scm:665 msgid "the source file name should contain the package name" msgstr "le nom du fichier source devrait contenir le nom du paquet" -#: guix/scripts/lint.scm:589 guix/scripts/lint.scm:593 +#: guix/scripts/lint.scm:681 +#, scheme-format +msgid "URL should be 'mirror://~a/~a'" +msgstr "l'URL devrait être « mirror://~a/~a »" + +#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703 #, scheme-format msgid "failed to create derivation: ~a" msgstr "échec à la création de la dérivation: ~a" -#: guix/scripts/lint.scm:607 +#: guix/scripts/lint.scm:717 #, scheme-format msgid "failed to create derivation: ~s~%" msgstr "échec à la création de la dérivation: ~s~%" -#: guix/scripts/lint.scm:617 +#: guix/scripts/lint.scm:727 msgid "invalid license field" msgstr "champ de licence invalide" -#: guix/scripts/lint.scm:634 +#: guix/scripts/lint.scm:744 #, scheme-format msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%" msgstr "échec de récupération des vulnérabilités CVE depuis ~s: ~a (~s)~%" -#: guix/scripts/lint.scm:639 guix/scripts/lint.scm:647 +#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758 +#: guix/scripts/lint.scm:763 #, scheme-format msgid "assuming no CVE vulnerabilities~%" msgstr "on suppose qu'il n'y a pas de vulnérabilités CVE~%" -#: guix/scripts/lint.scm:645 +#: guix/scripts/lint.scm:756 #, scheme-format msgid "failed to lookup NIST host: ~a~%" msgstr "impossible de trouver l'hôte NIST: ~a~%" -#: guix/scripts/lint.scm:683 +#: guix/scripts/lint.scm:801 #, scheme-format msgid "probably vulnerable to ~a" msgstr "probablement vulnérable à ~a" -#: guix/scripts/lint.scm:698 +#: guix/scripts/lint.scm:816 #, scheme-format msgid "tabulation on line ~a, column ~a" msgstr "tabulation à la ligne ~a, colonne ~a" -#: guix/scripts/lint.scm:707 +#: guix/scripts/lint.scm:825 #, scheme-format msgid "trailing white space on line ~a" msgstr "espace à la fin de la ligne ~a" -#: guix/scripts/lint.scm:717 +#: guix/scripts/lint.scm:835 #, scheme-format msgid "line ~a is way too long (~a characters)" msgstr "la ligne ~a est beaucoup trop longue (~a caractères)" -#: guix/scripts/lint.scm:728 +#: guix/scripts/lint.scm:846 #, scheme-format msgid "line ~a: parentheses feel lonely, move to the previous or next line" msgstr "ligne ~a: des parenthèses se sentent seules. À déplacer à la ligne suivante ou précédente" -#: guix/scripts/lint.scm:783 +#: guix/scripts/lint.scm:901 msgid "Validate package descriptions" msgstr "Valider des descriptions de paquets" -#: guix/scripts/lint.scm:787 +#: guix/scripts/lint.scm:905 msgid "Validate synopsis & description of GNU packages" msgstr "Valider le synopsis et la description de paquets GNU" -#: guix/scripts/lint.scm:791 +#: guix/scripts/lint.scm:909 msgid "Identify inputs that should be native inputs" msgstr "Identifier les entrées qui devraient être natives" -#: guix/scripts/lint.scm:795 +#: guix/scripts/lint.scm:913 +msgid "Identify inputs that should be inputs at all" +msgstr "Identifier les entrées qui devraient être des entrées" + +#: guix/scripts/lint.scm:917 msgid "Validate file names and availability of patches" msgstr "Valider les noms de fichiers et la disponibilité de correctifs" -#: guix/scripts/lint.scm:799 +#: guix/scripts/lint.scm:921 msgid "Validate home-page URLs" msgstr "Valider les URL des pages d'accueil" #. TRANSLATORS: <license> is the name of a data type and must not be #. translated. -#: guix/scripts/lint.scm:805 +#: guix/scripts/lint.scm:927 msgid "Make sure the 'license' field is a <license> or a list thereof" msgstr "Assurez vous que le champ « licence » est une <licence> ou une telle liste" -#: guix/scripts/lint.scm:810 +#: guix/scripts/lint.scm:932 msgid "Validate source URLs" msgstr "Valider les URL sources" -#: guix/scripts/lint.scm:814 +#: guix/scripts/lint.scm:936 +msgid "Suggest 'mirror://' URLs" +msgstr "Suggérer les URLs « mirror:// »" + +#: guix/scripts/lint.scm:940 msgid "Validate file names of sources" msgstr "Valider les noms des fichiers des sources" -#: guix/scripts/lint.scm:818 +#: guix/scripts/lint.scm:944 msgid "Report failure to compile a package to a derivation" msgstr "Signaler l'échec de la compilation d'un paquet d'une dérivation" -#: guix/scripts/lint.scm:822 +#: guix/scripts/lint.scm:948 msgid "Validate package synopses" msgstr "Valider les synopsis des paquets" -#: guix/scripts/lint.scm:826 +#: guix/scripts/lint.scm:952 msgid "Check the Common Vulnerabilities and Exposures (CVE) database" msgstr "Vérifier la base de données des vulnérabilités et failles connues (CVE)" -#: guix/scripts/lint.scm:831 +#: guix/scripts/lint.scm:957 msgid "Look for formatting issues in the source" msgstr "Rechercher des problèmes de format dans la source" -#: guix/scripts/lint.scm:859 +#: guix/scripts/lint.scm:985 msgid "" "Usage: guix lint [OPTION]... [PACKAGE]...\n" "Run a set of checkers on the specified package; if none is specified,\n" @@ -1783,7 +1895,7 @@ msgstr "" "Lancer un ensemble de vérificateurs sur le paquet spécifié; si aucun n'est spécifié,\n" "lancer les vérificateurs sur tous les paquets.\n" -#: guix/scripts/lint.scm:862 +#: guix/scripts/lint.scm:988 msgid "" "\n" " -c, --checkers=CHECKER1,CHECKER2...\n" @@ -1793,7 +1905,7 @@ msgstr "" " -c, --checkers=CHECKER1,CHECKER2...\n" " lancer uniquement les vérificateurs spécifiés" -#: guix/scripts/lint.scm:867 +#: guix/scripts/lint.scm:993 msgid "" "\n" " -l, --list-checkers display the list of available lint checkers" @@ -1801,12 +1913,12 @@ msgstr "" "\n" " -l, --list-checkers afficher la liste des vérificateurs disponibles" -#: guix/scripts/lint.scm:887 +#: guix/scripts/lint.scm:1013 #, scheme-format msgid "~a: invalid checker~%" msgstr "~a: vérificateur non valide~%" -#: guix/scripts/publish.scm:57 +#: guix/scripts/publish.scm:58 #, scheme-format msgid "" "Usage: guix publish [OPTION]...\n" @@ -1815,7 +1927,7 @@ msgstr "" "Usage: guix publish [OPTION]...\n" "Diffuser ~a via HTTP.\n" -#: guix/scripts/publish.scm:59 +#: guix/scripts/publish.scm:60 msgid "" "\n" " -p, --port=PORT listen on PORT" @@ -1823,7 +1935,7 @@ msgstr "" "\n" " -p, --port=PORT écouter sur le PORT" -#: guix/scripts/publish.scm:61 +#: guix/scripts/publish.scm:62 msgid "" "\n" " --listen=HOST listen on the network interface for HOST" @@ -1831,7 +1943,7 @@ msgstr "" "\n" " --listen=HÔTE écouter sur l'interface réseau HÔTE" -#: guix/scripts/publish.scm:63 +#: guix/scripts/publish.scm:64 msgid "" "\n" " -u, --user=USER change privileges to USER as soon as possible" @@ -1841,7 +1953,7 @@ msgstr "" " changer les privilèges de UTILISATEUR aussi vite\n" " que possible" -#: guix/scripts/publish.scm:65 +#: guix/scripts/publish.scm:66 msgid "" "\n" " -C, --compression[=LEVEL]\n" @@ -1851,7 +1963,7 @@ msgstr "" " -C, --compression[=NIVEAU]\n" " compresser les archives au NIVEAU" -#: guix/scripts/publish.scm:68 +#: guix/scripts/publish.scm:69 msgid "" "\n" " --ttl=TTL announce narinfos can be cached for TTL seconds" @@ -1860,7 +1972,7 @@ msgstr "" " --ttl=TTL les annonces narinfos peuvent être mises en cache\n" " pendant TTL secondes" -#: guix/scripts/publish.scm:70 +#: guix/scripts/publish.scm:71 msgid "" "\n" " -r, --repl[=PORT] spawn REPL server on PORT" @@ -1868,37 +1980,37 @@ msgstr "" "\n" " -r, --repl[=PORT] créer le serveur REPL sur le PORT" -#: guix/scripts/publish.scm:86 +#: guix/scripts/publish.scm:87 #, scheme-format msgid "lookup of host '~a' failed: ~a~%" msgstr "la recherche de l'hôte « ~a » a échoué: ~a~%" -#: guix/scripts/publish.scm:124 +#: guix/scripts/publish.scm:125 #, scheme-format msgid "lookup of host '~a' returned nothing" msgstr "la recherche de l'hôte « ~a » n'a rien retourné" -#: guix/scripts/publish.scm:137 +#: guix/scripts/publish.scm:138 #, scheme-format msgid "zlib support is missing; compression disabled~%" msgstr "le support zlib est manquant. La compression est désactivée~%" -#: guix/scripts/publish.scm:144 +#: guix/scripts/publish.scm:145 #, scheme-format msgid "~a: invalid duration~%" msgstr "~a: durée non valide~%" -#: guix/scripts/publish.scm:537 +#: guix/scripts/publish.scm:544 #, scheme-format msgid "user '~a' not found: ~a~%" msgstr "utilisateur « ~a » pas trouvé: ~a~%" -#: guix/scripts/publish.scm:574 +#: guix/scripts/publish.scm:581 #, scheme-format msgid "server running as root; consider using the '--user' option!~%" msgstr "le serveur tourne en tant que root. Envisagez d'utiliser l'option « --user » !~%" -#: guix/scripts/publish.scm:576 +#: guix/scripts/publish.scm:583 #, scheme-format msgid "publishing ~a on ~a, port ~d~%" msgstr "diffusion de ~a sur ~a, port ~d~%" @@ -1916,34 +2028,34 @@ msgstr "" msgid "file '~a' not found in search path ~s~%" msgstr "fichier « ~a » pas trouvé dans le chemin de recherche ~s~%" -#: guix/scripts/edit.scm:83 +#: guix/scripts/edit.scm:90 #, scheme-format msgid "source location of package '~a' is unknown~%" msgstr "l'emplacement source du paquet « ~a » est inconnue~%" -#: guix/scripts/edit.scm:96 +#: guix/scripts/edit.scm:103 #, scheme-format msgid "failed to launch '~a': ~a~%" msgstr "impossible de démarrer « ~a »: ~a~%" -#: guix/scripts/size.scm:76 +#: guix/scripts/size.scm:77 #, scheme-format msgid "no available substitute information for '~a'~%" msgstr "pas d'information de substitution disponible pour « ~a »~%" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "store item" msgstr "élément stockage" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "total" msgstr "total" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "self" msgstr "lui-même" -#: guix/scripts/size.scm:95 +#: guix/scripts/size.scm:96 #, scheme-format msgid "total: ~,1f MiB~%" msgstr "total: ~,1f MiB~%" @@ -1951,11 +2063,11 @@ msgstr "total: ~,1f MiB~%" #. TRANSLATORS: This is the title of a graph, meaning that the graph #. represents a profile of the store (the "store" being the place where #. packages are stored.) -#: guix/scripts/size.scm:206 +#: guix/scripts/size.scm:209 msgid "store profile" msgstr "profil stockage" -#: guix/scripts/size.scm:215 +#: guix/scripts/size.scm:218 msgid "" "Usage: guix size [OPTION]... PACKAGE\n" "Report the size of PACKAGE and its dependencies.\n" @@ -1963,7 +2075,7 @@ msgstr "" "Usage: guix size [OPTION]... PAQUET\n" "Rapporter la taille du PAQUET et de ses dépendances.\n" -#: guix/scripts/size.scm:220 +#: guix/scripts/size.scm:223 msgid "" "\n" " -s, --system=SYSTEM consider packages for SYSTEM--e.g., \"i686-linux\"" @@ -1971,7 +2083,7 @@ msgstr "" "\n" " -s, --system=SYSTÈME prend en compte les paquets pour le SYSTÈME, par exemple « i686-linux »" -#: guix/scripts/size.scm:222 +#: guix/scripts/size.scm:225 msgid "" "\n" " -m, --map-file=FILE write to FILE a graphical map of disk usage" @@ -1979,64 +2091,77 @@ msgstr "" "\n" " -m, --map-file=FICHIER écrit dans le FICHIER une carte graphique de l'utilisation du disque" -#: guix/scripts/size.scm:276 +#: guix/scripts/size.scm:279 msgid "missing store item argument\n" msgstr "argument d'élément de stockage manquant\n" -#: guix/scripts/graph.scm:82 +#: guix/scripts/graph.scm:83 #, scheme-format msgid "~a: invalid argument (package name expected)" msgstr "~a: argument invalide (nom de paquet attendu)" -#: guix/scripts/graph.scm:93 +#: guix/scripts/graph.scm:94 msgid "the DAG of packages, excluding implicit inputs" msgstr "le DAG des paquets en excluant les entrées implicites" -#: guix/scripts/graph.scm:150 +#: guix/scripts/graph.scm:151 msgid "the DAG of packages, including implicit inputs" msgstr "le DAG des paquets en incluant les entrées implicites" -#: guix/scripts/graph.scm:160 +#: guix/scripts/graph.scm:161 msgid "the DAG of packages and origins, including implicit inputs" msgstr "le DAG des paquets et origines en incluant les entrées implicites" -#: guix/scripts/graph.scm:191 +#: guix/scripts/graph.scm:192 msgid "same as 'bag', but without the bootstrap nodes" msgstr "comme « bag » mais sans les nœuds d'amorçage" -#: guix/scripts/graph.scm:237 +#: guix/scripts/graph.scm:238 msgid "the DAG of derivations" msgstr "le DAG des dérivations" -#: guix/scripts/graph.scm:249 +#: guix/scripts/graph.scm:250 msgid "unsupported argument for derivation graph" msgstr "argument non supporté pour le graphe de dérivation" -#: guix/scripts/graph.scm:270 +#: guix/scripts/graph.scm:276 +msgid "unsupported argument for this type of graph" +msgstr "argument non supporté pour ce type de graphe" + +#: guix/scripts/graph.scm:289 #, scheme-format msgid "references for '~a' are not known~%" msgstr "les références pour « ~a » sont inconnues~%" -#: guix/scripts/graph.scm:277 +#: guix/scripts/graph.scm:296 msgid "the DAG of run-time dependencies (store references)" msgstr "le DAG des dépendances à l'exécution (stockage des références)" -#: guix/scripts/graph.scm:290 -msgid "unsupported argument for reference graph" -msgstr "argument non supporté pour le graphe de référence" +#: guix/scripts/graph.scm:312 +msgid "the DAG of referrers in the store" +msgstr "le graphe orienté acyclique (DAG) des référents dans le stockage" -#: guix/scripts/graph.scm:315 +#: guix/scripts/graph.scm:338 #, scheme-format msgid "~a: unknown node type~%" msgstr "~a: type de nœud inconnu~%" -#: guix/scripts/graph.scm:319 +#: guix/scripts/graph.scm:345 +#, scheme-format +msgid "~a: unknown backend~%" +msgstr "~a: moteur de graphe inconnu~%" + +#: guix/scripts/graph.scm:349 msgid "The available node types are:\n" msgstr "Les types de nœuds disponibles sont:\n" +#: guix/scripts/graph.scm:359 +msgid "The available backend types are:\n" +msgstr "Les types de moteurs de graphes disponibles sont:\n" + #. TRANSLATORS: Here 'dot' is the name of a program; it must not be #. translated. -#: guix/scripts/graph.scm:355 +#: guix/scripts/graph.scm:403 msgid "" "Usage: guix graph PACKAGE...\n" "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n" @@ -2044,7 +2169,23 @@ msgstr "" "Usage: guix graph PAQUET...\n" "Produit une représentation Graphviz (dot) des dépendances de PAQUET...\n" -#: guix/scripts/graph.scm:357 +#: guix/scripts/graph.scm:405 +msgid "" +"\n" +" -b, --backend=TYPE produce a graph with the given backend TYPE" +msgstr "" +"\n" +" -t, --backend=TYPE produire un graphe avec le TYPE de moteur donné" + +#: guix/scripts/graph.scm:407 +msgid "" +"\n" +" --list-backends list the available graph backends" +msgstr "" +"\n" +" --list-backends lister les types de moteurs de graphes disponibles" + +#: guix/scripts/graph.scm:409 msgid "" "\n" " -t, --type=TYPE represent nodes of the given TYPE" @@ -2052,7 +2193,7 @@ msgstr "" "\n" " -t, --type=TYPE représenter les nœuds du TYPE donné" -#: guix/scripts/graph.scm:359 +#: guix/scripts/graph.scm:411 msgid "" "\n" " --list-types list the available graph types" @@ -2060,7 +2201,7 @@ msgstr "" "\n" " --list-types lister les types de graphes disponibles" -#: guix/scripts/graph.scm:361 +#: guix/scripts/graph.scm:413 msgid "" "\n" " -e, --expression=EXPR consider the package EXPR evaluates to" @@ -2121,18 +2262,26 @@ msgstr "" " --substitute-urls=URLS\n" " comparer les résultats de compilation avec ceux aux URLS" -#: guix/gnu-maintenance.scm:532 +#: guix/gnu-maintenance.scm:555 msgid "Updater for GNU packages" msgstr "Logiciel de mise à jour des paquets GNU" -#: guix/gnu-maintenance.scm:539 +#: guix/gnu-maintenance.scm:562 msgid "Updater for GNOME packages" msgstr "Logiciel de mise à jour des paquets GNOME" -#: guix/gnu-maintenance.scm:546 +#: guix/gnu-maintenance.scm:569 +msgid "Updater for KDE packages" +msgstr "Logiciel de mise à jour des paquets KDE" + +#: guix/gnu-maintenance.scm:576 msgid "Updater for X.org packages" msgstr "Logiciel de mise à jour des paquets X.org" +#: guix/gnu-maintenance.scm:583 +msgid "Updater for packages hosted on kernel.org" +msgstr "Logiciel de mise à jour des paquets hébergés sur kernel.org" + #: guix/scripts/container.scm:25 msgid "" "Usage: guix container ACTION ARGS...\n" @@ -2188,70 +2337,70 @@ msgstr "aucun processus ~d~%" msgid "exec failed with status ~d~%" msgstr "exec a échoué avec le statut ~d~%" -#: guix/upstream.scm:157 +#: guix/upstream.scm:212 #, scheme-format msgid "signature verification failed for `~a'~%" msgstr "la vérification de la signature a échoué pour « ~a »~%" -#: guix/upstream.scm:159 +#: guix/upstream.scm:214 #, scheme-format msgid "(could be because the public key is not in your keyring)~%" msgstr "(il est possible que la clé publique ne soit pas dans dans votre trousseau)~%" -#: guix/upstream.scm:191 +#: guix/upstream.scm:246 msgid "gz" msgstr "gz" -#: guix/upstream.scm:234 +#: guix/upstream.scm:293 #, scheme-format msgid "~a: could not locate source file" msgstr "~a: le fichier source est introuvable" -#: guix/upstream.scm:239 +#: guix/upstream.scm:298 #, scheme-format msgid "~a: ~a: no `version' field in source; skipping~%" msgstr "~a: ~a: aucun champ « version » dans la source; ignoré~%" -#: guix/ui.scm:238 +#: guix/ui.scm:239 msgid "entering debugger; type ',bt' for a backtrace\n" msgstr "entrée dans le débogueur; tapez « ,bt » pour la trace inverse\n" -#: guix/ui.scm:254 guix/ui.scm:271 +#: guix/ui.scm:255 guix/ui.scm:272 #, scheme-format msgid "failed to load '~a': ~a~%" msgstr "impossible de charger « ~a »: ~a~%" -#: guix/ui.scm:257 +#: guix/ui.scm:258 #, scheme-format msgid "~a: error: ~a~%" msgstr "~a: erreur: ~a~%" -#: guix/ui.scm:260 guix/ui.scm:529 +#: guix/ui.scm:261 guix/ui.scm:530 #, scheme-format msgid "exception thrown: ~s~%" msgstr "exception générée: ~s~%" -#: guix/ui.scm:262 guix/ui.scm:280 +#: guix/ui.scm:263 guix/ui.scm:281 #, scheme-format msgid "failed to load '~a':~%" msgstr "échec lors du chargement de « ~a »:~%" -#: guix/ui.scm:274 +#: guix/ui.scm:275 #, scheme-format msgid "~a: warning: ~a~%" msgstr "~a: avertissement: ~a~%" -#: guix/ui.scm:277 +#: guix/ui.scm:278 #, scheme-format msgid "failed to load '~a': exception thrown: ~s~%" msgstr "échec lors du chargement de « ~a »: exception générée: ~s~%" -#: guix/ui.scm:289 +#: guix/ui.scm:290 #, scheme-format msgid "failed to install locale: ~a~%" msgstr "impossible d'installer l'environnement linguistique: ~a~%" -#: guix/ui.scm:308 +#: guix/ui.scm:309 msgid "" "Copyright (C) 2016 the Guix authors\n" "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n" @@ -2267,7 +2416,7 @@ msgstr "" #. package. Please add another line saying "Report translation bugs to #. ...\n" with the address for translation bugs (typically your translation #. team's web or email address). -#: guix/ui.scm:320 +#: guix/ui.scm:321 #, scheme-format msgid "" "\n" @@ -2277,7 +2426,7 @@ msgstr "" "Signalez toute anomalie à : ~a.\n" "Signalez toute erreur de traduction à : traduc@traduc.org" -#: guix/ui.scm:322 +#: guix/ui.scm:323 #, scheme-format msgid "" "\n" @@ -2286,7 +2435,7 @@ msgstr "" "\n" "~a page d'accueil: <~a>" -#: guix/ui.scm:324 +#: guix/ui.scm:325 msgid "" "\n" "General help using GNU software: <http://www.gnu.org/gethelp/>" @@ -2294,199 +2443,199 @@ msgstr "" "\n" "Aide générale sur l'utilisation des logiciels GNU: <http://www.gnu.org/gethelp/>" -#: guix/ui.scm:369 +#: guix/ui.scm:370 #, scheme-format msgid "'~a' is not a valid regular expression: ~a~%" msgstr "« ~a » n'est pas une expression rationnelle valide: ~a~%" -#: guix/ui.scm:375 +#: guix/ui.scm:376 #, scheme-format msgid "~a: invalid number~%" msgstr "~a: nombre non valide~%" -#: guix/ui.scm:392 +#: guix/ui.scm:393 #, scheme-format msgid "invalid number: ~a~%" msgstr "nombre non valide: ~a~%" -#: guix/ui.scm:415 +#: guix/ui.scm:416 #, scheme-format msgid "unknown unit: ~a~%" msgstr "unité inconnue: ~a~%" -#: guix/ui.scm:432 +#: guix/ui.scm:433 #, scheme-format msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%" msgstr "~a:~a:~a: le paquet « ~a » a une entrée non valide: ~s~%" -#: guix/ui.scm:439 +#: guix/ui.scm:440 #, scheme-format msgid "~a: ~a: build system `~a' does not support cross builds~%" msgstr "~a: ~a: le système de compilation « ~a » ne supporte pas la compilation croisée~%" -#: guix/ui.scm:444 +#: guix/ui.scm:445 #, scheme-format msgid "profile '~a' does not exist~%" msgstr "le profile « ~a » n'existe pas~%" -#: guix/ui.scm:447 +#: guix/ui.scm:448 #, scheme-format msgid "generation ~a of profile '~a' does not exist~%" msgstr "la génération ~a du profile « ~a » n'existe pas~%" -#: guix/ui.scm:454 +#: guix/ui.scm:455 #, scheme-format msgid "corrupt input while restoring '~a' from ~s~%" msgstr "entrée corrompue en restaurant « ~a » depuis ~s~%" -#: guix/ui.scm:456 +#: guix/ui.scm:457 #, scheme-format msgid "corrupt input while restoring archive from ~s~%" msgstr "entrée corrompue en restaurant l'archive depuis ~s~%" -#: guix/ui.scm:459 +#: guix/ui.scm:460 #, scheme-format msgid "failed to connect to `~a': ~a~%" msgstr "impossible de se connecter à « ~a »: ~a~%" -#: guix/ui.scm:464 +#: guix/ui.scm:465 #, scheme-format msgid "build failed: ~a~%" msgstr "la compilation a échoué: ~a~%" -#: guix/ui.scm:467 +#: guix/ui.scm:468 #, scheme-format msgid "reference to invalid output '~a' of derivation '~a'~%" msgstr "référence à la sortie invalide « ~a » de la dérivation « ~a »~%" -#: guix/ui.scm:471 +#: guix/ui.scm:472 #, scheme-format msgid "file '~a' could not be found in these directories:~{ ~a~}~%" msgstr "le fichier « ~a » n'a pas été trouvé dans ces répertoires:~{ ~a~}~%" -#: guix/ui.scm:483 +#: guix/ui.scm:484 #, scheme-format msgid "~a: ~a~%" msgstr "~a: ~a~%" -#: guix/ui.scm:518 +#: guix/ui.scm:519 #, scheme-format msgid "failed to read expression ~s: ~s~%" msgstr "impossible de lire l'expression ~s: ~s~%" -#: guix/ui.scm:524 +#: guix/ui.scm:525 #, scheme-format msgid "failed to evaluate expression '~a':~%" msgstr "impossible d'évaluer l'expression « ~a »:~%" -#: guix/ui.scm:527 +#: guix/ui.scm:528 #, scheme-format msgid "syntax error: ~a~%" msgstr "erreur de syntaxe: ~a~%" -#: guix/ui.scm:541 +#: guix/ui.scm:542 #, scheme-format msgid "expression ~s does not evaluate to a package~%" msgstr "l'expression ~s ne correspond à aucun paquet~%" -#: guix/ui.scm:603 +#: guix/ui.scm:604 #, scheme-format msgid "~:[The following derivation would be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations would be built:~%~{ ~a~%~}~;~]" msgstr[0] "~:[La dérivation suivante serait compilée:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Les dérivations suivantes seraient compilées:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:608 +#: guix/ui.scm:609 #, scheme-format msgid "~:[The following file would be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files would be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[Le fichier suivant serait téléchargé:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Les fichiers suivants seraient téléchargés:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:614 +#: guix/ui.scm:615 #, scheme-format msgid "~:[The following derivation will be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations will be built:~%~{ ~a~%~}~;~]" msgstr[0] "~:[La dérivation suivante sera compilée:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Les dérivations suivantes seront compilées:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:619 +#: guix/ui.scm:620 #, scheme-format msgid "~:[The following file will be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files will be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[Le fichier suivant sera téléchargé:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Les fichiers suivants seront téléchargés:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:674 +#: guix/ui.scm:675 #, scheme-format msgid "The following package would be removed:~%~{~a~%~}~%" msgid_plural "The following packages would be removed:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant serait supprimé:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seraient supprimés:~%~{~a~%~}~%" -#: guix/ui.scm:679 +#: guix/ui.scm:680 #, scheme-format msgid "The following package will be removed:~%~{~a~%~}~%" msgid_plural "The following packages will be removed:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant sera supprimé:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seront supprimés:~%~{~a~%~}~%" -#: guix/ui.scm:692 +#: guix/ui.scm:693 #, scheme-format msgid "The following package would be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant serait mis à une version inférieure:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seraient mis à des versions inférieures:~%~{~a~%~}~%" -#: guix/ui.scm:697 +#: guix/ui.scm:698 #, scheme-format msgid "The following package will be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant sera mis à une version inférieure:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seront mis à des versions inférieures:~%~{~a~%~}~%" -#: guix/ui.scm:710 +#: guix/ui.scm:711 #, scheme-format msgid "The following package would be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant serait mis à jour:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seraient mis à jour:~%~{~a~%~}~%" -#: guix/ui.scm:715 +#: guix/ui.scm:716 #, scheme-format msgid "The following package will be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant sera mis à jour:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seront mis à jour:~%~{~a~%~}~%" -#: guix/ui.scm:726 +#: guix/ui.scm:727 #, scheme-format msgid "The following package would be installed:~%~{~a~%~}~%" msgid_plural "The following packages would be installed:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant serait installé:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seraient installés:~%~{~a~%~}~%" -#: guix/ui.scm:731 +#: guix/ui.scm:732 #, scheme-format msgid "The following package will be installed:~%~{~a~%~}~%" msgid_plural "The following packages will be installed:~%~{~a~%~}~%" msgstr[0] "Le paquet suivant sera installé:~%~{~a~%~}~%" msgstr[1] "Les paquets suivants seront installés:~%~{~a~%~}~%" -#: guix/ui.scm:748 +#: guix/ui.scm:749 msgid "<unknown location>" msgstr "<emplacement inconnu>" -#: guix/ui.scm:767 +#: guix/ui.scm:768 #, scheme-format msgid "failed to create configuration directory `~a': ~a~%" msgstr "impossible de créer le répertoire de configuration « ~a »: ~a~%" -#: guix/ui.scm:890 guix/ui.scm:904 +#: guix/ui.scm:891 guix/ui.scm:905 msgid "unknown" msgstr "inconnu" -#: guix/ui.scm:1062 +#: guix/ui.scm:1063 #, scheme-format msgid "Generation ~a\t~a" msgstr "Génération ~a\t~a" @@ -2494,27 +2643,27 @@ msgstr "Génération ~a\t~a" #. TRANSLATORS: The word "current" here is an adjective for #. "Generation", as in "current generation". Use the appropriate #. gender where applicable. -#: guix/ui.scm:1072 +#: guix/ui.scm:1073 #, scheme-format msgid "~a\t(current)~%" msgstr "~a\t(actuel)~%" -#: guix/ui.scm:1089 +#: guix/ui.scm:1116 #, scheme-format msgid "switched from generation ~a to ~a~%" msgstr "passé de la génération ~a à ~a~%" -#: guix/ui.scm:1105 +#: guix/ui.scm:1132 #, scheme-format msgid "deleting ~a~%" msgstr "suppression de ~a~%" -#: guix/ui.scm:1153 +#: guix/ui.scm:1163 #, scheme-format msgid "Try `guix --help' for more information.~%" msgstr "Essayez « guix --help » pour plus d'informations.~%" -#: guix/ui.scm:1180 +#: guix/ui.scm:1191 msgid "" "Usage: guix COMMAND ARGS...\n" "Run COMMAND with ARGS.\n" @@ -2522,31 +2671,31 @@ msgstr "" "Usage: guix COMMANDE ARGS...\n" "Lance la COMMANDE avec les arguments ARGS.\n" -#: guix/ui.scm:1183 +#: guix/ui.scm:1194 msgid "COMMAND must be one of the sub-commands listed below:\n" msgstr "COMMANDE doit être une des sous-commandes listées ci-dessous:\n" -#: guix/ui.scm:1203 +#: guix/ui.scm:1214 #, scheme-format msgid "guix: ~a: command not found~%" msgstr "guix: ~a: commande introuvable~%" -#: guix/ui.scm:1220 +#: guix/ui.scm:1233 #, scheme-format msgid "guix: missing command name~%" msgstr "guix: nom de commande manquant~%" -#: guix/ui.scm:1228 +#: guix/ui.scm:1241 #, scheme-format msgid "guix: unrecognized option '~a'~%" msgstr "guix: option « ~a » non reconnue ~%" -#: guix/http-client.scm:266 +#: guix/http-client.scm:270 #, scheme-format msgid "following redirection to `~a'...~%" msgstr "redirection vers « ~a »...~%" -#: guix/http-client.scm:275 +#: guix/http-client.scm:279 msgid "download failed" msgstr "le téléchargement a échoué" @@ -2720,6 +2869,9 @@ msgstr "erreur: désaccord de version de libgcrypt\n" msgid "warning: daemon is running as root, so using `--build-users-group' is highly recommended\n" msgstr "avertissement: le daemon fonctionne en tant que root, l'utilisation de « --build-users-group » est fortement recommandée\n" +#~ msgid "unsupported argument for reference graph" +#~ msgstr "argument non supporté pour le graphe de référence" + #~ msgid "looking for the latest release of GNU ~a..." #~ msgstr "recherche de la dernière version de GNU ~a..." diff --git a/po/guix/pt_BR.po b/po/guix/pt_BR.po index c4661a57f4..0c59e11d68 100644 --- a/po/guix/pt_BR.po +++ b/po/guix/pt_BR.po @@ -1,14 +1,14 @@ # Brazilian Portuguese translation of the guix # Copyright (C) 2016 Free Software Foundation, Inc. -# Copyright (C) 2016 Ludovic Courtès +# Copyright (C) 2016 Ludovic Courtès # This file is distributed under the same license as the guix package. # Rafael Fontenelle <rffontenelle@gmail.com>, 2013, 2016. msgid "" msgstr "" -"Project-Id-Version: guix 0.11.0\n" +"Project-Id-Version: guix 0.12.0\n" "Report-Msgid-Bugs-To: ludo@gnu.org\n" -"POT-Creation-Date: 2016-07-29 10:16+0200\n" -"PO-Revision-Date: 2016-11-01 17:32-0200\n" +"POT-Creation-Date: 2016-12-18 15:32+0100\n" +"PO-Revision-Date: 2016-12-18 17:13-0200\n" "Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n" "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge.net>\n" "Language: pt_BR\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Virtaal 0.7.1\n" +"X-Generator: Virtaal 1.0.0-beta1\n" "X-Bugs: Report translation errors to the Language-Team address.\n" #: gnu/packages.scm:79 @@ -49,85 +49,95 @@ msgstr "escolhendo ~a de ~a~%" msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%" msgstr "sintaxe NOME-VERSÃO obsoleta; em vez disso, use NOME@VERSÃO~%" -#: gnu/packages.scm:311 +#: gnu/packages.scm:311 guix/scripts/package.scm:272 +#, scheme-format +msgid "package '~a' has been superseded by '~a'~%" +msgstr "pacote \"~a\" foi substituído por \"~a\"~%" + +#: gnu/packages.scm:318 #, scheme-format msgid "~A: package not found for version ~a~%" msgstr "~A: pacote não encontrado para versão ~a~%" -#: gnu/packages.scm:321 +#: gnu/packages.scm:328 #, scheme-format msgid "~A: unknown package~%" msgstr "~A: pacote desconhecido~%" -#: gnu/packages.scm:349 +#: gnu/packages.scm:356 #, scheme-format msgid "package `~a' lacks output `~a'~%" msgstr "pacote \"~a\" carece de mensagem de saída \"~a\"~%" -#: gnu/services.scm:540 +#: gnu/services.scm:542 #, scheme-format msgid "no target of type '~a' for service ~s" msgstr "nenhum alvo do tipo \"~a\" para o serviço ~s" -#: gnu/services.scm:551 gnu/services.scm:612 +#: gnu/services.scm:553 gnu/services.scm:614 #, scheme-format msgid "more than one target service of type '~a'" msgstr "mais de um serviço alvo do tipo \"~a\"" -#: gnu/services.scm:602 +#: gnu/services.scm:604 #, scheme-format msgid "service of type '~a' not found" msgstr "serviço do tipo \"~a\" não localizado" -#: gnu/system.scm:500 +#: gnu/system.scm:522 #, scheme-format msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%" msgstr "usando um texto para arquivo \"~a\" está obsoleto; em vez disso, use \"plain-file\"~%" -#: gnu/system.scm:516 +#: gnu/system.scm:538 #, scheme-format msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%" msgstr "usando um valor monádico para \"~a\" está obsoleto; em vez disso, use \"plain-file\"~%" -#: gnu/system.scm:650 +#: gnu/system.scm:680 #, scheme-format msgid "~a: invalid locale name" msgstr "~a: nome de localidade inválido" -#: gnu/system.scm:770 +#: gnu/system.scm:860 +msgid "/" +msgstr "/" + +#: gnu/system.scm:862 #, scheme-format msgid "unrecognized boot parameters for '~a'~%" msgstr "parâmetros de inicialização não reconhecidos para \"~a\"~%" -#: gnu/services/shepherd.scm:162 +#: gnu/services/shepherd.scm:165 #, scheme-format msgid "service '~a' provided more than once" msgstr "serviço \"~a\" fornecido mais de uma vez" -#: gnu/services/shepherd.scm:177 +#: gnu/services/shepherd.scm:180 #, scheme-format msgid "service '~a' requires '~a', which is not provided by any service" msgstr "serviço \"~a\" requer \"~a\", o que não é fornecido por nenhum serviço" -#: gnu/system/shadow.scm:240 +#: gnu/system/shadow.scm:220 #, scheme-format msgid "supplementary group '~a' of user '~a' is undeclared" msgstr "grupo suplementar \"~a\" do usuário \"~a\" não está declarado" -#: gnu/system/shadow.scm:250 +#: gnu/system/shadow.scm:230 #, scheme-format msgid "primary group '~a' of user '~a' is undeclared" msgstr "grupo primário \"~a\" do usuário \"~a\" não está declarado" -#: guix/scripts.scm:52 +#: guix/scripts.scm:53 #, scheme-format msgid "invalid argument: ~a~%" msgstr "argumento inválido: ~a~%" -#: guix/scripts.scm:78 guix/scripts/download.scm:99 guix/scripts/gc.scm:164 -#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77 -#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:916 -#: guix/scripts/publish.scm:549 guix/scripts/graph.scm:383 +#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164 +#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77 +#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042 +#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81 +#: guix/scripts/graph.scm:436 #, scheme-format msgid "~A: unrecognized option~%" msgstr "~A: opção não reconhecida~%" @@ -137,12 +147,12 @@ msgstr "~A: opção não reconhecida~%" msgid "failed to create GC root `~a': ~a~%" msgstr "falha ao criar raiz de GC \"~a\": ~a~%" -#: guix/scripts/build.scm:198 +#: guix/scripts/build.scm:196 #, scheme-format msgid "invalid replacement specification: ~s~%" msgstr "especificação de substituição inválida: ~s~%" -#: guix/scripts/build.scm:246 +#: guix/scripts/build.scm:253 msgid "" "\n" " --with-source=SOURCE\n" @@ -152,7 +162,7 @@ msgstr "" " --with-source=FONTE\n" " usa FONTE ao compilar o pacote correspondente" -#: guix/scripts/build.scm:249 +#: guix/scripts/build.scm:256 msgid "" "\n" " --with-input=PACKAGE=REPLACEMENT\n" @@ -162,12 +172,22 @@ msgstr "" " --with-input=PACOTE=SUBSTITUIÇÃO\n" " substitui a dependência PACOTE por SUBSTITUIÇÃO" -#: guix/scripts/build.scm:274 +#: guix/scripts/build.scm:259 +msgid "" +"\n" +" --with-graft=PACKAGE=REPLACEMENT\n" +" graft REPLACEMENT on packages that refer to PACKAGE" +msgstr "" +"\n" +" --with-graft=PACOTE=SUBSTITUIÇÃO\n" +" insere SUBSTITUIÇÃO em pacotes referindo-se a PACOTE" + +#: guix/scripts/build.scm:284 #, scheme-format msgid "transformation '~a' had no effect on ~a~%" msgstr "a transformação \"~a\" não obteve efeito em ~a~%" -#: guix/scripts/build.scm:292 +#: guix/scripts/build.scm:302 msgid "" "\n" " -L, --load-path=DIR prepend DIR to the package module search path" @@ -176,7 +196,7 @@ msgstr "" " -L, --load-path=DIR insere DIR no início do caminho de pesquisa do\n" " módulo do pacote" -#: guix/scripts/build.scm:294 +#: guix/scripts/build.scm:304 msgid "" "\n" " -K, --keep-failed keep build tree of failed builds" @@ -184,7 +204,7 @@ msgstr "" "\n" " -K, --keep-failed mantém a árvore de compilado de pacotes falhos" -#: guix/scripts/build.scm:296 +#: guix/scripts/build.scm:306 msgid "" "\n" " -k, --keep-going keep going when some of the derivations fail" @@ -192,7 +212,7 @@ msgstr "" "\n" " -k, --keep-going continua mesmo se algumas das derivações falharem" -#: guix/scripts/build.scm:298 +#: guix/scripts/build.scm:308 msgid "" "\n" " -n, --dry-run do not build the derivations" @@ -200,7 +220,7 @@ msgstr "" "\n" " -n, --dry-run não compila as derivações" -#: guix/scripts/build.scm:300 +#: guix/scripts/build.scm:310 msgid "" "\n" " --fallback fall back to building when the substituter fails" @@ -208,7 +228,7 @@ msgstr "" "\n" " --fallback volta para compilação quando o substituto falhar" -#: guix/scripts/build.scm:302 +#: guix/scripts/build.scm:312 msgid "" "\n" " --no-substitutes build instead of resorting to pre-built substitutes" @@ -217,7 +237,7 @@ msgstr "" " --no-substitutes compila, em vez de recorrer a substitutos\n" " pré-construídos" -#: guix/scripts/build.scm:304 guix/scripts/size.scm:217 +#: guix/scripts/build.scm:314 guix/scripts/size.scm:220 msgid "" "\n" " --substitute-urls=URLS\n" @@ -227,7 +247,7 @@ msgstr "" " --substitute-urls=URLS\n" " obtém substituto a partir das URLS se autorizadas" -#: guix/scripts/build.scm:307 +#: guix/scripts/build.scm:317 msgid "" "\n" " --no-grafts do not graft packages" @@ -235,7 +255,7 @@ msgstr "" "\n" " --no-grafts não faz gráficos de pacotes" -#: guix/scripts/build.scm:309 +#: guix/scripts/build.scm:319 msgid "" "\n" " --no-build-hook do not attempt to offload builds via the build hook" @@ -244,7 +264,7 @@ msgstr "" " --no-build-hook não tenta descarregar compilações via hook de\n" " compilação" -#: guix/scripts/build.scm:311 +#: guix/scripts/build.scm:321 msgid "" "\n" " --max-silent-time=SECONDS\n" @@ -255,7 +275,7 @@ msgstr "" " marca a compilação como falha após transcorridos\n" " SEGUNDOS de silêncio" -#: guix/scripts/build.scm:314 +#: guix/scripts/build.scm:324 msgid "" "\n" " --timeout=SECONDS mark the build as failed after SECONDS of activity" @@ -265,7 +285,7 @@ msgstr "" " marca a compilação como falha após transcorridos\n" " SEGUNDOS de atividade" -#: guix/scripts/build.scm:316 +#: guix/scripts/build.scm:326 msgid "" "\n" " --verbosity=LEVEL use the given verbosity LEVEL" @@ -273,7 +293,7 @@ msgstr "" "\n" " --verbosity=NÍVEL usa o NÍVEL de detalhamento dado" -#: guix/scripts/build.scm:318 +#: guix/scripts/build.scm:328 msgid "" "\n" " --rounds=N build N times in a row to detect non-determinism" @@ -282,7 +302,7 @@ msgstr "" " --rounds=N compila N vezes de uma vez para detectar\n" " não determinismo" -#: guix/scripts/build.scm:320 +#: guix/scripts/build.scm:330 msgid "" "\n" " -c, --cores=N allow the use of up to N CPU cores for the build" @@ -290,7 +310,7 @@ msgstr "" "\n" " -c, --cores=N permite uso de até N núcleos de CPU para compilação" -#: guix/scripts/build.scm:322 +#: guix/scripts/build.scm:332 msgid "" "\n" " -M, --max-jobs=N allow at most N build jobs" @@ -298,12 +318,12 @@ msgstr "" "\n" " -M, --max-jobs=N permite no máximo N trabalhos de compilação" -#: guix/scripts/build.scm:428 guix/scripts/build.scm:435 +#: guix/scripts/build.scm:438 guix/scripts/build.scm:445 #, scheme-format msgid "not a number: '~a' option argument: ~a~%" msgstr "não é um número: argumento da opção \"~a\": ~a~%" -#: guix/scripts/build.scm:455 +#: guix/scripts/build.scm:465 msgid "" "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n" "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n" @@ -311,7 +331,7 @@ msgstr "" "Uso: guix build [OPÇÃO]... PACOTE-OU-DERIVAÇÃO...\n" "Compila o PACOTE-OU-DERIVAÇÃO dado e returna seus caminhos de saída.\n" -#: guix/scripts/build.scm:457 +#: guix/scripts/build.scm:467 msgid "" "\n" " -e, --expression=EXPR build the package or derivation EXPR evaluates to" @@ -319,7 +339,7 @@ msgstr "" "\n" " -e, --expression=EXPR compila o pacote ou derivação que EXPR corresponder" -#: guix/scripts/build.scm:459 +#: guix/scripts/build.scm:469 msgid "" "\n" " -f, --file=FILE build the package or derivation that the code within\n" @@ -329,7 +349,7 @@ msgstr "" " -f, --file=ARQUIVO compila o pacote ou derivação que o código dentro\n" " de ARQUIVO avaliar" -#: guix/scripts/build.scm:462 +#: guix/scripts/build.scm:472 msgid "" "\n" " -S, --source build the packages' source derivations" @@ -337,7 +357,7 @@ msgstr "" "\n" " -S, --source compila as derivações de fontes do pacote" -#: guix/scripts/build.scm:464 +#: guix/scripts/build.scm:474 msgid "" "\n" " --sources[=TYPE] build source derivations; TYPE may optionally be one\n" @@ -347,7 +367,7 @@ msgstr "" " --sources[=TIPO] compila derivações de fonte; como opção, TIPO pode\n" " um entre \"package\", \"all\" (padrão) ou \"transitive\"" -#: guix/scripts/build.scm:467 +#: guix/scripts/build.scm:477 msgid "" "\n" " -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\"" @@ -355,7 +375,7 @@ msgstr "" "\n" " -s, --system=SISTEMA tenta compilar para SISTEMA (ex.: \"i686-linux\")" -#: guix/scripts/build.scm:469 +#: guix/scripts/build.scm:479 msgid "" "\n" " --target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\"" @@ -363,7 +383,7 @@ msgstr "" "\n" " --target=TRIO compilação cruzada para TRIO (ex: \"armel-linux-gnu\")" -#: guix/scripts/build.scm:471 +#: guix/scripts/build.scm:481 msgid "" "\n" " -d, --derivations return the derivation paths of the given packages" @@ -371,7 +391,7 @@ msgstr "" "\n" " -d, --derivations retorna os caminhos de derivação dos pacotes dados" -#: guix/scripts/build.scm:473 +#: guix/scripts/build.scm:483 msgid "" "\n" " --check rebuild items to check for non-determinism issues" @@ -380,7 +400,7 @@ msgstr "" " --check recompila itens para verificar questões de\n" " não determinismo" -#: guix/scripts/build.scm:475 +#: guix/scripts/build.scm:485 msgid "" "\n" " -r, --root=FILE make FILE a symlink to the result, and register it\n" @@ -390,7 +410,7 @@ msgstr "" " -r, --root=ARQUIVO faz do ARQUIVO um link simbólico para o resultado\n" " e o registra, como um coletor de lixo" -#: guix/scripts/build.scm:478 +#: guix/scripts/build.scm:488 msgid "" "\n" " -q, --quiet do not show the build log" @@ -398,7 +418,7 @@ msgstr "" "\n" " -q, --quiet não mostra o log de compilação" -#: guix/scripts/build.scm:480 +#: guix/scripts/build.scm:490 msgid "" "\n" " --log-file return the log file names for the given derivations" @@ -407,14 +427,14 @@ msgstr "" " --log-file retorna o os nomes de arquivos de log para as\n" " derivações fornecidas" -#: guix/scripts/build.scm:487 guix/scripts/download.scm:56 -#: guix/scripts/package.scm:388 guix/scripts/gc.scm:74 -#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91 -#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83 -#: guix/scripts/substitute.scm:827 guix/scripts/system.scm:695 -#: guix/scripts/lint.scm:865 guix/scripts/publish.scm:73 -#: guix/scripts/edit.scm:44 guix/scripts/size.scm:225 -#: guix/scripts/graph.scm:364 guix/scripts/challenge.scm:182 +#: guix/scripts/build.scm:497 guix/scripts/download.scm:81 +#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74 +#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91 +#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83 +#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748 +#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74 +#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228 +#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43 msgid "" "\n" @@ -423,14 +443,14 @@ msgstr "" "\n" " -h, --help exibe esta ajuda e sai" -#: guix/scripts/build.scm:489 guix/scripts/download.scm:58 -#: guix/scripts/package.scm:390 guix/scripts/gc.scm:76 -#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93 -#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85 -#: guix/scripts/substitute.scm:829 guix/scripts/system.scm:697 -#: guix/scripts/lint.scm:869 guix/scripts/publish.scm:75 -#: guix/scripts/edit.scm:46 guix/scripts/size.scm:227 -#: guix/scripts/graph.scm:366 guix/scripts/challenge.scm:184 +#: guix/scripts/build.scm:499 guix/scripts/download.scm:83 +#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76 +#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93 +#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85 +#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750 +#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76 +#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230 +#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45 msgid "" "\n" @@ -439,7 +459,7 @@ msgstr "" "\n" " -V, --version exibe informações da versão e sai" -#: guix/scripts/build.scm:516 +#: guix/scripts/build.scm:526 #, scheme-format msgid "" "invalid argument: '~a' option argument: ~a, ~\n" @@ -448,33 +468,38 @@ msgstr "" "argumento inválido: argumento da opção \"~a\": ~a, ~\n" "deve ser um entre \"package\", \"all\" ou \"transitive\"~%" -#: guix/scripts/build.scm:563 +#: guix/scripts/build.scm:573 #, scheme-format msgid "~s: not something we can build~%" msgstr "~s: não é algo que podemos compilar~%" -#: guix/scripts/build.scm:643 +#: guix/scripts/build.scm:627 +#, scheme-format +msgid "~a: warning: package '~a' has no source~%" +msgstr "~a: aviso: pacote \"~a\" não possui fontes~%" + +#: guix/scripts/build.scm:661 #, scheme-format msgid "no build log for '~a'~%" msgstr "nenhum log de compilação para \"~a\"~%" -#: guix/scripts/download.scm:47 +#: guix/scripts/download.scm:67 msgid "" "Usage: guix download [OPTION] URL\n" -"Download the file at URL, add it to the store, and print its store path\n" -"and the hash of its contents.\n" +"Download the file at URL to the store or to the given file, and print its\n" +"file name and the hash of its contents.\n" "\n" "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n" "('hex' and 'hexadecimal' can be used as well).\n" msgstr "" "Uso: guix download [OPÇÃO] URL\n" -"Baixa o arquivo na URL, adiciona-o para o armazenamento e exibe o caminho\n" -"de seu armazenamento e o hash de seu conteúdo.\n" +"Baixa o arquivo da URL para o armazenamento ou o arquivo dado, e exibe seu\n" +"nome de arquivo e o hash de seu conteúdo.\n" "\n" "Suporte a formatos: \"nix-base32\" (padrão), \"base32\" e \"base16\"\n" "(\"hex\" e \"hexadecimal\" também podem ser usados).\n" -#: guix/scripts/download.scm:53 guix/scripts/hash.scm:51 +#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54 msgid "" "\n" " -f, --format=FMT write the hash in the given format" @@ -482,92 +507,110 @@ msgstr "" "\n" " -f, --format=FMT escreve o hash no formato FMT dado" -#: guix/scripts/download.scm:76 guix/scripts/hash.scm:76 +#: guix/scripts/download.scm:75 +msgid "" +"\n" +" --no-check-certificate\n" +" do not validate the certificate of HTTPS servers " +msgstr "" +"\n" +" --no-check-certificate\n" +" não valida o certificado de servidores HTTPS " + +#: guix/scripts/download.scm:78 +msgid "" +"\n" +" -o, --output=FILE download to FILE" +msgstr "" +"\n" +" -o, --output=ARQUIVO baixa para ARQUIVO" + +#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82 #, scheme-format msgid "unsupported hash format: ~a~%" msgstr "sem suporte ao formato de hash: ~a~%" -#: guix/scripts/download.scm:102 guix/scripts/package.scm:842 -#: guix/scripts/publish.scm:551 +#: guix/scripts/download.scm:136 guix/scripts/package.scm:879 +#: guix/scripts/publish.scm:558 #, scheme-format msgid "~A: extraneous argument~%" msgstr "~A: argumento estranho~%" -#: guix/scripts/download.scm:111 +#: guix/scripts/download.scm:144 #, scheme-format msgid "no download URI was specified~%" msgstr "nenhuma URI de download foi especificada~%" -#: guix/scripts/download.scm:113 +#: guix/scripts/download.scm:146 #, scheme-format msgid "~a: failed to parse URI~%" msgstr "~a: falha ao analisar URI~%" -#: guix/scripts/download.scm:126 +#: guix/scripts/download.scm:156 #, scheme-format msgid "~a: download failed~%" msgstr "~a: falha no download~%" -#: guix/scripts/package.scm:104 +#: guix/scripts/package.scm:107 #, scheme-format msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%" msgstr "Tente \"info '(guix) Invoking guix package'\" para mais informações.~%" -#: guix/scripts/package.scm:126 +#: guix/scripts/package.scm:129 #, scheme-format msgid "error: while creating directory `~a': ~a~%" msgstr "erro: ao criar diretório \"~a\": ~a~%" -#: guix/scripts/package.scm:130 +#: guix/scripts/package.scm:133 #, scheme-format msgid "Please create the `~a' directory, with you as the owner.~%" msgstr "Por favor, crie o diretório \"~a\", com você sendo o proprietário.~%" -#: guix/scripts/package.scm:137 +#: guix/scripts/package.scm:140 #, scheme-format msgid "error: directory `~a' is not owned by you~%" msgstr "erro: diretório \"~a\" não tem você como proprietário~%" -#: guix/scripts/package.scm:140 +#: guix/scripts/package.scm:143 #, scheme-format msgid "Please change the owner of `~a' to user ~s.~%" msgstr "Por favor, altere o proprietário d \"~a\" para o usuário ~s.~%" -#: guix/scripts/package.scm:175 +#: guix/scripts/package.scm:178 #, scheme-format msgid "not removing generation ~a, which is current~%" msgstr "não será removida a geração ~a, que é o atual~%" # geração, criação? -#: guix/scripts/package.scm:182 +#: guix/scripts/package.scm:185 #, scheme-format msgid "no matching generation~%" msgstr "nenhuma geração correspondente~%" -#: guix/scripts/package.scm:185 guix/scripts/package.scm:659 -#: guix/scripts/system.scm:502 +#: guix/scripts/package.scm:188 guix/scripts/package.scm:699 +#: guix/scripts/system.scm:549 #, scheme-format msgid "invalid syntax: ~a~%" msgstr "sintaxe inválida: ~a~%" -#: guix/scripts/package.scm:210 +#: guix/scripts/package.scm:214 #, scheme-format msgid "nothing to be done~%" msgstr "nada para ser feito~%" -#: guix/scripts/package.scm:224 +#: guix/scripts/package.scm:228 #, scheme-format msgid "~a package in profile~%" msgid_plural "~a packages in profile~%" msgstr[0] "~a pacote no perfil~%" msgstr[1] "~a pacotes no perfil~%" -#: guix/scripts/package.scm:313 +#: guix/scripts/package.scm:344 #, scheme-format msgid "The following environment variable definitions may be needed:~%" msgstr "As seguintes definições de variável de ambiente podem ser necessárias:~%" -#: guix/scripts/package.scm:329 +#: guix/scripts/package.scm:360 msgid "" "Usage: guix package [OPTION]...\n" "Install, remove, or upgrade packages in a single transaction.\n" @@ -575,7 +618,7 @@ msgstr "" "Uso: guix package [OPÇÃO]...\n" "Instala, remove ou atualiza pacotes em uma única transação.\n" -#: guix/scripts/package.scm:331 +#: guix/scripts/package.scm:362 msgid "" "\n" " -i, --install PACKAGE ...\n" @@ -585,7 +628,7 @@ msgstr "" " -i, --install PACOTE ...\n" " instala PACOTEs" -#: guix/scripts/package.scm:334 +#: guix/scripts/package.scm:365 msgid "" "\n" " -e, --install-from-expression=EXP\n" @@ -595,7 +638,7 @@ msgstr "" " -e, --install-from-expression=EXP\n" " instala o pacote que EXPR corresponder" -#: guix/scripts/package.scm:337 +#: guix/scripts/package.scm:368 msgid "" "\n" " -f, --install-from-file=FILE\n" @@ -607,7 +650,7 @@ msgstr "" " instala o pacote que o código dentro de\n" " ARQUIVO corresponder" -#: guix/scripts/package.scm:341 +#: guix/scripts/package.scm:372 msgid "" "\n" " -r, --remove PACKAGE ...\n" @@ -617,7 +660,7 @@ msgstr "" " -r, --remove PACOTE ...\n" " remove PACOTEs" -#: guix/scripts/package.scm:344 +#: guix/scripts/package.scm:375 msgid "" "\n" " -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP" @@ -626,7 +669,7 @@ msgstr "" " -u, --upgrade[=REGEXP] atualiza todos os pacotes instalados correspondendo\n" " à REGEXP" -#: guix/scripts/package.scm:346 +#: guix/scripts/package.scm:377 msgid "" "\n" " -m, --manifest=FILE create a new profile generation with the manifest\n" @@ -636,7 +679,7 @@ msgstr "" " -m, --manifest=ARQUIVO cria a geração de um novo perfil com o manifesto\n" " do ARQUIVO" -#: guix/scripts/package.scm:349 +#: guix/scripts/package.scm:380 msgid "" "\n" " --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP" @@ -644,7 +687,7 @@ msgstr "" "\n" " --do-not-upgrade[=REGEXP] não atualiza pacotes correspondente a REGEXP" -#: guix/scripts/package.scm:351 +#: guix/scripts/package.scm:382 msgid "" "\n" " --roll-back roll back to the previous generation" @@ -652,7 +695,7 @@ msgstr "" "\n" " --roll-back reverte para a geração anterior" -#: guix/scripts/package.scm:353 +#: guix/scripts/package.scm:384 msgid "" "\n" " --search-paths[=KIND]\n" @@ -662,7 +705,7 @@ msgstr "" " --search-paths[=TIPO]\n" " exibe definições necessárias de variável de ambiente" -#: guix/scripts/package.scm:356 +#: guix/scripts/package.scm:387 msgid "" "\n" " -l, --list-generations[=PATTERN]\n" @@ -672,7 +715,7 @@ msgstr "" " -l, --list-generations[=PADRÃO]\n" " lista criações correspondendo a PADRÃO" -#: guix/scripts/package.scm:359 +#: guix/scripts/package.scm:390 msgid "" "\n" " -d, --delete-generations[=PATTERN]\n" @@ -682,7 +725,7 @@ msgstr "" " -d, --delete-generations[=PADRÃO]\n" " exclui gerações correspondendo a PADRÃO" -#: guix/scripts/package.scm:362 +#: guix/scripts/package.scm:393 msgid "" "\n" " -S, --switch-generation=PATTERN\n" @@ -692,7 +735,7 @@ msgstr "" " -S, --switch-generations=PADRÃO\n" " alterna para a geração correspondendo a PADRÃO" -#: guix/scripts/package.scm:365 +#: guix/scripts/package.scm:396 msgid "" "\n" " -p, --profile=PROFILE use PROFILE instead of the user's default profile" @@ -700,7 +743,7 @@ msgstr "" "\n" " -p, --profile=PERFIL usa PERFIL em vez do perfil padrão do usuário" -#: guix/scripts/package.scm:368 +#: guix/scripts/package.scm:399 msgid "" "\n" " --bootstrap use the bootstrap Guile to build the profile" @@ -708,7 +751,7 @@ msgstr "" "\n" " --bootstrap usa a inicialização do Guile para compilar o perfil" -#: guix/scripts/package.scm:370 guix/scripts/pull.scm:76 +#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76 msgid "" "\n" " --verbose produce verbose output" @@ -716,7 +759,7 @@ msgstr "" "\n" " --verbose produz uma saída mais detalhada" -#: guix/scripts/package.scm:373 +#: guix/scripts/package.scm:404 msgid "" "\n" " -s, --search=REGEXP search in synopsis and description using REGEXP" @@ -724,7 +767,7 @@ msgstr "" "\n" " -s, --search=REGEXP pesquisa na sinopse e descrição usando REGEXP" -#: guix/scripts/package.scm:375 +#: guix/scripts/package.scm:406 msgid "" "\n" " -I, --list-installed[=REGEXP]\n" @@ -734,7 +777,7 @@ msgstr "" " -I, --list-installed[=REGEXP]\n" " lista pacotes instalados correspondentes a REGEXP" -#: guix/scripts/package.scm:378 +#: guix/scripts/package.scm:409 msgid "" "\n" " -A, --list-available[=REGEXP]\n" @@ -744,7 +787,7 @@ msgstr "" " -A, --list-available[=REGEXP]\n" " lista pacotes disponíveis correspondentes a REGEXP" -#: guix/scripts/package.scm:381 +#: guix/scripts/package.scm:412 msgid "" "\n" " --show=PACKAGE show details about PACKAGE" @@ -752,23 +795,23 @@ msgstr "" "\n" " --show=PACOTE mostra detalhes sobre o PACOTE" -#: guix/scripts/package.scm:476 +#: guix/scripts/package.scm:507 #, scheme-format msgid "~a: unsupported kind of search path~%" msgstr "~a: sem suporte ao tipo de caminho de pesquisa~%" # geração, criação? -#: guix/scripts/package.scm:755 +#: guix/scripts/package.scm:790 #, scheme-format msgid "cannot switch to generation '~a'~%" msgstr "não foi possível alternar para a geração \"~a\"~%" -#: guix/scripts/package.scm:771 +#: guix/scripts/package.scm:806 #, scheme-format msgid "would install new manifest from '~a' with ~d entries~%" msgstr "instalaria novo manifesto a partir de \"~a\" com entradas ~d~%" -#: guix/scripts/package.scm:773 +#: guix/scripts/package.scm:808 #, scheme-format msgid "installing new manifest from '~a' with ~d entries~%" msgstr "instalando novo manifesto a partir de \"~a\" com entradas ~d~%" @@ -908,7 +951,7 @@ msgstr "argumentos estranhos: ~{~a ~}~%" msgid "freed ~h bytes~%" msgstr "~h bytes liberados~%" -#: guix/scripts/hash.scm:46 +#: guix/scripts/hash.scm:47 msgid "" "Usage: guix hash [OPTION] FILE\n" "Return the cryptographic hash of FILE.\n" @@ -922,7 +965,15 @@ msgstr "" "Suporte a formatos: \"nix-base32\" (padrão), \"base32\" e \"base16\"\n" "(\"hex\" e \"hexadecimal\" também podem ser usados).\n" -#: guix/scripts/hash.scm:53 +#: guix/scripts/hash.scm:52 +msgid "" +"\n" +" -x, --exclude-vcs exclude version control directories" +msgstr "" +"\n" +" -x, --exclude-vcs exclui diretórios de controle de versão" + +#: guix/scripts/hash.scm:56 msgid "" "\n" " -r, --recursive compute the hash on FILE recursively" @@ -930,17 +981,18 @@ msgstr "" "\n" " -r, --recursive computa o hash no AQUIVO recursivamente" -#: guix/scripts/hash.scm:104 +#: guix/scripts/hash.scm:109 #, scheme-format msgid "unrecognized option: ~a~%" msgstr "opção não reconhecida: ~a~%" -#: guix/scripts/hash.scm:135 guix/ui.scm:477 +#: guix/scripts/hash.scm:152 guix/ui.scm:478 #, scheme-format msgid "~a~%" msgstr "~a~%" -#: guix/scripts/hash.scm:138 guix/scripts/system.scm:825 +#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879 +#: guix/scripts/system.scm:886 guix/scripts/system.scm:893 #, scheme-format msgid "wrong number of arguments~%" msgstr "número errado de argumentos~%" @@ -962,17 +1014,17 @@ msgstr "IMPORTADOR deve ser um dos importadores listados abaixo:\n" msgid "guix import: missing importer name~%" msgstr "guix: import: faltando o nome de um importador~%" -#: guix/scripts/import.scm:115 +#: guix/scripts/import.scm:122 #, scheme-format msgid "'~a' import failed~%" msgstr "importação de \"~a\" falhou~%" -#: guix/scripts/import.scm:116 +#: guix/scripts/import.scm:123 #, scheme-format msgid "~a: invalid importer~%" msgstr "~a: importador inválido~%" -#: guix/scripts/import/cran.scm:42 +#: guix/scripts/import/cran.scm:43 msgid "" "Usage: guix import cran PACKAGE-NAME\n" "Import and convert the CRAN package for PACKAGE-NAME.\n" @@ -980,7 +1032,7 @@ msgstr "" "Uso: guix import cran NOME-PACOTE\n" "Importa e converte o pacote CRAN para NOME-PACOTE.\n" -#: guix/scripts/import/cran.scm:44 +#: guix/scripts/import/cran.scm:45 msgid "" "\n" " -a, --archive=ARCHIVE specify the archive repository" @@ -988,17 +1040,17 @@ msgstr "" "\n" " -a, --archive=PACOTE especifica o repositório de pacote" -#: guix/scripts/import/cran.scm:94 +#: guix/scripts/import/cran.scm:108 #, scheme-format msgid "failed to download description for package '~a'~%" msgstr "falha ao baixar descrição para o pacote \"~a\"~%" -#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95 +#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95 #, scheme-format msgid "too few arguments~%" msgstr "poucos argumentos~%" -#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97 +#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97 #, scheme-format msgid "too many arguments~%" msgstr "número excessivo de argumentos~%" @@ -1100,127 +1152,127 @@ msgstr "~A: argumento inesperado~%" msgid "failed to download up-to-date source, exiting\n" msgstr "falha ao baixar fonte atualizada; saindo\n" -#: guix/scripts/substitute.scm:113 +#: guix/scripts/substitute.scm:112 #, scheme-format msgid "authentication and authorization of substitutes disabled!~%" msgstr "autenticação e autorização de substitutos desabilitado!~%" -#: guix/scripts/substitute.scm:188 +#: guix/scripts/substitute.scm:187 #, scheme-format msgid "download from '~a' failed: ~a, ~s~%" msgstr "download de \"~a\" falhou: ~a, ~s~%" -#: guix/scripts/substitute.scm:201 +#: guix/scripts/substitute.scm:200 #, scheme-format msgid "while fetching ~a: server is somewhat slow~%" msgstr "enquanto obtinha ~a: servidor está um pouco lento~%" -#: guix/scripts/substitute.scm:203 +#: guix/scripts/substitute.scm:202 #, scheme-format msgid "try `--no-substitutes' if the problem persists~%" msgstr "Tente \"--no-substitutes\" se o problema persistir~%" -#: guix/scripts/substitute.scm:219 +#: guix/scripts/substitute.scm:220 #, scheme-format msgid "unsupported substitute URI scheme: ~a~%" msgstr "sem suporte ao esquema de URI de substituto: ~a~%" -#: guix/scripts/substitute.scm:252 +#: guix/scripts/substitute.scm:254 #, scheme-format msgid "while fetching '~a': ~a (~s)~%" msgstr "enquanto obtinha \"~a\": ~a (~s)~%" -#: guix/scripts/substitute.scm:257 +#: guix/scripts/substitute.scm:259 #, scheme-format msgid "ignoring substitute server at '~s'~%" msgstr "ignorando servidor substituto em \"~s\"~%" -#: guix/scripts/substitute.scm:306 +#: guix/scripts/substitute.scm:309 #, scheme-format msgid "signature version must be a number: ~s~%" msgstr "a versão de assinatura deve ser um número: ~s~%" -#: guix/scripts/substitute.scm:310 +#: guix/scripts/substitute.scm:313 #, scheme-format msgid "unsupported signature version: ~a~%" msgstr "sem suporte à versão da assinatura: ~a~%" -#: guix/scripts/substitute.scm:318 +#: guix/scripts/substitute.scm:321 #, scheme-format msgid "signature is not a valid s-expression: ~s~%" msgstr "a assinatura não é uma expressão-s válida: ~s~%" -#: guix/scripts/substitute.scm:322 +#: guix/scripts/substitute.scm:325 #, scheme-format msgid "invalid format of the signature field: ~a~%" msgstr "formato inválido do campo de assinatura: ~a~%" -#: guix/scripts/substitute.scm:357 +#: guix/scripts/substitute.scm:360 #, scheme-format msgid "invalid signature for '~a'~%" msgstr "assinatura inválida para \"~a\"~%" -#: guix/scripts/substitute.scm:359 +#: guix/scripts/substitute.scm:362 #, scheme-format msgid "hash mismatch for '~a'~%" msgstr "hash incompatível para \"~a\"~%" -#: guix/scripts/substitute.scm:361 +#: guix/scripts/substitute.scm:364 #, scheme-format msgid "'~a' is signed with an unauthorized key~%" msgstr "\"~a\" está assinado com uma chave não autorizada~%" -#: guix/scripts/substitute.scm:363 +#: guix/scripts/substitute.scm:366 #, scheme-format msgid "signature on '~a' is corrupt~%" msgstr "a assinatura em \"~a\" está corrompida~%" -#: guix/scripts/substitute.scm:401 +#: guix/scripts/substitute.scm:404 #, scheme-format msgid "substitute at '~a' lacks a signature~%" msgstr "o substituto em \"~a\" carece de uma assinatura~%" -#: guix/scripts/substitute.scm:409 +#: guix/scripts/substitute.scm:411 #, scheme-format -msgid "~%Found valid signature for ~a~%" -msgstr "~%Localizada assinatura válida para ~a~%" +msgid "Found valid signature for ~a~%" +msgstr "Localizada assinatura válida para ~a~%" -#: guix/scripts/substitute.scm:412 +#: guix/scripts/substitute.scm:414 #, scheme-format msgid "From ~a~%" msgstr "De ~a~%" -#: guix/scripts/substitute.scm:452 +#: guix/scripts/substitute.scm:454 #, scheme-format msgid "'~a' does not name a store item~%" msgstr "\"~a\" não é o nome de um item do armazenamento~%" -#: guix/scripts/substitute.scm:596 +#: guix/scripts/substitute.scm:600 #, scheme-format msgid "updating list of substitutes from '~a'... ~5,1f%" msgstr "atualizando a lista de substitutos de \"~a\"... ~5,1f%" -#: guix/scripts/substitute.scm:646 +#: guix/scripts/substitute.scm:655 #, scheme-format msgid "~s: unsupported server URI scheme~%" msgstr "~s: sem suporte ao esquema de URI de servidor~%" -#: guix/scripts/substitute.scm:656 +#: guix/scripts/substitute.scm:665 #, scheme-format msgid "'~a' uses different store '~a'; ignoring it~%" msgstr "\"~a\" usa um armazenamento diferente \"~a\"" -#: guix/scripts/substitute.scm:801 +#: guix/scripts/substitute.scm:810 #, scheme-format msgid "host name lookup error: ~a~%" msgstr "erro na busca pelo nome da máquina: ~a~%" -#: guix/scripts/substitute.scm:806 +#: guix/scripts/substitute.scm:815 #, scheme-format msgid "TLS error in procedure '~a': ~a~%" msgstr "erro TLS no procedimento \"~a\": ~a~%" -#: guix/scripts/substitute.scm:817 +#: guix/scripts/substitute.scm:826 msgid "" "Usage: guix substitute [OPTION]...\n" "Internal tool to substitute a pre-built binary to a local build.\n" @@ -1229,7 +1281,7 @@ msgstr "" "Ferramenta interna para substituir um binário pré-compilado para\n" "uma compilação local.\n" -#: guix/scripts/substitute.scm:819 +#: guix/scripts/substitute.scm:828 msgid "" "\n" " --query report on the availability of substitutes for the\n" @@ -1240,7 +1292,7 @@ msgstr "" " nomes de arquivos de armazenamento passados na\n" " entrada padrão" -#: guix/scripts/substitute.scm:822 +#: guix/scripts/substitute.scm:831 msgid "" "\n" " --substitute STORE-FILE DESTINATION\n" @@ -1255,41 +1307,41 @@ msgstr "" #. TRANSLATORS: The second part of this message looks like #. "(4.1MiB installed)"; it shows the size of the package once #. installed. -#: guix/scripts/substitute.scm:895 +#: guix/scripts/substitute.scm:904 #, scheme-format msgid "Downloading ~a~:[~*~; (~a installed)~]...~%" msgstr "Baixando ~a~:[~*~; (~a instalado)~]...~%" -#: guix/scripts/substitute.scm:951 +#: guix/scripts/substitute.scm:961 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n" msgstr "ACL para importações de pacote parece não estar inicializado, substitutos podem estar indisponíveis\n" -#: guix/scripts/substitute.scm:1047 +#: guix/scripts/substitute.scm:1057 #, scheme-format msgid "~a: unrecognized options~%" msgstr "~a: opções desconhecidas~%" -#: guix/scripts/authenticate.scm:58 +#: guix/scripts/authenticate.scm:59 #, scheme-format msgid "cannot find public key for secret key '~a'~%" msgstr "não foi possível localizar a chave pública da chave privada \"~a\"~%" -#: guix/scripts/authenticate.scm:78 +#: guix/scripts/authenticate.scm:79 #, scheme-format msgid "error: invalid signature: ~a~%" msgstr "erro: assinatura inválida: ~a~%" -#: guix/scripts/authenticate.scm:80 +#: guix/scripts/authenticate.scm:81 #, scheme-format msgid "error: unauthorized public key: ~a~%" msgstr "erro: chave pública não autorizada: ~a~%" -#: guix/scripts/authenticate.scm:82 +#: guix/scripts/authenticate.scm:83 #, scheme-format msgid "error: corrupt signature data: ~a~%" msgstr "erro: dados de assinatura corrompidos: ~a~%" -#: guix/scripts/authenticate.scm:120 +#: guix/scripts/authenticate.scm:121 msgid "" "Usage: guix authenticate OPTION...\n" "Sign or verify the signature on the given file. This tool is meant to\n" @@ -1299,191 +1351,212 @@ msgstr "" "Assina ou verifica a assinatura no arquivo dado. Essa ferramenta é\n" "feita para ser usada internamente por \"guix-daemon\".\n" -#: guix/scripts/authenticate.scm:126 +#: guix/scripts/authenticate.scm:127 msgid "wrong arguments" msgstr "argumentos errados" -#: guix/scripts/system.scm:111 +#: guix/scripts/system.scm:109 #, scheme-format msgid "failed to register '~a' under '~a'~%" msgstr "falha ao registrar \"~a\" sob \"~a\"~%" -#: guix/scripts/system.scm:144 +#: guix/scripts/system.scm:142 #, scheme-format msgid "failed to install GRUB on device '~a'~%" msgstr "falha ao instalar GRUB no dispositivo \"~a\"~%" -#: guix/scripts/system.scm:162 +#: guix/scripts/system.scm:160 #, scheme-format msgid "initializing the current root file system~%" msgstr "inicialização do sistema de arquivos raiz atual~%" -#: guix/scripts/system.scm:176 +#: guix/scripts/system.scm:174 #, scheme-format msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%" msgstr "execução como não \"root\", então o dono de \"~a\" pode estar incorreto!~%" -#: guix/scripts/system.scm:234 +#: guix/scripts/system.scm:238 #, scheme-format msgid "while talking to shepherd: ~a~%" msgstr "enquanto falava com o shepherd: ~a~%" -#: guix/scripts/system.scm:248 +#: guix/scripts/system.scm:245 #, scheme-format msgid "service '~a' could not be found~%" msgstr "o serviço \"~a\" não pôde ser localizado~%" -#: guix/scripts/system.scm:251 +#: guix/scripts/system.scm:248 #, scheme-format msgid "service '~a' does not have an action '~a'~%" msgstr "o serviço \"~a\" não possui uma ação \"~a\"~%" -#: guix/scripts/system.scm:255 +#: guix/scripts/system.scm:252 #, scheme-format msgid "exception caught while executing '~a' on service '~a':~%" msgstr "exceção encontrada ao executar \"~a\" no serviço \"~a\":~%" -#: guix/scripts/system.scm:263 +#: guix/scripts/system.scm:260 #, scheme-format msgid "something went wrong: ~s~%" msgstr "algo deu errado: ~s~%" -#: guix/scripts/system.scm:266 +#: guix/scripts/system.scm:263 #, scheme-format msgid "shepherd error~%" msgstr "erro do shepherd~%" -#: guix/scripts/system.scm:302 +#: guix/scripts/system.scm:280 #, scheme-format msgid "failed to obtain list of shepherd services~%" msgstr "falha ao obter lista de serviços do shepherd~%" -#: guix/scripts/system.scm:322 +#: guix/scripts/system.scm:300 #, scheme-format msgid "unloading service '~a'...~%" msgstr "descarregando serviço \"~a\"...~%" -#: guix/scripts/system.scm:330 +#: guix/scripts/system.scm:308 #, scheme-format msgid "loading new services:~{ ~a~}...~%" msgstr "carregando novos serviços:~{ ~a~}...~%" -#: guix/scripts/system.scm:354 +#: guix/scripts/system.scm:332 #, scheme-format msgid "activating system...~%" msgstr "ativando sistema...~%" -#: guix/scripts/system.scm:445 +# geração, criação? +#: guix/scripts/system.scm:425 +#, scheme-format +msgid "cannot switch to system generation '~a'~%" +msgstr "não foi possível alternar para a geração do sistema \"~a\"~%" + +#: guix/scripts/system.scm:459 +#, scheme-format +msgid "failed to re-install GRUB configuration file: '~a'~%" +msgstr "falha ao reinstalar o arquivo de configuração do GRUB: \"~a\"~%" + +#: guix/scripts/system.scm:489 msgid "the DAG of services" msgstr "o DAG de serviços" -#: guix/scripts/system.scm:458 +#: guix/scripts/system.scm:502 msgid "the dependency graph of shepherd services" msgstr "o gráfico de dependência de serviços do shepherd" -#: guix/scripts/system.scm:479 +#: guix/scripts/system.scm:526 #, scheme-format msgid " file name: ~a~%" msgstr " nome de arquivo: ~a~%" -#: guix/scripts/system.scm:480 +#: guix/scripts/system.scm:527 #, scheme-format msgid " canonical file name: ~a~%" msgstr " nome de arquivo canônico: ~a~%" #. TRANSLATORS: Please preserve the two-space indentation. -#: guix/scripts/system.scm:482 +#: guix/scripts/system.scm:529 #, scheme-format msgid " label: ~a~%" msgstr " rótulo: ~a~%" -#: guix/scripts/system.scm:483 +#: guix/scripts/system.scm:530 #, scheme-format msgid " root device: ~a~%" msgstr " dispositivo raiz: ~a~%" -#: guix/scripts/system.scm:484 +#: guix/scripts/system.scm:531 #, scheme-format msgid " kernel: ~a~%" msgstr " kernel: ~a~%" -#: guix/scripts/system.scm:541 +#: guix/scripts/system.scm:588 #, scheme-format msgid "~a not found: 'guix pull' was never run~%" msgstr "~a não localizado: \"guix pull\" nunca foi executado~%" -#: guix/scripts/system.scm:542 +#: guix/scripts/system.scm:589 #, scheme-format msgid "Consider running 'guix pull' before 'reconfigure'.~%" msgstr "Considere executar \"guix pull\" antes de \"reconfigure\".~%" -#: guix/scripts/system.scm:543 +#: guix/scripts/system.scm:590 #, scheme-format msgid "Failing to do that may downgrade your system!~%" msgstr "Falhar em fazer isso pode fazer um downgrade de seu sistema!~%" -#: guix/scripts/system.scm:613 +#: guix/scripts/system.scm:661 #, scheme-format msgid "initializing operating system under '~a'...~%" msgstr "inicializando sistema operacional sob \"~a\"...~%" -#: guix/scripts/system.scm:652 +#: guix/scripts/system.scm:700 msgid "" -"Usage: guix system [OPTION] ACTION [FILE]\n" +"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n" "Build the operating system declared in FILE according to ACTION.\n" +"Some ACTIONS support additional ARGS.\n" msgstr "" -"Uso: guix system [OPÇÃO] AÇÃO [ARQUIVO]\n" +"Uso: guix system [OPÇÃO ...] AÇÃO [ARGUMENTOS ...] [ARQUIVO]\n" "Compilação do sistema operacional declarado em ARQUIVO de acordo com AÇÃO.\n" +"Algumas AÇÕES fornecem suporte adicional a ARGUMENTOS.\n" -#: guix/scripts/system.scm:655 guix/scripts/container.scm:28 +#: guix/scripts/system.scm:704 guix/scripts/container.scm:28 msgid "The valid values for ACTION are:\n" msgstr "Os valores válidos para AÇÃO são:\n" -#: guix/scripts/system.scm:657 +#: guix/scripts/system.scm:706 msgid " reconfigure switch to a new operating system configuration\n" -msgstr " reconfigure alterna para configuração de um novo sistema de arquivos\n" +msgstr " reconfigure alterna para configuração de um novo sistema operacional\n" + +#: guix/scripts/system.scm:708 +msgid " roll-back switch to the previous operating system configuration\n" +msgstr " roll-back alterna para a configuração de sistema operacional anterior\n" -#: guix/scripts/system.scm:659 +#: guix/scripts/system.scm:710 +msgid " switch-generation switch to an existing operating system configuration\n" +msgstr " switch-generation alterna para uma configuração de sistema operacional existente\n" + +#: guix/scripts/system.scm:712 msgid " list-generations list the system generations\n" msgstr " list-generations lista as gerações do sistema\n" -#: guix/scripts/system.scm:661 +#: guix/scripts/system.scm:714 msgid " build build the operating system without installing anything\n" msgstr " build compila o sistema operacional sem instalador nada\n" -#: guix/scripts/system.scm:663 +#: guix/scripts/system.scm:716 msgid " container build a container that shares the host's store\n" msgstr "" " container compila um contêiner que compartilha o armazenamento\n" " da máquina\n" -#: guix/scripts/system.scm:665 +#: guix/scripts/system.scm:718 msgid " vm build a virtual machine image that shares the host's store\n" msgstr "" " vm compila uma imagem de máquina virtual que compartilha\n" " o armazenamento da máquina\n" -#: guix/scripts/system.scm:667 +#: guix/scripts/system.scm:720 msgid " vm-image build a freestanding virtual machine image\n" msgstr " vm-image compila uma imagem de máquina virtual independente\n" -#: guix/scripts/system.scm:669 +#: guix/scripts/system.scm:722 msgid " disk-image build a disk image, suitable for a USB stick\n" msgstr " disk-image compila uma imagem de disco, adequada para pendrive USB\n" -#: guix/scripts/system.scm:671 +#: guix/scripts/system.scm:724 msgid " init initialize a root file system to run GNU\n" msgstr " init inicializa um sistema de arquivos raiz para executar GNU\n" -#: guix/scripts/system.scm:673 +#: guix/scripts/system.scm:726 msgid " extension-graph emit the service extension graph in Dot format\n" msgstr " extension-graph emite o gráfico da extensão de serviço no formato Dot\n" -#: guix/scripts/system.scm:675 +#: guix/scripts/system.scm:728 msgid " shepherd-graph emit the graph of shepherd services in Dot format\n" msgstr " shepherd-graph emite o gráfico de serviços do shepherd no formato Dot\n" -#: guix/scripts/system.scm:679 +#: guix/scripts/system.scm:732 msgid "" "\n" " -d, --derivation return the derivation of the given system" @@ -1491,7 +1564,7 @@ msgstr "" "\n" " -d, --derivation retorna a derivação do sistema dado" -#: guix/scripts/system.scm:681 +#: guix/scripts/system.scm:734 msgid "" "\n" " --on-error=STRATEGY\n" @@ -1501,7 +1574,7 @@ msgstr "" " --on-error=ESTRATÉGIA\n" " aplica ESTRATÉGIA ao ocorrer um erro ao ler ARQUIVO" -#: guix/scripts/system.scm:684 +#: guix/scripts/system.scm:737 msgid "" "\n" " --image-size=SIZE for 'vm-image', produce an image of SIZE" @@ -1509,7 +1582,7 @@ msgstr "" "\n" " --image-size=TAM para \"vm-image\", produz uma imagem de TAM" -#: guix/scripts/system.scm:686 +#: guix/scripts/system.scm:739 msgid "" "\n" " --no-grub for 'init', do not install GRUB" @@ -1517,7 +1590,7 @@ msgstr "" "\n" " --no-grub para \"init\", não instala GRUB" -#: guix/scripts/system.scm:688 +#: guix/scripts/system.scm:741 msgid "" "\n" " --share=SPEC for 'vm', share host file system according to SPEC" @@ -1526,7 +1599,7 @@ msgstr "" " --share=ESPEC para \"vm\", compartilha o sistema de arquivos do\n" " hospedeiro de acordo com ESPEC" -#: guix/scripts/system.scm:690 +#: guix/scripts/system.scm:743 msgid "" "\n" " --expose=SPEC for 'vm', expose host file system according to SPEC" @@ -1535,7 +1608,7 @@ msgstr "" " --expose=ESPEC para \"vm\", expõe o sistema de arquivos do\n" " hospedeiro de acordo com ESPEC" -#: guix/scripts/system.scm:692 +#: guix/scripts/system.scm:745 msgid "" "\n" " --full-boot for 'vm', make a full boot sequence" @@ -1544,49 +1617,64 @@ msgstr "" " --full-boot para \"vm\", faz uma sequência completa de\n" " inicialização" -#: guix/scripts/system.scm:777 +#: guix/scripts/system.scm:830 #, scheme-format msgid "no configuration file specified~%" msgstr "nenhum arquivo de configuração especificado~%" -#: guix/scripts/system.scm:840 +#: guix/scripts/system.scm:912 #, scheme-format msgid "~a: unknown action~%" msgstr "~a: ação desconhecida~%" -#: guix/scripts/system.scm:855 +#: guix/scripts/system.scm:927 #, scheme-format msgid "wrong number of arguments for action '~a'~%" msgstr "número errado de argumentos para a ação \"~a\"~%" -#: guix/scripts/system.scm:860 +#: guix/scripts/system.scm:932 #, scheme-format msgid "guix system: missing command name~%" msgstr "guix system: faltando um nome de comando~%" -#: guix/scripts/system.scm:862 +#: guix/scripts/system.scm:934 #, scheme-format msgid "Try 'guix system --help' for more information.~%" msgstr "Tente \"guix system --help\" para mais informações.~%" -#: guix/scripts/lint.scm:130 +#: guix/scripts/lint.scm:133 #, scheme-format msgid "Available checkers:~%" msgstr "Verificadores disponíveis:~%" -#: guix/scripts/lint.scm:150 +#: guix/scripts/lint.scm:157 msgid "description should not be empty" msgstr "a descrição deve não estar vazia" -#: guix/scripts/lint.scm:160 +#: guix/scripts/lint.scm:167 msgid "Texinfo markup in description is invalid" msgstr "Marcação Texinfo na descrição é inválida" -#: guix/scripts/lint.scm:168 +#: guix/scripts/lint.scm:177 +#, scheme-format +msgid "" +"description should not contain ~\n" +"trademark sign '~a' at ~d" +msgstr "" +"a descrição não deve conter ~\n" +"sinal de marca registrada \"~a\" em ~d" + +#. TRANSLATORS: '@code' is Texinfo markup and must be kept +#. as is. +#: guix/scripts/lint.scm:190 +msgid "use @code or similar ornament instead of quotes" +msgstr "use @code ou ornamento similar em vez de aspas" + +#: guix/scripts/lint.scm:197 msgid "description should start with an upper-case letter or digit" msgstr "a descrição deve iniciar com uma letra maiúscula ou dígito" -#: guix/scripts/lint.scm:184 +#: guix/scripts/lint.scm:213 #, scheme-format msgid "" "sentences in description should be followed ~\n" @@ -1595,201 +1683,225 @@ msgstr "" "sentenças nas descrição devem ser seguidas ~\n" "por dois espaços; possível infração~p em ~{~a~^, ~}" -#: guix/scripts/lint.scm:200 +#: guix/scripts/lint.scm:231 #, scheme-format msgid "invalid description: ~s" msgstr "a descrição inválida: ~s" -#: guix/scripts/lint.scm:220 +#: guix/scripts/lint.scm:256 #, scheme-format msgid "'~a' should probably be a native input" msgstr "\"~a\" provavelmente é uma entrada nativa" -#: guix/scripts/lint.scm:238 +#: guix/scripts/lint.scm:280 +#, scheme-format +msgid "'~a' should probably not be an input at all" +msgstr "\"~a\" provavelmente deve não ser uma entrada" + +#: guix/scripts/lint.scm:306 msgid "synopsis should not be empty" msgstr "a sinopse deve não estar vazia" -#: guix/scripts/lint.scm:246 +#: guix/scripts/lint.scm:314 msgid "no period allowed at the end of the synopsis" msgstr "nenhum ponto permitido ao final da sinopse" -#: guix/scripts/lint.scm:258 +#: guix/scripts/lint.scm:326 msgid "no article allowed at the beginning of the synopsis" msgstr "nenhum artigo permitido no início da sinopse" -#: guix/scripts/lint.scm:265 +#: guix/scripts/lint.scm:333 msgid "synopsis should be less than 80 characters long" msgstr "a sinopse deve ser menor que 80 caracteres" -#: guix/scripts/lint.scm:271 +#: guix/scripts/lint.scm:339 msgid "synopsis should start with an upper-case letter or digit" msgstr "a sinopse deve iniciar com uma letra maiúscula ou dígito" -#: guix/scripts/lint.scm:278 +#: guix/scripts/lint.scm:346 msgid "synopsis should not start with the package name" msgstr "a sinopse deve não iniciar com o nome do pacote" -#: guix/scripts/lint.scm:292 +#: guix/scripts/lint.scm:360 #, scheme-format msgid "invalid synopsis: ~s" msgstr "sinopse inválida: ~s" -#: guix/scripts/lint.scm:383 +#: guix/scripts/lint.scm:459 #, scheme-format msgid "URI ~a returned suspiciously small file (~a bytes)" msgstr "a URI ~a retornou um arquivo suspeitosamente pequeno (~a bytes)" -#: guix/scripts/lint.scm:392 guix/scripts/lint.scm:404 +#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480 #, scheme-format msgid "URI ~a not reachable: ~a (~s)" msgstr "a URI ~a não é alcançável: ~a (~s)" -#: guix/scripts/lint.scm:411 +#: guix/scripts/lint.scm:487 #, scheme-format msgid "URI ~a domain not found: ~a" msgstr "o domínio da URI ~a não foi localizado: ~a" -#: guix/scripts/lint.scm:419 +#: guix/scripts/lint.scm:495 #, scheme-format msgid "URI ~a unreachable: ~a" msgstr "URI ~a inalcançável: ~a" -#: guix/scripts/lint.scm:445 +#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761 +#, scheme-format +msgid "TLS certificate error: ~a" +msgstr "erro de certificado TLS: ~a" + +#: guix/scripts/lint.scm:525 msgid "invalid value for home page" msgstr "valor inválido para página inicial" -#: guix/scripts/lint.scm:448 +#: guix/scripts/lint.scm:528 #, scheme-format msgid "invalid home page URL: ~s" msgstr "URL de página inicial inválida: ~s" -#: guix/scripts/lint.scm:468 +#: guix/scripts/lint.scm:548 msgid "file names of patches should start with the package name" msgstr "nomes de arquivos de patches devem iniciar com o nome do pacote" -#: guix/scripts/lint.scm:507 +#: guix/scripts/lint.scm:587 #, scheme-format msgid "~a: ~a: proposed synopsis: ~s~%" msgstr "~a: ~a: sinopse proposta: ~s~%" -#: guix/scripts/lint.scm:520 +#: guix/scripts/lint.scm:600 #, scheme-format msgid "~a: ~a: proposed description:~% \"~a\"~%" msgstr "~a: ~a: descrição proposta:~% \"~a\"~%" -#: guix/scripts/lint.scm:557 +#: guix/scripts/lint.scm:642 msgid "all the source URIs are unreachable:" msgstr "todas as URIs fontes estão inalcançáveis:" -#: guix/scripts/lint.scm:580 +#: guix/scripts/lint.scm:665 msgid "the source file name should contain the package name" msgstr "o nome de arquivo fonte deve conter o nome do pacote" -#: guix/scripts/lint.scm:589 guix/scripts/lint.scm:593 +#: guix/scripts/lint.scm:681 +#, scheme-format +msgid "URL should be 'mirror://~a/~a'" +msgstr "a URL deve ser \"mirror://~a/~a\"" + +#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703 #, scheme-format msgid "failed to create derivation: ~a" msgstr "falha ao criar a derivação: ~a" -#: guix/scripts/lint.scm:607 +#: guix/scripts/lint.scm:717 #, scheme-format msgid "failed to create derivation: ~s~%" msgstr "falha ao criar a derivação: ~s~%" -#: guix/scripts/lint.scm:617 +#: guix/scripts/lint.scm:727 msgid "invalid license field" msgstr "campo de licença inválido" -#: guix/scripts/lint.scm:634 +#: guix/scripts/lint.scm:744 #, scheme-format msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%" msgstr "falha ao obter vulnerabilidades CVE de ~s: ~a (~s)~%" -#: guix/scripts/lint.scm:639 guix/scripts/lint.scm:647 +#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758 +#: guix/scripts/lint.scm:763 #, scheme-format msgid "assuming no CVE vulnerabilities~%" msgstr "presumindo haver nenhuma vulnerabilidade CVE~%" -#: guix/scripts/lint.scm:645 +#: guix/scripts/lint.scm:756 #, scheme-format msgid "failed to lookup NIST host: ~a~%" msgstr "falha ao procurar o servidor do NIST: ~a~%" -#: guix/scripts/lint.scm:683 +#: guix/scripts/lint.scm:801 #, scheme-format msgid "probably vulnerable to ~a" msgstr "provavelmente vulnerável a ~a" -#: guix/scripts/lint.scm:698 +#: guix/scripts/lint.scm:816 #, scheme-format msgid "tabulation on line ~a, column ~a" msgstr "tabulação na linha ~a, coluna ~a" -#: guix/scripts/lint.scm:707 +#: guix/scripts/lint.scm:825 #, scheme-format msgid "trailing white space on line ~a" msgstr "espaço ao final da linha ~a" -#: guix/scripts/lint.scm:717 +#: guix/scripts/lint.scm:835 #, scheme-format msgid "line ~a is way too long (~a characters)" msgstr "a linha ~a está grande demais (~a caracteres)" -#: guix/scripts/lint.scm:728 +#: guix/scripts/lint.scm:846 #, scheme-format msgid "line ~a: parentheses feel lonely, move to the previous or next line" msgstr "linha ~a: parênteses está solitário, mova-o para a linha anterior ou a seguinte" -#: guix/scripts/lint.scm:783 +#: guix/scripts/lint.scm:901 msgid "Validate package descriptions" msgstr "Valida descrições dos pacotes" -#: guix/scripts/lint.scm:787 +#: guix/scripts/lint.scm:905 msgid "Validate synopsis & description of GNU packages" msgstr "Valida sinopse & descrição de pacotes GNU" -#: guix/scripts/lint.scm:791 +#: guix/scripts/lint.scm:909 msgid "Identify inputs that should be native inputs" msgstr "Identifica entradas que devem ser nativas" -#: guix/scripts/lint.scm:795 +#: guix/scripts/lint.scm:913 +msgid "Identify inputs that should be inputs at all" +msgstr "Identifica entradas que devem ser entradas" + +#: guix/scripts/lint.scm:917 msgid "Validate file names and availability of patches" msgstr "Valida nomes de arquivos e disponibilidade de patches" -#: guix/scripts/lint.scm:799 +#: guix/scripts/lint.scm:921 msgid "Validate home-page URLs" msgstr "Valida URLs de site" #. TRANSLATORS: <license> is the name of a data type and must not be #. translated. -#: guix/scripts/lint.scm:805 +#: guix/scripts/lint.scm:927 msgid "Make sure the 'license' field is a <license> or a list thereof" msgstr "Certifica que o campo \"license\" é um <license> ou uma lista disto" -#: guix/scripts/lint.scm:810 +#: guix/scripts/lint.scm:932 msgid "Validate source URLs" msgstr "Valida URLs fonte" -#: guix/scripts/lint.scm:814 +#: guix/scripts/lint.scm:936 +msgid "Suggest 'mirror://' URLs" +msgstr "Sugere URLs \"mirror://\"" + +#: guix/scripts/lint.scm:940 msgid "Validate file names of sources" msgstr "Valida nomes de arquivos dos fontes" -#: guix/scripts/lint.scm:818 +#: guix/scripts/lint.scm:944 msgid "Report failure to compile a package to a derivation" msgstr "Relata falha ao compilar um pacote para uma derivação" -#: guix/scripts/lint.scm:822 +#: guix/scripts/lint.scm:948 msgid "Validate package synopses" msgstr "Valida sinopses do pacotes" -#: guix/scripts/lint.scm:826 +#: guix/scripts/lint.scm:952 msgid "Check the Common Vulnerabilities and Exposures (CVE) database" msgstr "Verifica o banco de dados de Vulnerabilidades e Exposições Comuns (CVE)" -#: guix/scripts/lint.scm:831 +#: guix/scripts/lint.scm:957 msgid "Look for formatting issues in the source" msgstr "Procura por problemas de formatação no fonte" -#: guix/scripts/lint.scm:859 +#: guix/scripts/lint.scm:985 msgid "" "Usage: guix lint [OPTION]... [PACKAGE]...\n" "Run a set of checkers on the specified package; if none is specified,\n" @@ -1799,7 +1911,7 @@ msgstr "" "Executa uma série de verificadores no pacote especificado; se nenhum\n" "for especificado, executa-os em todos pacote.\n" -#: guix/scripts/lint.scm:862 +#: guix/scripts/lint.scm:988 msgid "" "\n" " -c, --checkers=CHECKER1,CHECKER2...\n" @@ -1809,7 +1921,7 @@ msgstr "" " -c, --checkers=CHECKER1,CHECKER2...\n" " executa apenas os verificadores especificados" -#: guix/scripts/lint.scm:867 +#: guix/scripts/lint.scm:993 msgid "" "\n" " -l, --list-checkers display the list of available lint checkers" @@ -1817,12 +1929,12 @@ msgstr "" "\n" " -l, --list-checkers exibe a lista de verificações lint disponíveis" -#: guix/scripts/lint.scm:887 +#: guix/scripts/lint.scm:1013 #, scheme-format msgid "~a: invalid checker~%" msgstr "~a: verificador inválido~%" -#: guix/scripts/publish.scm:57 +#: guix/scripts/publish.scm:58 #, scheme-format msgid "" "Usage: guix publish [OPTION]...\n" @@ -1831,7 +1943,7 @@ msgstr "" "Uso: guix publish [OPÇÃO]...\n" "Publica ~a por HTTP.\n" -#: guix/scripts/publish.scm:59 +#: guix/scripts/publish.scm:60 msgid "" "\n" " -p, --port=PORT listen on PORT" @@ -1839,7 +1951,7 @@ msgstr "" "\n" " -p, --port=PORTA Ouve na PORTA" -#: guix/scripts/publish.scm:61 +#: guix/scripts/publish.scm:62 msgid "" "\n" " --listen=HOST listen on the network interface for HOST" @@ -1847,7 +1959,7 @@ msgstr "" "\n" " --listen=MÁQUINA ouve na interface de rede pela MÁQUINA" -#: guix/scripts/publish.scm:63 +#: guix/scripts/publish.scm:64 msgid "" "\n" " -u, --user=USER change privileges to USER as soon as possible" @@ -1855,7 +1967,7 @@ msgstr "" "\n" " -u, --user=USUÁRIO altera privilégios para o USUÁRIO assim que possível" -#: guix/scripts/publish.scm:65 +#: guix/scripts/publish.scm:66 msgid "" "\n" " -C, --compression[=LEVEL]\n" @@ -1866,7 +1978,7 @@ msgstr "" " comprime pacotes no NÍVEL" # Abreviei segundos para a linha caber em 80 caracteres -- Rafael -#: guix/scripts/publish.scm:68 +#: guix/scripts/publish.scm:69 msgid "" "\n" " --ttl=TTL announce narinfos can be cached for TTL seconds" @@ -1874,7 +1986,7 @@ msgstr "" "\n" " --ttl=TTL anuncia que narinfos podem usar cache por TTL segs." -#: guix/scripts/publish.scm:70 +#: guix/scripts/publish.scm:71 msgid "" "\n" " -r, --repl[=PORT] spawn REPL server on PORT" @@ -1882,37 +1994,37 @@ msgstr "" "\n" " -r, --repl[=PORTA] faz um servidor de REPL na PORTA" -#: guix/scripts/publish.scm:86 +#: guix/scripts/publish.scm:87 #, scheme-format msgid "lookup of host '~a' failed: ~a~%" msgstr "a procura da máquina \"~a\" falhou: ~a~%" -#: guix/scripts/publish.scm:124 +#: guix/scripts/publish.scm:125 #, scheme-format msgid "lookup of host '~a' returned nothing" msgstr "a procura da máquina \"~a\" retornou nada" -#: guix/scripts/publish.scm:137 +#: guix/scripts/publish.scm:138 #, scheme-format msgid "zlib support is missing; compression disabled~%" msgstr "suporte a zlib está faltando; compressão desabilitada~%" -#: guix/scripts/publish.scm:144 +#: guix/scripts/publish.scm:145 #, scheme-format msgid "~a: invalid duration~%" msgstr "~a: duração inválida~%" -#: guix/scripts/publish.scm:537 +#: guix/scripts/publish.scm:544 #, scheme-format msgid "user '~a' not found: ~a~%" msgstr "usuário \"~a\" não localizado: ~a~%" -#: guix/scripts/publish.scm:574 +#: guix/scripts/publish.scm:581 #, scheme-format msgid "server running as root; consider using the '--user' option!~%" msgstr "servidor executado como root; considere usar a opção \"--user\"!~%" -#: guix/scripts/publish.scm:576 +#: guix/scripts/publish.scm:583 #, scheme-format msgid "publishing ~a on ~a, port ~d~%" msgstr "publicando ~a em ~a, porta ~d~%" @@ -1930,34 +2042,34 @@ msgstr "" msgid "file '~a' not found in search path ~s~%" msgstr "arquivo \"~a\" não localizado no caminho de pesquisa ~s~%" -#: guix/scripts/edit.scm:83 +#: guix/scripts/edit.scm:90 #, scheme-format msgid "source location of package '~a' is unknown~%" msgstr "localização fonte de pacote \"~a\" é desconhecida~%" -#: guix/scripts/edit.scm:96 +#: guix/scripts/edit.scm:103 #, scheme-format msgid "failed to launch '~a': ~a~%" msgstr "falha ao iniciar \"~a\": ~a~%" -#: guix/scripts/size.scm:76 +#: guix/scripts/size.scm:77 #, scheme-format msgid "no available substitute information for '~a'~%" msgstr "nenhuma informação de substituto disponível para \"~a\"~%" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "store item" msgstr "item do armazenamento" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "total" msgstr "total" -#: guix/scripts/size.scm:84 +#: guix/scripts/size.scm:85 msgid "self" msgstr "próprio" -#: guix/scripts/size.scm:95 +#: guix/scripts/size.scm:96 #, scheme-format msgid "total: ~,1f MiB~%" msgstr "total: ~,1f MB~%" @@ -1965,11 +2077,11 @@ msgstr "total: ~,1f MB~%" #. TRANSLATORS: This is the title of a graph, meaning that the graph #. represents a profile of the store (the "store" being the place where #. packages are stored.) -#: guix/scripts/size.scm:206 +#: guix/scripts/size.scm:209 msgid "store profile" msgstr "perfil do armazenamento" -#: guix/scripts/size.scm:215 +#: guix/scripts/size.scm:218 msgid "" "Usage: guix size [OPTION]... PACKAGE\n" "Report the size of PACKAGE and its dependencies.\n" @@ -1977,7 +2089,7 @@ msgstr "" "Uso: guix size [OPÇÃO]... PACOTES...\n" "Relata o tamanho do PACOTE e suas dependências.\n" -#: guix/scripts/size.scm:220 +#: guix/scripts/size.scm:223 msgid "" "\n" " -s, --system=SYSTEM consider packages for SYSTEM--e.g., \"i686-linux\"" @@ -1985,7 +2097,7 @@ msgstr "" "\n" " -s, --system=SISTEMA considera pacotes para SISTEMA (ex.: \"i686-linux\")" -#: guix/scripts/size.scm:222 +#: guix/scripts/size.scm:225 msgid "" "\n" " -m, --map-file=FILE write to FILE a graphical map of disk usage" @@ -1993,64 +2105,77 @@ msgstr "" "\n" " -m, --map-file=ARQUIVO escreve para ARQUIVO um mapa gráfico do uso do disco" -#: guix/scripts/size.scm:276 +#: guix/scripts/size.scm:279 msgid "missing store item argument\n" msgstr "faltando argumento de item do armazenamento\n" -#: guix/scripts/graph.scm:82 +#: guix/scripts/graph.scm:83 #, scheme-format msgid "~a: invalid argument (package name expected)" msgstr "~a: argumento inválido (esperava-se nome de pacote)" -#: guix/scripts/graph.scm:93 +#: guix/scripts/graph.scm:94 msgid "the DAG of packages, excluding implicit inputs" msgstr "o DAG dos pacotes, excluindo entradas implícitas" -#: guix/scripts/graph.scm:150 +#: guix/scripts/graph.scm:151 msgid "the DAG of packages, including implicit inputs" msgstr "o DAG dos pacotes, incluindo entradas implícitas" -#: guix/scripts/graph.scm:160 +#: guix/scripts/graph.scm:161 msgid "the DAG of packages and origins, including implicit inputs" msgstr "o DAG dos pacotes e origens, incluindo entradas implícitas" -#: guix/scripts/graph.scm:191 +#: guix/scripts/graph.scm:192 msgid "same as 'bag', but without the bootstrap nodes" msgstr "mesmo que \"bag\", mas sem o nós de inicialização" -#: guix/scripts/graph.scm:237 +#: guix/scripts/graph.scm:238 msgid "the DAG of derivations" msgstr "o DAG de derivações" -#: guix/scripts/graph.scm:249 +#: guix/scripts/graph.scm:250 msgid "unsupported argument for derivation graph" msgstr "sem suporte ao argumento para gráfico de derivação" -#: guix/scripts/graph.scm:270 +#: guix/scripts/graph.scm:276 +msgid "unsupported argument for this type of graph" +msgstr "sem suporte ao argumento para esse tipo de gráfico" + +#: guix/scripts/graph.scm:289 #, scheme-format msgid "references for '~a' are not known~%" msgstr "referências para \"~a\" não são conhecidas~%" -#: guix/scripts/graph.scm:277 +#: guix/scripts/graph.scm:296 msgid "the DAG of run-time dependencies (store references)" msgstr "o DAG de dependências de tempo real (referências de armazenamento)" -#: guix/scripts/graph.scm:290 -msgid "unsupported argument for reference graph" -msgstr "sem suporte ao argumento para gráfico de referência" +#: guix/scripts/graph.scm:312 +msgid "the DAG of referrers in the store" +msgstr "o DAG de referências no armazenamento" -#: guix/scripts/graph.scm:315 +#: guix/scripts/graph.scm:338 #, scheme-format msgid "~a: unknown node type~%" msgstr "~a: tipo de nó desconhecido~%" -#: guix/scripts/graph.scm:319 +#: guix/scripts/graph.scm:345 +#, scheme-format +msgid "~a: unknown backend~%" +msgstr "~a: backend desconhecido~%" + +#: guix/scripts/graph.scm:349 msgid "The available node types are:\n" msgstr "Os tipos de nós disponíveis são:\n" +#: guix/scripts/graph.scm:359 +msgid "The available backend types are:\n" +msgstr "Os tipos de backends disponíveis são:\n" + #. TRANSLATORS: Here 'dot' is the name of a program; it must not be #. translated. -#: guix/scripts/graph.scm:355 +#: guix/scripts/graph.scm:403 msgid "" "Usage: guix graph PACKAGE...\n" "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n" @@ -2058,7 +2183,23 @@ msgstr "" "Uso: guix graph PACOTE...\n" "Emite uma representação em Graphviz (dot) das dependências do PACOTE...\n" -#: guix/scripts/graph.scm:357 +#: guix/scripts/graph.scm:405 +msgid "" +"\n" +" -b, --backend=TYPE produce a graph with the given backend TYPE" +msgstr "" +"\n" +" -b, --backend=TIPO produz um grafo com backend do tipo TIPO" + +#: guix/scripts/graph.scm:407 +msgid "" +"\n" +" --list-backends list the available graph backends" +msgstr "" +"\n" +" --list-backends lista os backends de gráficos disponíveis" + +#: guix/scripts/graph.scm:409 msgid "" "\n" " -t, --type=TYPE represent nodes of the given TYPE" @@ -2066,7 +2207,7 @@ msgstr "" "\n" " -t, --type=TIPO representa nós do TIPO dado" -#: guix/scripts/graph.scm:359 +#: guix/scripts/graph.scm:411 msgid "" "\n" " --list-types list the available graph types" @@ -2074,7 +2215,7 @@ msgstr "" "\n" " --list-types lista os tipos de gráficos disponíveis" -#: guix/scripts/graph.scm:361 +#: guix/scripts/graph.scm:413 msgid "" "\n" " -e, --expression=EXPR consider the package EXPR evaluates to" @@ -2135,18 +2276,26 @@ msgstr "" " --substitute-urls=URLS\n" " compara resultados da compilação com os de URLS" -#: guix/gnu-maintenance.scm:532 +#: guix/gnu-maintenance.scm:555 msgid "Updater for GNU packages" msgstr "Atualizador para pacotes GNU" -#: guix/gnu-maintenance.scm:539 +#: guix/gnu-maintenance.scm:562 msgid "Updater for GNOME packages" msgstr "Atualizador para pacotes GNOME" -#: guix/gnu-maintenance.scm:546 +#: guix/gnu-maintenance.scm:569 +msgid "Updater for KDE packages" +msgstr "Atualizador para pacotes KDE" + +#: guix/gnu-maintenance.scm:576 msgid "Updater for X.org packages" msgstr "Atualizador para pacotes X.org" +#: guix/gnu-maintenance.scm:583 +msgid "Updater for packages hosted on kernel.org" +msgstr "Atualizador para pacotes hospedados no kernel.org" + #: guix/scripts/container.scm:25 msgid "" "Usage: guix container ACTION ARGS...\n" @@ -2202,70 +2351,70 @@ msgstr "processo inexistente ~d~%" msgid "exec failed with status ~d~%" msgstr "execução falhou com status ~d~%" -#: guix/upstream.scm:157 +#: guix/upstream.scm:212 #, scheme-format msgid "signature verification failed for `~a'~%" msgstr "verificação de assinatura falhou para \"~a\"~%" -#: guix/upstream.scm:159 +#: guix/upstream.scm:214 #, scheme-format msgid "(could be because the public key is not in your keyring)~%" msgstr "(pode ser porque a chave pública não está no seu chaveiro)~%" -#: guix/upstream.scm:191 +#: guix/upstream.scm:246 msgid "gz" msgstr "gz" -#: guix/upstream.scm:234 +#: guix/upstream.scm:293 #, scheme-format msgid "~a: could not locate source file" msgstr "~a: não foi possível localizar um arquivo fonte" -#: guix/upstream.scm:239 +#: guix/upstream.scm:298 #, scheme-format msgid "~a: ~a: no `version' field in source; skipping~%" msgstr "~a: ~a: sem o campo \"version\" no fonte; pulando~%" -#: guix/ui.scm:238 +#: guix/ui.scm:239 msgid "entering debugger; type ',bt' for a backtrace\n" msgstr "entrando no depurador; digite \",bt\" para o \"backtrace\"\n" -#: guix/ui.scm:254 guix/ui.scm:271 +#: guix/ui.scm:255 guix/ui.scm:272 #, scheme-format msgid "failed to load '~a': ~a~%" msgstr "falha ao carregar \"~a\": ~a~%" -#: guix/ui.scm:257 +#: guix/ui.scm:258 #, scheme-format msgid "~a: error: ~a~%" msgstr "~a: erro: ~a~%" -#: guix/ui.scm:260 guix/ui.scm:529 +#: guix/ui.scm:261 guix/ui.scm:530 #, scheme-format msgid "exception thrown: ~s~%" msgstr "excepção lançada: ~s~%" -#: guix/ui.scm:262 guix/ui.scm:280 +#: guix/ui.scm:263 guix/ui.scm:281 #, scheme-format msgid "failed to load '~a':~%" msgstr "falha ao carregar \"~a\":~%" -#: guix/ui.scm:274 +#: guix/ui.scm:275 #, scheme-format msgid "~a: warning: ~a~%" msgstr "~a: aviso: ~a~%" -#: guix/ui.scm:277 +#: guix/ui.scm:278 #, scheme-format msgid "failed to load '~a': exception thrown: ~s~%" msgstr "falha ao carregar \"~a\": exceção lançada: ~s~%" -#: guix/ui.scm:289 +#: guix/ui.scm:290 #, scheme-format msgid "failed to install locale: ~a~%" msgstr "falha ao instalar localidade: ~a~%" -#: guix/ui.scm:308 +#: guix/ui.scm:309 msgid "" "Copyright (C) 2016 the Guix authors\n" "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n" @@ -2281,7 +2430,7 @@ msgstr "" #. package. Please add another line saying "Report translation bugs to #. ...\n" with the address for translation bugs (typically your translation #. team's web or email address). -#: guix/ui.scm:320 +#: guix/ui.scm:321 #, scheme-format msgid "" "\n" @@ -2290,7 +2439,7 @@ msgstr "" "\n" "Relate erros para: ~a." -#: guix/ui.scm:322 +#: guix/ui.scm:323 #, scheme-format msgid "" "\n" @@ -2299,7 +2448,7 @@ msgstr "" "\n" "Site do ~a: <~a>" -#: guix/ui.scm:324 +#: guix/ui.scm:325 msgid "" "\n" "General help using GNU software: <http://www.gnu.org/gethelp/>" @@ -2307,199 +2456,199 @@ msgstr "" "\n" "Ajuda em geral usando softwares GNU: <http://www.gnu.org/gethelp/>" -#: guix/ui.scm:369 +#: guix/ui.scm:370 #, scheme-format msgid "'~a' is not a valid regular expression: ~a~%" msgstr "\"~a\" não é uma expressão regular válida: ~a~%" -#: guix/ui.scm:375 +#: guix/ui.scm:376 #, scheme-format msgid "~a: invalid number~%" msgstr "~a: número inválido~%" -#: guix/ui.scm:392 +#: guix/ui.scm:393 #, scheme-format msgid "invalid number: ~a~%" msgstr "número inválido: ~a~%" -#: guix/ui.scm:415 +#: guix/ui.scm:416 #, scheme-format msgid "unknown unit: ~a~%" msgstr "unidade desconhecida: ~a~%" -#: guix/ui.scm:432 +#: guix/ui.scm:433 #, scheme-format msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%" msgstr "~a:~a:~a: o pacote \"~a\" tem uma entrada inválida: ~s~%" -#: guix/ui.scm:439 +#: guix/ui.scm:440 #, scheme-format msgid "~a: ~a: build system `~a' does not support cross builds~%" msgstr "~a: ~a: o sistema de compilação de \"~a\" não oferece suporte a compilações cruzadas~%" -#: guix/ui.scm:444 +#: guix/ui.scm:445 #, scheme-format msgid "profile '~a' does not exist~%" msgstr "o perfil \"~a\" não existe~%" -#: guix/ui.scm:447 +#: guix/ui.scm:448 #, scheme-format msgid "generation ~a of profile '~a' does not exist~%" msgstr "a geração ~a do perfil \"~a\" não existe~%" -#: guix/ui.scm:454 +#: guix/ui.scm:455 #, scheme-format msgid "corrupt input while restoring '~a' from ~s~%" msgstr "entrada corrompida ao restaurar \"~a\" de ~s~%" -#: guix/ui.scm:456 +#: guix/ui.scm:457 #, scheme-format msgid "corrupt input while restoring archive from ~s~%" msgstr "entrada corrompida ao restaurar um pacote de ~s~%" -#: guix/ui.scm:459 +#: guix/ui.scm:460 #, scheme-format msgid "failed to connect to `~a': ~a~%" msgstr "falha ao conectar em \"~a\": ~a~%" -#: guix/ui.scm:464 +#: guix/ui.scm:465 #, scheme-format msgid "build failed: ~a~%" msgstr "compilação falhou: ~a~%" -#: guix/ui.scm:467 +#: guix/ui.scm:468 #, scheme-format msgid "reference to invalid output '~a' of derivation '~a'~%" msgstr "referência a uma saída inválida \"~a\" da derivação \"~a\"~%" -#: guix/ui.scm:471 +#: guix/ui.scm:472 #, scheme-format msgid "file '~a' could not be found in these directories:~{ ~a~}~%" msgstr "o arquivo \"~a\" não pôde ser localizado nesses diretórios:~{ ~a~}~%" -#: guix/ui.scm:483 +#: guix/ui.scm:484 #, scheme-format msgid "~a: ~a~%" msgstr "~a: ~a~%" -#: guix/ui.scm:518 +#: guix/ui.scm:519 #, scheme-format msgid "failed to read expression ~s: ~s~%" msgstr "falha ao ler a expressão ~s: ~s~%" -#: guix/ui.scm:524 +#: guix/ui.scm:525 #, scheme-format msgid "failed to evaluate expression '~a':~%" msgstr "falha ao avaliar a expressão \"~a\":~%" -#: guix/ui.scm:527 +#: guix/ui.scm:528 #, scheme-format msgid "syntax error: ~a~%" msgstr "erro de sintaxe: ~a~%" -#: guix/ui.scm:541 +#: guix/ui.scm:542 #, scheme-format msgid "expression ~s does not evaluate to a package~%" msgstr "a expressão ~s não corresponde a um pacote~%" -#: guix/ui.scm:603 +#: guix/ui.scm:604 #, scheme-format msgid "~:[The following derivation would be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations would be built:~%~{ ~a~%~}~;~]" msgstr[0] "~:[A seguinte derivação seria compilada:~%~{ ~a~%~}~;~]" msgstr[1] "~:[As seguintes derivações seriam compiladas:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:608 +#: guix/ui.scm:609 #, scheme-format msgid "~:[The following file would be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files would be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[O seguinte arquivo seria baixado:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Os seguintes arquivos seriam baixados:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:614 +#: guix/ui.scm:615 #, scheme-format msgid "~:[The following derivation will be built:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following derivations will be built:~%~{ ~a~%~}~;~]" msgstr[0] "~:[A seguinte derivação será compilada:~%~{ ~a~%~}~;~]" msgstr[1] "~:[As seguintes derivações serão compiladas:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:619 +#: guix/ui.scm:620 #, scheme-format msgid "~:[The following file will be downloaded:~%~{ ~a~%~}~;~]" msgid_plural "~:[The following files will be downloaded:~%~{ ~a~%~}~;~]" msgstr[0] "~:[O seguinte arquivo será baixado:~%~{ ~a~%~}~;~]" msgstr[1] "~:[Os seguintes arquivos serão baixados:~%~{ ~a~%~}~;~]" -#: guix/ui.scm:674 +#: guix/ui.scm:675 #, scheme-format msgid "The following package would be removed:~%~{~a~%~}~%" msgid_plural "The following packages would be removed:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote seria removido:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes seriam removidos:~%~{~a~%~}~%" -#: guix/ui.scm:679 +#: guix/ui.scm:680 #, scheme-format msgid "The following package will be removed:~%~{~a~%~}~%" msgid_plural "The following packages will be removed:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote será removido:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes serão removidos:~%~{~a~%~}~%" -#: guix/ui.scm:692 +#: guix/ui.scm:693 #, scheme-format msgid "The following package would be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote sofreria um downgrade:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes sofreriam um downgrade:~%~{~a~%~}~%" -#: guix/ui.scm:697 +#: guix/ui.scm:698 #, scheme-format msgid "The following package will be downgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote sofrerá um downgrade:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes sofrerão um downgrade:~%~{~a~%~}~%" -#: guix/ui.scm:710 +#: guix/ui.scm:711 #, scheme-format msgid "The following package would be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote seria atualizado:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes seriam atualizados:~%~{~a~%~}~%" -#: guix/ui.scm:715 +#: guix/ui.scm:716 #, scheme-format msgid "The following package will be upgraded:~%~{~a~%~}~%" msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote será atualizado:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes serão atualizados:~%~{~a~%~}~%" -#: guix/ui.scm:726 +#: guix/ui.scm:727 #, scheme-format msgid "The following package would be installed:~%~{~a~%~}~%" msgid_plural "The following packages would be installed:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote seria instalado:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes seriam instalados:~%~{~a~%~}~%" -#: guix/ui.scm:731 +#: guix/ui.scm:732 #, scheme-format msgid "The following package will be installed:~%~{~a~%~}~%" msgid_plural "The following packages will be installed:~%~{~a~%~}~%" msgstr[0] "O seguinte pacote será instalado:~%~{~a~%~}~%" msgstr[1] "Os seguintes pacotes serão instalados:~%~{~a~%~}~%" -#: guix/ui.scm:748 +#: guix/ui.scm:749 msgid "<unknown location>" msgstr "<local desconhecido>" -#: guix/ui.scm:767 +#: guix/ui.scm:768 #, scheme-format msgid "failed to create configuration directory `~a': ~a~%" msgstr "falha ao criar o diretório de compilação \"~a\": ~a~%" -#: guix/ui.scm:890 guix/ui.scm:904 +#: guix/ui.scm:891 guix/ui.scm:905 msgid "unknown" msgstr "desconhecido" -#: guix/ui.scm:1062 +#: guix/ui.scm:1063 #, scheme-format msgid "Generation ~a\t~a" msgstr "Geração ~a\t~a" @@ -2507,28 +2656,28 @@ msgstr "Geração ~a\t~a" #. TRANSLATORS: The word "current" here is an adjective for #. "Generation", as in "current generation". Use the appropriate #. gender where applicable. -#: guix/ui.scm:1072 +#: guix/ui.scm:1073 #, scheme-format msgid "~a\t(current)~%" msgstr "~a\t(atual)~%" # geração, criação? -#: guix/ui.scm:1089 +#: guix/ui.scm:1116 #, scheme-format msgid "switched from generation ~a to ~a~%" msgstr "trocado da geração ~a para ~a~%" -#: guix/ui.scm:1105 +#: guix/ui.scm:1132 #, scheme-format msgid "deleting ~a~%" msgstr "excluindo ~a~%" -#: guix/ui.scm:1153 +#: guix/ui.scm:1163 #, scheme-format msgid "Try `guix --help' for more information.~%" msgstr "Tente \"guix --help\" para mais informações.~%" -#: guix/ui.scm:1180 +#: guix/ui.scm:1191 msgid "" "Usage: guix COMMAND ARGS...\n" "Run COMMAND with ARGS.\n" @@ -2536,31 +2685,31 @@ msgstr "" "Uso: guix COMANDO ARGUMENTOS...\n" "Executa COMANDO com ARGUMENTOS.\n" -#: guix/ui.scm:1183 +#: guix/ui.scm:1194 msgid "COMMAND must be one of the sub-commands listed below:\n" msgstr "COMANDO deve ser um dos subcomandos listados abaixo:\n" -#: guix/ui.scm:1203 +#: guix/ui.scm:1214 #, scheme-format msgid "guix: ~a: command not found~%" msgstr "guix: ~a: comando não encontrado~%" -#: guix/ui.scm:1220 +#: guix/ui.scm:1233 #, scheme-format msgid "guix: missing command name~%" msgstr "guix: faltando um nome de comando~%" -#: guix/ui.scm:1228 +#: guix/ui.scm:1241 #, scheme-format msgid "guix: unrecognized option '~a'~%" msgstr "guix: opção \"~a\" desconhecida~%" -#: guix/http-client.scm:266 +#: guix/http-client.scm:270 #, scheme-format msgid "following redirection to `~a'...~%" msgstr "seguindo redirecionamento para \"~a\"...~%" -#: guix/http-client.scm:275 +#: guix/http-client.scm:279 msgid "download failed" msgstr "download falhou" @@ -2734,6 +2883,9 @@ msgstr "erro: versão do libgcrypt não confere\n" msgid "warning: daemon is running as root, so using `--build-users-group' is highly recommended\n" msgstr "aviso: daemon está sendo executado como root, então o uso de \"--build-users-group\" é fortemente recomendado\n" +#~ msgid "unsupported argument for reference graph" +#~ msgstr "sem suporte ao argumento para gráfico de referência" + #~ msgid "Hello, GNU world: An example GNU package" #~ msgstr "Olá, mundo GNU: Um exemplo de pacote GNU" @@ -3131,9 +3283,6 @@ msgstr "aviso: daemon está sendo executado como root, então o uso de \"--build #~ "são armazenados como uma sequência de registros, cada registro contendo um\n" #~ "número arbitrário de campos nomeados." -#~ msgid "package `~a' has no source~%" -#~ msgstr "pacote \"~a\" não possui fontes~%" - #~ msgid "~a: not a number~%" #~ msgstr "~a: não é um número~%" diff --git a/po/packages/POTFILES.in b/po/packages/POTFILES.in index 7aaf923e9b..749bd1b24e 100644 --- a/po/packages/POTFILES.in +++ b/po/packages/POTFILES.in @@ -12,10 +12,8 @@ gnu/packages/compression.scm gnu/packages/databases.scm gnu/packages/debug.scm gnu/packages/dejagnu.scm -gnu/packages/feh.scm gnu/packages/games.scm gnu/packages/gcc.scm -gnu/packages/geeqie.scm gnu/packages/gettext.scm gnu/packages/gimp.scm gnu/packages/gnome.scm @@ -24,6 +22,7 @@ gnu/packages/gtk.scm gnu/packages/guile.scm gnu/packages/imagemagick.scm gnu/packages/image.scm +gnu/packages/image-viewers.scm gnu/packages/inkscape.scm gnu/packages/jemalloc.scm gnu/packages/key-mon.scm diff --git a/po/packages/da.po b/po/packages/da.po index fae57bca19..286ea70577 100644 --- a/po/packages/da.po +++ b/po/packages/da.po @@ -3,22 +3,22 @@ # This file is distributed under the same license as the guix package. # Joe Hansen <joedalton2@yahoo.dk>, 2015, 2016. # -#: gnu/packages/databases.scm:626 msgid "" msgstr "" -"Project-Id-Version: guix-packages 0.9.1\n" +"Project-Id-Version: guix-packages 0.12.0\n" "Report-Msgid-Bugs-To: ludo@gnu.org\n" -"POT-Creation-Date: 2016-03-04 16:52+0100\n" -"PO-Revision-Date: 2016-03-27 19:30+01:00\n" +"POT-Creation-Date: 2016-12-18 15:32+0100\n" +"PO-Revision-Date: 2016-12-18 19:30+01:00\n" "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: gnu/packages/abiword.scm:101 +#: gnu/packages/abiword.scm:110 msgid "Word processing program" msgstr "Tekstbehandlingsprogram" @@ -26,7 +26,7 @@ msgstr "Tekstbehandlingsprogram" #. descriptions may occasionally include Texinfo markup. Texinfo markup #. looks like "@code{rm -rf}", "@emph{important}", etc. When translating, #. please leave markup as is. -#: gnu/packages/abiword.scm:110 +#: gnu/packages/abiword.scm:119 msgid "" "AbiWord is a word processing program. It is rapidly\n" "becoming a state of the art word processor, with lots of features useful for\n" @@ -37,11 +37,11 @@ msgstr "" "som kan bruges i dit daglige arbejde, personlige behov, eller bare\n" "god gammeldags skrivning." -#: gnu/packages/aspell.scm:53 gnu/packages/libreoffice.scm:616 +#: gnu/packages/aspell.scm:57 gnu/packages/libreoffice.scm:644 msgid "Spell checker" msgstr "Stavekontrol" -#: gnu/packages/aspell.scm:55 +#: gnu/packages/aspell.scm:59 msgid "" "Aspell is a spell-checker which can be used either as a library or as\n" "a standalone program. Notable features of Aspell include its full support of\n" @@ -53,15 +53,15 @@ msgstr "" "fulde understøttelse af dokumenter skrivet i UTF-8-kodning og dets evne\n" "til at bruge flere ordbøger, inklusive personlige." -#: gnu/packages/aspell.scm:95 +#: gnu/packages/aspell.scm:99 msgid "This package provides a dictionary for the GNU Aspell spell checker." msgstr "Denne pakke tilbyder en ordbog for stavekontrollen GNU Aspell." -#: gnu/packages/audio.scm:96 +#: gnu/packages/audio.scm:123 msgid "Realtime modular synthesizer and effect processor" msgstr "" -#: gnu/packages/audio.scm:98 +#: gnu/packages/audio.scm:125 msgid "" "AlsaModularSynth is a digital implementation of a classical analog\n" "modular synthesizer system. It uses virtual control voltages to control the\n" @@ -70,11 +70,11 @@ msgid "" "Filter) modules follow the convention of 1V / Octave." msgstr "" -#: gnu/packages/audio.scm:135 +#: gnu/packages/audio.scm:162 msgid "Library for audio labelling" msgstr "" -#: gnu/packages/audio.scm:137 +#: gnu/packages/audio.scm:164 msgid "" "aubio is a tool designed for the extraction of annotations from audio\n" "signals. Its features include segmenting a sound file before each of its\n" @@ -82,22 +82,22 @@ msgid "" "streams from live audio." msgstr "" -#: gnu/packages/audio.scm:229 +#: gnu/packages/audio.scm:260 msgid "Digital audio workstation" msgstr "" -#: gnu/packages/audio.scm:231 +#: gnu/packages/audio.scm:262 msgid "" "Ardour is a multi-channel digital audio workstation, allowing users to\n" "record, edit, mix and master audio and MIDI projects. It is targeted at audio\n" "engineers, musicians, soundtrack editors and composers." msgstr "" -#: gnu/packages/audio.scm:263 +#: gnu/packages/audio.scm:297 msgid "Tonewheel organ synthesizer" msgstr "" -#: gnu/packages/audio.scm:265 +#: gnu/packages/audio.scm:299 msgid "" "AZR-3 is a port of the free VST plugin AZR-3. It is a tonewheel organ\n" "with drawbars, distortion and rotating speakers. The organ has three\n" @@ -106,11 +106,11 @@ msgid "" "plugins are provided." msgstr "" -#: gnu/packages/audio.scm:302 +#: gnu/packages/audio.scm:336 msgid "Audio plug-in pack for LV2 and JACK environments" -msgstr "" +msgstr "Lydudvidelsesmpakke for LV2- og JACK-miljøer" -#: gnu/packages/audio.scm:304 +#: gnu/packages/audio.scm:338 msgid "" "Calf Studio Gear is an audio plug-in pack for LV2 and JACK environments.\n" "The suite contains lots of effects (delay, modulation, signal processing,\n" @@ -119,31 +119,174 @@ msgid "" "tools (analyzer, mono/stereo tools, crossovers)." msgstr "" -#: gnu/packages/audio.scm:347 -msgid "Sound and music computing system" +#: gnu/packages/audio.scm:390 +msgid "Software speech synthesizer" +msgstr "Programsynthesizer for tale" + +#: gnu/packages/audio.scm:391 +msgid "" +"eSpeak is a software speech synthesizer for English and\n" +"other languages. eSpeak uses a \"formant synthesis\" method. This allows many\n" +"languages to be provided in a small size. The speech is clear, and can be used\n" +"at high speeds, but is not as natural or smooth as larger synthesizers which are\n" +"based on human speech recordings." +msgstr "" + +#: gnu/packages/audio.scm:438 +msgid "LV2 plugins for live use" +msgstr "LV2-udvidelsesmoduler for live brug" + +#: gnu/packages/audio.scm:440 +msgid "" +"The infamous plugins are a collection of LV2 audio plugins for live\n" +"performances. The plugins include a cellular automaton synthesizer, an\n" +"envelope follower, distortion effects, tape effects and more." +msgstr "" + +#: gnu/packages/audio.scm:481 +msgid "SWH plugins in LV2 format" +msgstr "SWH-udvidelsesmoduler i LV2-format" + +#: gnu/packages/audio.scm:483 +msgid "" +"Swh-plugins-lv2 is a collection of audio plugins in LV2 format. Plugin\n" +"classes include: dynamics (compressor, limiter), time (delay, chorus,\n" +"flanger), ringmodulator, distortion, filters, pitchshift, oscillators,\n" +"emulation (valve, tape), bit fiddling (decimator, pointer-cast), etc." msgstr "" -#: gnu/packages/audio.scm:349 +#: gnu/packages/audio.scm:523 +msgid "Sound and music computing system" +msgstr "Lyd- og musikberegningsystem" + +#: gnu/packages/audio.scm:525 msgid "" "Csound is a user-programmable and user-extensible sound processing\n" "language and software synthesizer." msgstr "" -#: gnu/packages/audio.scm:392 gnu/packages/audio.scm:2005 +#: gnu/packages/audio.scm:568 gnu/packages/audio.scm:2602 msgid "C++ wrapper around the ALSA API" -msgstr "" +msgstr "C++-omslag omkring ALSA API'en" -#: gnu/packages/audio.scm:394 +#: gnu/packages/audio.scm:570 msgid "" "clalsadrv is a C++ wrapper around the ALSA API simplifying access to\n" "ALSA PCM devices." msgstr "" +"Clalsadrv er et C++-omslag omkring ALSA API'en, der forenkler adgang til\n" +"ALSA PCM-enheder." -#: gnu/packages/audio.scm:429 -msgid "SoundFont synthesizer" +#: gnu/packages/audio.scm:607 +msgid "LADSPA ambisonics plugins" +msgstr "" + +#: gnu/packages/audio.scm:609 +msgid "" +"The AMB plugins are a set of LADSPA ambisonics plugins, mainly to be\n" +"used within Ardour. Features include: mono and stereo to B-format panning,\n" +"horizontal rotator, square, hexagon and cube decoders." +msgstr "" + +#: gnu/packages/audio.scm:644 +msgid "Chorus, phaser, and vintage high-pass and low-pass filters" +msgstr "" + +#: gnu/packages/audio.scm:646 +msgid "" +"This package provides various LADSPA plugins. @code{cs_chorus} and\n" +"@code{cs_phaser} provide chorus and phaser effects, respectively;\n" +"@code{mvclpf24} provides four implementations of the low-pass filter used in\n" +"vintage Moog synthesizers; @code{mvchpf24} is based on the voltage-controlled\n" +"high-pass filter by Robert Moog. The filters attempt to accurately emulate\n" +"the non-linear circuit elements of their original analog counterparts." +msgstr "" + +#: gnu/packages/audio.scm:684 +msgid "LADSPA reverb plugin" msgstr "" -#: gnu/packages/audio.scm:431 +#: gnu/packages/audio.scm:686 +msgid "" +"This package provides a stereo reverb LADSPA plugin based on the\n" +"well-known greverb." +msgstr "" + +#: gnu/packages/audio.scm:720 +msgid "LADSPA four-band parametric equalizer plugin" +msgstr "" + +#: gnu/packages/audio.scm:722 +msgid "" +"This package provides a LADSPA plugin for a four-band parametric\n" +"equalizer. Each section has an active/bypass switch, frequency, bandwidth and\n" +"gain controls. There is also a global bypass switch and gain control.\n" +"\n" +"The 2nd order resonant filters are implemented using a Mitra-Regalia style\n" +"lattice filter, which is stable even while parameters are being changed.\n" +"\n" +"All switches and controls are internally smoothed, so they can be used 'live'\n" +"without any clicks or zipper noises. This makes this plugin suitable for use\n" +"in systems that allow automation of plugin control ports, such as Ardour, or\n" +"for stage use." +msgstr "" + +#: gnu/packages/audio.scm:765 +msgid "LADSPA stereo width plugin" +msgstr "LADSPA-stereo med udvidelsesmodul" + +#: gnu/packages/audio.scm:767 +msgid "" +"This package provides a LADSPA plugin to manipulate the stereo width of\n" +"audio signals." +msgstr "" +"Denne pakke tilbyder et LADSPA-udvidelsesmodul til at manipulere stereodyben\n" +"for lydsignaler." + +#: gnu/packages/audio.scm:802 +msgid "LADSPA plugin for synthesizer oscillators" +msgstr "LADSPA-udvidelsesmodul for synthesizeroscillatorer" + +#: gnu/packages/audio.scm:804 +msgid "" +"The @code{blvco} LADSPA plugin provides three anti-aliased oscillators:\n" +"\n" +"@enumerate\n" +"@item Pulse-VCO, a dirac pulse oscillator with flat amplitude spectrum\n" +"@item Saw-VCO, a sawtooth oscillator with 1/F amplitude spectrum\n" +"@item Rec-VCO, a square / rectange oscillator\n" +"@end enumerate\n" +"\n" +"\n" +"All oscillators are low-pass filtered to provide waveforms similar to the\n" +"output of analog synthesizers such as the Moog Voyager." +msgstr "" + +#: gnu/packages/audio.scm:846 +msgid "LADSPA Autowah effect plugin" +msgstr "" + +#: gnu/packages/audio.scm:848 +msgid "" +"This package provides a LADSPA plugin for a Wah effect with envelope\n" +"follower." +msgstr "" +"Denne pakke tilbyder et LADSPA-udvidelsesmodul for wn Wah-effekt med\n" +"kuvertfølger." + +#: gnu/packages/audio.scm:882 +msgid "LADSPA stereo reverb plugin" +msgstr "" + +#: gnu/packages/audio.scm:884 +msgid "This package provides a LADSPA plugin for a stereo reverb effect." +msgstr "Denne pakke tilbyder et LADSPA-udvidelsesmodul for en stereo reverb-effekt." + +#: gnu/packages/audio.scm:918 +msgid "SoundFont synthesizer" +msgstr "SoundFont-synthesizer" + +#: gnu/packages/audio.scm:920 msgid "" "FluidSynth is a real-time software synthesizer based on the SoundFont 2\n" "specifications. FluidSynth reads and handles MIDI events from the MIDI input\n" @@ -151,39 +294,41 @@ msgid "" "also play midifiles using a Soundfont." msgstr "" -#: gnu/packages/audio.scm:463 +#: gnu/packages/audio.scm:952 msgid "MPEG-4 and MPEG-2 AAC decoder" -msgstr "" +msgstr "MPEG-4- og MPEG-2 AAC-afkoder" -#: gnu/packages/audio.scm:465 +#: gnu/packages/audio.scm:954 msgid "" "FAAD2 is an MPEG-4 and MPEG-2 AAC decoder supporting LC, Main, LTP, SBR,\n" "PS, and DAB+." msgstr "" +"FAAD2 er en MPEG-4- og MPEG-2 AAC-afkoder, der understøtter LC, Main, LTP, SBR,\n" +"PS og DAB+." -#: gnu/packages/audio.scm:494 +#: gnu/packages/audio.scm:983 msgid "Signal processing language" -msgstr "" +msgstr "Signalbehandlingssprog" -#: gnu/packages/audio.scm:496 +#: gnu/packages/audio.scm:985 msgid "Faust is a programming language for realtime audio signal processing." -msgstr "" +msgstr "Faust er et programmeringssprog for behandling af lydsignaler i realtid." -#: gnu/packages/audio.scm:531 +#: gnu/packages/audio.scm:1050 msgid "GUS compatible patches for MIDI players" msgstr "" -#: gnu/packages/audio.scm:533 +#: gnu/packages/audio.scm:1052 msgid "" "FreePats is a project to create a free and open set of GUS compatible\n" "patches that can be used with softsynths such as Timidity and WildMidi." msgstr "" -#: gnu/packages/audio.scm:586 +#: gnu/packages/audio.scm:1105 msgid "Virtual guitar amplifier" msgstr "" -#: gnu/packages/audio.scm:587 +#: gnu/packages/audio.scm:1106 msgid "" "Guitarix is a virtual guitar amplifier running JACK.\n" "Guitarix takes the signal from your guitar as a mono-signal from your sound\n" @@ -194,11 +339,11 @@ msgid "" "auto-wah." msgstr "" -#: gnu/packages/audio.scm:633 +#: gnu/packages/audio.scm:1162 msgid "Audio effects processor" msgstr "" -#: gnu/packages/audio.scm:635 +#: gnu/packages/audio.scm:1164 msgid "" "Rakarrack is a richly featured multi-effects processor emulating a\n" "guitar effects pedalboard. Effects include compressor, expander, noise gate,\n" @@ -210,22 +355,22 @@ msgid "" "well suited to all musical instruments and vocals." msgstr "" -#: gnu/packages/audio.scm:679 +#: gnu/packages/audio.scm:1215 msgid "LV2 convolution reverb" msgstr "" -#: gnu/packages/audio.scm:681 +#: gnu/packages/audio.scm:1217 msgid "" "IR is a low-latency, real-time, high performance signal convolver\n" "especially for creating reverb effects. It supports impulse responses with 1,\n" "2 or 4 channels, in any soundfile format supported by libsndfile." msgstr "" -#: gnu/packages/audio.scm:711 +#: gnu/packages/audio.scm:1247 msgid "JACK audio connection kit" msgstr "" -#: gnu/packages/audio.scm:713 +#: gnu/packages/audio.scm:1249 msgid "" "JACK is a low-latency audio server. It can connect a number of\n" "different applications to an audio device, as well as allowing them to share\n" @@ -235,32 +380,32 @@ msgid "" "synchronous execution of all clients, and low latency operation." msgstr "" -#: gnu/packages/audio.scm:811 +#: gnu/packages/audio.scm:1346 msgid "Simple LV2 host for JACK" msgstr "" -#: gnu/packages/audio.scm:813 +#: gnu/packages/audio.scm:1348 msgid "" "Jalv is a simple but fully featured LV2 host for JACK. It runs LV2\n" "plugins and exposes their ports as JACK ports, essentially making any LV2\n" "plugin function as a JACK application." msgstr "" -#: gnu/packages/audio.scm:856 +#: gnu/packages/audio.scm:1391 msgid "Linux Audio Developer's Simple Plugin API (LADSPA)" msgstr "" -#: gnu/packages/audio.scm:858 +#: gnu/packages/audio.scm:1393 msgid "" "LADSPA is a standard that allows software audio processors and effects\n" "to be plugged into a wide range of audio synthesis and recording packages." msgstr "" -#: gnu/packages/audio.scm:894 +#: gnu/packages/audio.scm:1429 msgid "Audio application session manager" msgstr "" -#: gnu/packages/audio.scm:896 +#: gnu/packages/audio.scm:1431 msgid "" "LASH is a session management system for audio applications. It allows\n" "you to save and restore audio sessions consisting of multiple interconneced\n" @@ -268,11 +413,11 @@ msgid "" "connections between them." msgstr "" -#: gnu/packages/audio.scm:917 +#: gnu/packages/audio.scm:1452 msgid "Bauer stereophonic-to-binaural DSP" msgstr "" -#: gnu/packages/audio.scm:919 +#: gnu/packages/audio.scm:1454 msgid "" "The Bauer stereophonic-to-binaural DSP (bs2b) library and plugins is\n" "designed to improve headphone listening of stereo audio records. Recommended\n" @@ -280,21 +425,21 @@ msgid "" "essential distortions." msgstr "" -#: gnu/packages/audio.scm:944 +#: gnu/packages/audio.scm:1477 msgid "Implementation of the Open Sound Control protocol" msgstr "" -#: gnu/packages/audio.scm:946 +#: gnu/packages/audio.scm:1479 msgid "" "liblo is a lightweight library that provides an easy to use\n" "implementation of the Open Sound Control (OSC) protocol." msgstr "" -#: gnu/packages/audio.scm:967 +#: gnu/packages/audio.scm:1501 msgid "Python bindings for liblo" msgstr "" -#: gnu/packages/audio.scm:969 +#: gnu/packages/audio.scm:1503 msgid "" "Pyliblo is a Python wrapper for the liblo Open Sound Control (OSC)\n" "library. It supports almost the complete functionality of liblo, allowing you\n" @@ -302,22 +447,22 @@ msgid "" "included are the command line utilities @code{send_osc} and @code{dump_osc}." msgstr "" -#: gnu/packages/audio.scm:1011 +#: gnu/packages/audio.scm:1545 msgid "Library to simplify use of LV2 plugins in applications" msgstr "" -#: gnu/packages/audio.scm:1013 +#: gnu/packages/audio.scm:1547 msgid "" "Lilv is a C library to make the use of LV2 plugins as simple as possible\n" "for applications. Lilv is the successor to SLV2, rewritten to be\n" "significantly faster and have minimal dependencies." msgstr "" -#: gnu/packages/audio.scm:1040 +#: gnu/packages/audio.scm:1573 msgid "LV2 audio plugin specification" msgstr "" -#: gnu/packages/audio.scm:1042 +#: gnu/packages/audio.scm:1575 msgid "" "LV2 is an open specification for audio plugins and host applications.\n" "At its core, LV2 is a simple stable interface, accompanied by extensions which\n" @@ -325,38 +470,38 @@ msgid "" "software." msgstr "" -#: gnu/packages/audio.scm:1077 +#: gnu/packages/audio.scm:1610 msgid "LV2 port of the mda Piano plugin" msgstr "" -#: gnu/packages/audio.scm:1078 +#: gnu/packages/audio.scm:1611 msgid "An LV2 port of the mda Piano VSTi." msgstr "" -#: gnu/packages/audio.scm:1091 +#: gnu/packages/audio.scm:1624 msgid "LV2 port of the mda EPiano plugin" msgstr "" -#: gnu/packages/audio.scm:1092 +#: gnu/packages/audio.scm:1625 msgid "An LV2 port of the mda EPiano VSTi." msgstr "" -#: gnu/packages/audio.scm:1130 +#: gnu/packages/audio.scm:1670 msgid "C++ libraries for LV2 plugins" msgstr "" -#: gnu/packages/audio.scm:1132 +#: gnu/packages/audio.scm:1672 msgid "" "The LV2 Toolkit (LVTK) contains libraries that wrap the LV2 C API and\n" "extensions into easy to use C++ classes. It is the successor of\n" "lv2-c++-tools." msgstr "" -#: gnu/packages/audio.scm:1173 +#: gnu/packages/audio.scm:1713 msgid "3D audio API" msgstr "" -#: gnu/packages/audio.scm:1175 +#: gnu/packages/audio.scm:1715 msgid "" "OpenAL provides capabilities for playing audio in a virtual 3D\n" "environment. Distance attenuation, doppler shift, and directional sound\n" @@ -366,62 +511,70 @@ msgid "" "buffers, and audio capture." msgstr "" -#: gnu/packages/audio.scm:1209 +#: gnu/packages/audio.scm:1745 +msgid "Free implementation of OpenAL's ALUT standard" +msgstr "" + +#: gnu/packages/audio.scm:1746 +msgid "freealut is the OpenAL Utility Toolkit." +msgstr "" + +#: gnu/packages/audio.scm:1775 msgid "Modular patch bay for audio and MIDI systems" msgstr "" -#: gnu/packages/audio.scm:1211 +#: gnu/packages/audio.scm:1777 msgid "" "Patchage is a modular patch bay for audio and MIDI systems based on JACK\n" "and ALSA." msgstr "" -#: gnu/packages/audio.scm:1236 +#: gnu/packages/audio.scm:1802 msgid "Real-time audio utility library" msgstr "" -#: gnu/packages/audio.scm:1238 +#: gnu/packages/audio.scm:1804 msgid "" "Raul (Real-time Audio Utility Library) is a C++ utility library primarily\n" "aimed at audio/musical applications." msgstr "" -#: gnu/packages/audio.scm:1264 +#: gnu/packages/audio.scm:1847 msgid "Audio time-stretching and pitch-shifting library" msgstr "" -#: gnu/packages/audio.scm:1266 +#: gnu/packages/audio.scm:1849 msgid "" "Rubber Band is a library and utility program that permits changing the\n" "tempo and pitch of an audio recording independently of one another." msgstr "" -#: gnu/packages/audio.scm:1314 +#: gnu/packages/audio.scm:1897 msgid "Cross-platform MIDI library for C++" msgstr "" -#: gnu/packages/audio.scm:1316 +#: gnu/packages/audio.scm:1899 msgid "" "RtMidi is a set of C++ classes (RtMidiIn, RtMidiOut, and API specific\n" "classes) that provide a common cross-platform API for realtime MIDI\n" "input/output." msgstr "" -#: gnu/packages/audio.scm:1342 +#: gnu/packages/audio.scm:1925 msgid "Library for serialising LV2 atoms to/from RDF" msgstr "" -#: gnu/packages/audio.scm:1344 +#: gnu/packages/audio.scm:1927 msgid "" "Sratom is a library for serialising LV2 atoms to/from RDF, particularly\n" "the Turtle syntax." msgstr "" -#: gnu/packages/audio.scm:1369 +#: gnu/packages/audio.scm:1952 msgid "Library for loading and wrapping LV2 plugin UIs" msgstr "" -#: gnu/packages/audio.scm:1371 +#: gnu/packages/audio.scm:1954 msgid "" "Suil is a lightweight C library for loading and wrapping LV2 plugin UIs.\n" "\n" @@ -433,11 +586,11 @@ msgid "" "Suil currently supports every combination of Gtk 2, Qt 4, and X11." msgstr "" -#: gnu/packages/audio.scm:1428 +#: gnu/packages/audio.scm:2011 msgid "Software synthesizer for playing MIDI files" msgstr "" -#: gnu/packages/audio.scm:1430 +#: gnu/packages/audio.scm:2013 msgid "" "TiMidity++ is a software synthesizer. It can play MIDI files by\n" "converting them into PCM waveform data; give it a MIDI data along with digital\n" @@ -446,43 +599,43 @@ msgid "" "disks as various audio file formats." msgstr "" -#: gnu/packages/audio.scm:1469 +#: gnu/packages/audio.scm:2052 msgid "Modular and extensible audio processing system" msgstr "" -#: gnu/packages/audio.scm:1471 +#: gnu/packages/audio.scm:2054 msgid "" "Vamp is an audio processing plugin system for plugins that extract\n" "descriptive information from audio data — typically referred to as audio\n" "analysis plugins or audio feature extraction plugins." msgstr "" -#: gnu/packages/audio.scm:1510 +#: gnu/packages/audio.scm:2093 msgid "Library for time stretching and pitch scaling of audio" msgstr "" -#: gnu/packages/audio.scm:1512 +#: gnu/packages/audio.scm:2095 msgid "" "SBSMS (Subband Sinusoidal Modeling Synthesis) is software for time\n" "stretching and pitch scaling of audio. This package contains the library." msgstr "" -#: gnu/packages/audio.scm:1535 +#: gnu/packages/audio.scm:2118 msgid "Hybrid lossless audio codec" msgstr "" -#: gnu/packages/audio.scm:1537 +#: gnu/packages/audio.scm:2120 msgid "" "WavPack is an audio compression format with lossless, lossy and hybrid\n" "compression modes. This package contains command-line programs and library to\n" "encode and decode wavpack files." msgstr "" -#: gnu/packages/audio.scm:1556 +#: gnu/packages/audio.scm:2139 msgid "Mod file playing library" msgstr "" -#: gnu/packages/audio.scm:1558 +#: gnu/packages/audio.scm:2141 msgid "" "Libmodplug renders mod music files as raw audio data, for playing or\n" "conversion. mod, .s3m, .it, .xm, and a number of lesser-known formats are\n" @@ -490,33 +643,33 @@ msgid "" "surround and reverb." msgstr "" -#: gnu/packages/audio.scm:1577 +#: gnu/packages/audio.scm:2160 msgid "Module player library" msgstr "" -#: gnu/packages/audio.scm:1579 +#: gnu/packages/audio.scm:2162 msgid "" "Libxmp is a library that renders module files to PCM data. It supports\n" "over 90 mainstream and obscure module formats including Protracker (MOD),\n" "Scream Tracker 3 (S3M), Fast Tracker II (XM), and Impulse Tracker (IT)." msgstr "" -#: gnu/packages/audio.scm:1602 +#: gnu/packages/audio.scm:2185 msgid "Extended module player" msgstr "" -#: gnu/packages/audio.scm:1604 +#: gnu/packages/audio.scm:2187 msgid "" "Xmp is a portable module player that plays over 90 mainstream and\n" "obscure module formats, including Protracker MOD, Fasttracker II XM, Scream\n" "Tracker 3 S3M and Impulse Tracker IT files." msgstr "" -#: gnu/packages/audio.scm:1636 +#: gnu/packages/audio.scm:2219 msgid "Audio processing library for changing tempo, pitch and playback rate" msgstr "" -#: gnu/packages/audio.scm:1638 +#: gnu/packages/audio.scm:2221 msgid "" "SoundTouch is an audio processing library for changing the tempo, pitch\n" "and playback rates of audio streams or audio files. It is intended for\n" @@ -524,11 +677,11 @@ msgid "" "control functionality, or just for playing around with the sound effects." msgstr "" -#: gnu/packages/audio.scm:1675 +#: gnu/packages/audio.scm:2258 msgid "Sound processing utility" msgstr "" -#: gnu/packages/audio.scm:1677 +#: gnu/packages/audio.scm:2260 msgid "" "SoX (Sound eXchange) is a command line utility that can convert\n" "various formats of computer audio files to other formats. It can also\n" @@ -536,92 +689,92 @@ msgid "" "can play and record audio files." msgstr "" -#: gnu/packages/audio.scm:1700 +#: gnu/packages/audio.scm:2283 msgid "One-dimensional sample-rate conversion library" msgstr "" -#: gnu/packages/audio.scm:1702 +#: gnu/packages/audio.scm:2285 msgid "" "The SoX Resampler library (libsoxr) performs one-dimensional sample-rate\n" "conversion. It may be used, for example, to resample PCM-encoded audio." msgstr "" -#: gnu/packages/audio.scm:1724 +#: gnu/packages/audio.scm:2315 msgid "MPEG Audio Layer 2 (MP2) encoder" msgstr "" -#: gnu/packages/audio.scm:1726 +#: gnu/packages/audio.scm:2317 msgid "" "TwoLAME is an optimised MPEG Audio Layer 2 (MP2) encoder based on\n" "tooLAME by Mike Cheng, which in turn is based upon the ISO dist10 code and\n" "portions of LAME." msgstr "" -#: gnu/packages/audio.scm:1766 +#: gnu/packages/audio.scm:2357 msgid "Audio I/O library" msgstr "" -#: gnu/packages/audio.scm:1768 +#: gnu/packages/audio.scm:2359 msgid "" "PortAudio is a portable C/C++ audio I/O library providing a simple API\n" "to record and/or play sound using a callback function or a blocking read/write\n" "interface." msgstr "" -#: gnu/packages/audio.scm:1791 +#: gnu/packages/audio.scm:2388 msgid "Graphical user interface for FluidSynth" msgstr "" -#: gnu/packages/audio.scm:1793 +#: gnu/packages/audio.scm:2390 msgid "" "Qsynth is a GUI front-end application for the FluidSynth SoundFont\n" "synthesizer written in C++." msgstr "" -#: gnu/packages/audio.scm:1831 +#: gnu/packages/audio.scm:2428 msgid "Networked audio system" msgstr "" -#: gnu/packages/audio.scm:1833 +#: gnu/packages/audio.scm:2430 msgid "" "RSound allows you to send audio from an application and transfer it\n" "directly to a different computer on your LAN network. It is an audio daemon\n" "with a much different focus than most other audio daemons." msgstr "" -#: gnu/packages/audio.scm:1864 +#: gnu/packages/audio.scm:2461 msgid "JACK audio frequency analyzer and display" msgstr "" -#: gnu/packages/audio.scm:1866 +#: gnu/packages/audio.scm:2463 msgid "" "XJackFreak is an audio analysis and equalizing tool for the Jack Audio\n" "Connection Kit. It can display the FFT of any input, modify it and output the\n" "result." msgstr "" -#: gnu/packages/audio.scm:1912 +#: gnu/packages/audio.scm:2509 msgid "Fast, partitioned convolution engine library" msgstr "" -#: gnu/packages/audio.scm:1914 +#: gnu/packages/audio.scm:2511 msgid "" "Zita convolver is a C++ library providing a real-time convolution\n" "engine." msgstr "" -#: gnu/packages/audio.scm:1959 +#: gnu/packages/audio.scm:2556 msgid "C++ library for resampling audio signals" msgstr "" -#: gnu/packages/audio.scm:1961 +#: gnu/packages/audio.scm:2558 msgid "" "Libzita-resampler is a C++ library for resampling audio signals. It is\n" "designed to be used within a real-time processing context, to be fast, and to\n" "provide high-quality sample rate conversion." msgstr "" -#: gnu/packages/audio.scm:2007 +#: gnu/packages/audio.scm:2604 msgid "" "Zita-alsa-pcmi is a C++ wrapper around the ALSA API. It provides easy\n" "access to ALSA PCM devices, taking care of the many functions required to\n" @@ -629,11 +782,11 @@ msgid "" "point audio data." msgstr "" -#: gnu/packages/audio.scm:2038 +#: gnu/packages/audio.scm:2635 msgid "Cue and toc file parsers and utilities" msgstr "" -#: gnu/packages/audio.scm:2039 +#: gnu/packages/audio.scm:2636 msgid "" "Cuetools is a set of programs that are useful for manipulating\n" "and using CUE sheet (cue) files and Table of Contents (toc) files. CUE and TOC\n" @@ -641,11 +794,11 @@ msgid "" "machine-readable ASCII format." msgstr "" -#: gnu/packages/audio.scm:2058 +#: gnu/packages/audio.scm:2655 msgid "WAVE audio data processing tool" msgstr "" -#: gnu/packages/audio.scm:2059 +#: gnu/packages/audio.scm:2656 msgid "" "shntool is a multi-purpose WAVE data processing and reporting\n" "utility. File formats are abstracted from its core, so it can process any file\n" @@ -653,11 +806,52 @@ msgid "" "module to handle that particular file type." msgstr "" -#: gnu/packages/backup.scm:92 +#: gnu/packages/audio.scm:2693 +msgid "DTS Coherent Acoustics decoder" +msgstr "" + +#: gnu/packages/audio.scm:2694 +msgid "" +"Dcadec is a DTS Coherent Acoustics surround sound decoder\n" +"with support for HD extensions." +msgstr "" + +#: gnu/packages/audio.scm:2715 +msgid "Tool to adjust loudness of media files" +msgstr "" + +#: gnu/packages/audio.scm:2717 +msgid "" +"BS1770GAIN is a loudness scanner compliant with ITU-R BS.1770 and its\n" +"flavors EBU R128, ATSC A/85, and ReplayGain 2.0. It helps normalizing the\n" +"loudness of audio and video files to the same level." +msgstr "" + +#: gnu/packages/audio.scm:2748 +msgid "Lightweight audio filtering library" +msgstr "" + +#: gnu/packages/audio.scm:2749 +msgid "" +"An easy to use audio filtering library made from webrtc\n" +"code, used in @code{libtoxcore}." +msgstr "" + +#: gnu/packages/audio.scm:2793 +msgid "GSM 06.10 lossy speech compression library" +msgstr "GSM 06.10-talekomprimeringsbibliotek uden kvalitetestab" + +#: gnu/packages/audio.scm:2794 +msgid "" +"This C library provides an encoder and a decoder for the GSM\n" +"06.10 RPE-LTP lossy speech compression algorithm." +msgstr "" + +#: gnu/packages/backup.scm:93 msgid "Encrypted backup using rsync algorithm" msgstr "Krypteret sikkerhedskopiering via brug af rsync-algoritmen" -#: gnu/packages/backup.scm:94 +#: gnu/packages/backup.scm:95 msgid "" "Duplicity backs up directories by producing encrypted tar-format volumes\n" "and uploading them to a remote or local file server. Because duplicity uses\n" @@ -674,11 +868,22 @@ msgstr "" "underskrive disse arkiver, så vil de være sikret mod spionage og/eller\n" "ændring af serveren." -#: gnu/packages/backup.scm:128 +#: gnu/packages/backup.scm:132 +msgid "File verification and repair tool" +msgstr "" + +#: gnu/packages/backup.scm:133 +msgid "" +"Par2cmdline is a tool for generating RAID-like PAR2 recovery\n" +"files using Reed-Solomon coding. PAR2 files can be stored along side backups\n" +"or distributed files for recovering from bitrot." +msgstr "" + +#: gnu/packages/backup.scm:164 msgid "Simple incremental backup tool" msgstr "Simpelt værktøj til trinvis sikkerhedskopiering" -#: gnu/packages/backup.scm:130 +#: gnu/packages/backup.scm:166 msgid "" "Hdup2 is a backup utility, its aim is to make backup really simple. The\n" "backup scheduling is done by means of a cron job. It supports an\n" @@ -691,11 +896,11 @@ msgstr "" "sikkerhedskopier, krypterede sikkerhedskopier og opdelte sikkerhedskopier\n" "(kaldt klumper) så der nemt kan brændes til cd/dvd." -#: gnu/packages/backup.scm:185 +#: gnu/packages/backup.scm:224 msgid "Multi-format archive and compression library" msgstr "Arkiv- og komprimeringsbibliotek for flere formater" -#: gnu/packages/backup.scm:187 +#: gnu/packages/backup.scm:226 msgid "" "Libarchive provides a flexible interface for reading and writing\n" "archives in various formats such as tar and cpio. Libarchive also supports\n" @@ -713,11 +918,11 @@ msgstr "" "Bemærk venligst at der i øjeblikket ikke er indbygget understøttelse\n" "for vilkårlig vilkårlig adgang eller for direkte modifikation i arkivet." -#: gnu/packages/backup.scm:250 +#: gnu/packages/backup.scm:289 msgid "Provide a list of files to backup" msgstr "Tilbyder en liste af filer til sikkerhedskopiering" -#: gnu/packages/backup.scm:252 +#: gnu/packages/backup.scm:291 msgid "" "Rdup is a utility inspired by rsync and the plan9 way of doing backups.\n" "Rdup itself does not backup anything, it only print a list of absolute\n" @@ -730,11 +935,11 @@ msgstr "" "skripter er krævet til for det videre arbejde med denne liste og\n" "implementering af sikkerhedskopistrategien." -#: gnu/packages/backup.scm:282 +#: gnu/packages/backup.scm:321 msgid "Tar-compatible archiver" msgstr "Tar-kompatibelt arkivprogram" -#: gnu/packages/backup.scm:284 +#: gnu/packages/backup.scm:323 msgid "" "Btar is a tar-compatible archiver which allows arbitrary compression and\n" "ciphering, redundancy, differential backup, indexed extraction, multicore\n" @@ -746,11 +951,11 @@ msgstr "" "indekseret udtrækning, komprimering med flere kerner, inddata- og uddata-\n" "serialisering, og tolerance for delvise arkivfejl." -#: gnu/packages/backup.scm:312 +#: gnu/packages/backup.scm:349 msgid "Local/remote mirroring+incremental backup" msgstr "Lokal/ekstern spejlning+trinvis sikkerhedskopiering" -#: gnu/packages/backup.scm:314 +#: gnu/packages/backup.scm:351 msgid "" "Rdiff-backup backs up one directory to another, possibly over a network.\n" "The target directory ends up a copy of the source directory, but extra reverse\n" @@ -778,23 +983,11 @@ msgstr "" "placering og kun forskellene vil blive overført. Endelig er rdiff-backup\n" "nem at bruge og startopsætningen er lavet med fornuftige standarder." -#: gnu/packages/backup.scm:353 -msgid "Deduplicating backup program" -msgstr "" - -#: gnu/packages/backup.scm:354 -msgid "" -"Attic is a deduplicating backup program. The main goal of\n" -"Attic is to provide an efficient and secure way to backup data. The data\n" -"deduplication technique used makes Attic suitable for daily backups since only\n" -"changes are stored." -msgstr "" - -#: gnu/packages/backup.scm:391 +#: gnu/packages/backup.scm:393 msgid "Tools & library for data backup and distributed storage" msgstr "" -#: gnu/packages/backup.scm:393 +#: gnu/packages/backup.scm:395 msgid "" "Libchop is a set of utilities and library for data backup and\n" "distributed storage. Its main application is @command{chop-backup}, an\n" @@ -805,11 +998,37 @@ msgid "" "detection, and lossless compression." msgstr "" -#: gnu/packages/base.scm:66 +#: gnu/packages/backup.scm:491 +msgid "Deduplicated, encrypted, authenticated and compressed backups" +msgstr "" + +#: gnu/packages/backup.scm:492 +msgid "" +"Borg is a deduplicating backup program. Optionally, it\n" +"supports compression and authenticated encryption. The main goal of Borg is to\n" +"provide an efficient and secure way to backup data. The data deduplication\n" +"technique used makes Borg suitable for daily backups since only changes are\n" +"stored. The authenticated encryption technique makes it suitable for backups\n" +"to not fully trusted targets. Borg is a fork of Attic." +msgstr "" + +#: gnu/packages/backup.scm:538 +msgid "Deduplicating backup program" +msgstr "" + +#: gnu/packages/backup.scm:539 +msgid "" +"Attic is a deduplicating backup program. The main goal of\n" +"Attic is to provide an efficient and secure way to backup data. The data\n" +"deduplication technique used makes Attic suitable for daily backups since only\n" +"changes are stored." +msgstr "" + +#: gnu/packages/base.scm:70 msgid "Hello, GNU world: An example GNU package" msgstr "Hej, GNU-verden: Et eksempel på en GNU-pakke" -#: gnu/packages/base.scm:68 +#: gnu/packages/base.scm:72 msgid "" "GNU Hello prints the message \"Hello, world!\" and then exits. It\n" "serves as an example of standard GNU coding practices. As such, it supports\n" @@ -820,11 +1039,11 @@ msgstr "" "sådan understøtter programmer parametre på kommandolinjen, flere\n" "sprog og så videre." -#: gnu/packages/base.scm:89 +#: gnu/packages/base.scm:106 msgid "Print lines matching a pattern" msgstr "Udskriv linjer der matcher et mønster" -#: gnu/packages/base.scm:91 +#: gnu/packages/base.scm:108 msgid "" "grep is a tool for finding text inside files. Text is found by\n" "matching a pattern provided by the user in one or many files. The pattern\n" @@ -843,11 +1062,11 @@ msgstr "" "grep tilbyder mange udvidelser i forhold til standardredskabet,\n" "inklusiv rekursiv mappesøgning." -#: gnu/packages/base.scm:114 +#: gnu/packages/base.scm:131 msgid "Stream editor" msgstr "Strømredigeringsprogram" -#: gnu/packages/base.scm:129 +#: gnu/packages/base.scm:146 msgid "" "Sed is a non-interactive, text stream editor. It receives a text\n" "input from a file or from standard input and it then applies a series of text\n" @@ -861,11 +1080,11 @@ msgstr "" "tekstmønster i en strøm. GNU-implementeringen tilbyder flere\n" "udvidelser i forhold til standardredskabet." -#: gnu/packages/base.scm:152 +#: gnu/packages/base.scm:185 msgid "Managing tar archives" msgstr "Håndtering af tar-arkiver" -#: gnu/packages/base.scm:154 +#: gnu/packages/base.scm:187 msgid "" "Tar provides the ability to create tar archives, as well as the\n" "ability to extract, update or list files in an existing archive. It is\n" @@ -880,11 +1099,11 @@ msgstr "" "mappestruktur og filinformation såsom rettigheder og oprettelse/ændrings-\n" "datoer bevares. GNU tar tilbyder mange udvidelser over standardredskabet." -#: gnu/packages/base.scm:177 +#: gnu/packages/base.scm:210 msgid "Apply differences to originals, with optional backups" msgstr "Anvend forskelle på originaler, med valgfri sikkerhedskopiering" -#: gnu/packages/base.scm:179 +#: gnu/packages/base.scm:212 msgid "" "Patch is a program that applies changes to files based on differences\n" "laid out as by the program \"diff\". The changes may be applied to one or more\n" @@ -898,11 +1117,11 @@ msgstr "" "forskellige diff-formater. Det kan også bruges til at tilbageføre\n" "tidligere anvendte forskelle." -#: gnu/packages/base.scm:199 +#: gnu/packages/base.scm:232 msgid "Comparing and merging files" msgstr "Sammenligning og sammenføjning af filer" -#: gnu/packages/base.scm:201 +#: gnu/packages/base.scm:234 msgid "" "GNU Diffutils is a package containing tools for finding the\n" "differences between files. The \"diff\" command is used to show how two files\n" @@ -916,11 +1135,11 @@ msgstr "" "de er forskellige. »diff3« giver dig mulighed for at sammenligne tre filer.\n" "Endelig tilbyder »sdiff« en interaktiv måde at sammenføje to filer." -#: gnu/packages/base.scm:234 +#: gnu/packages/base.scm:266 msgid "Operating on files matching given criteria" msgstr "Operation på filer der matcher angivne kriterier" -#: gnu/packages/base.scm:236 +#: gnu/packages/base.scm:268 msgid "" "Findutils supplies the basic file directory searching utilities of the\n" "GNU system. It consists of two primary searching utilities: \"find\"\n" @@ -936,11 +1155,11 @@ msgstr "" "ekstra værktøjer er inkluderet: »updatedb« opdaterer filnavnsdatabasen\n" "og »xargs« kan bruges til at anvende kommandoer med arbitrært lange argumenter." -#: gnu/packages/base.scm:300 +#: gnu/packages/base.scm:323 msgid "Core GNU utilities (file, text, shell)" msgstr "Core GNU-redskaber (file, text, shell)" -#: gnu/packages/base.scm:302 +#: gnu/packages/base.scm:325 msgid "" "GNU Coreutils includes all of the basic command-line tools that are\n" "expected in a POSIX system. These provide the basic file, shell and text\n" @@ -953,11 +1172,11 @@ msgstr "" "af disse værktøjer tilbyder udvidet funktionalitet udover det skitseret\n" "i POSIX-standarden." -#: gnu/packages/base.scm:344 +#: gnu/packages/base.scm:367 msgid "Remake files automatically" msgstr "Gendan filer automatisk" -#: gnu/packages/base.scm:346 +#: gnu/packages/base.scm:369 msgid "" "Make is a program that is used to control the production of\n" "executables or other files from their source files. The process is\n" @@ -974,11 +1193,11 @@ msgstr "" "gendannes efter at deres kilder har ændret sig. GNU make tilbyder\n" "mange funktionsrige udvidelser der ligger udover standardredskabet." -#: gnu/packages/base.scm:391 +#: gnu/packages/base.scm:415 msgid "Binary utilities: bfd gas gprof ld" msgstr "Binære redskaber: bfd gas gprof ld" -#: gnu/packages/base.scm:393 +#: gnu/packages/base.scm:417 msgid "" "GNU Binutils is a collection of tools for working with binary files.\n" "Perhaps the most notable are \"ld\", a linker, and \"as\", an assembler.\n" @@ -988,22 +1207,22 @@ msgid "" "included." msgstr "" -#: gnu/packages/base.scm:458 +#: gnu/packages/base.scm:491 msgid "The linker wrapper" msgstr "" -#: gnu/packages/base.scm:460 +#: gnu/packages/base.scm:493 msgid "" "The linker wrapper (or 'ld-wrapper') wraps the linker to add any\n" "missing '-rpath' flags, and to detect any misuse of libraries outside of the\n" "store." msgstr "" -#: gnu/packages/base.scm:638 +#: gnu/packages/base.scm:667 msgid "The GNU C Library" msgstr "" -#: gnu/packages/base.scm:640 +#: gnu/packages/base.scm:669 msgid "" "Any Unix-like operating system needs a C library: the library which\n" "defines the \"system calls\" and other basic facilities such as open, malloc,\n" @@ -1013,47 +1232,47 @@ msgid "" "with the Linux kernel." msgstr "" -#: gnu/packages/base.scm:671 +#: gnu/packages/base.scm:732 +msgid "The GNU C Library (GNU Hurd variant)" +msgstr "GNU C-biblioteket (GNU Hurd-variant)" + +#: gnu/packages/base.scm:804 msgid "All the locales supported by the GNU C Library" msgstr "" -#: gnu/packages/base.scm:673 +#: gnu/packages/base.scm:806 msgid "" "This package provides all the locales supported by the GNU C Library,\n" "more than 400 in total. To use them set the 'LOCPATH' environment variable to\n" "the 'share/locale' sub-directory of this package." msgstr "" -#: gnu/packages/base.scm:741 +#: gnu/packages/base.scm:874 msgid "Small sample of UTF-8 locales" msgstr "" -#: gnu/packages/base.scm:743 +#: gnu/packages/base.scm:876 msgid "" "This package provides a small sample of UTF-8 locales mostly useful in\n" "test environments." msgstr "" -#: gnu/packages/base.scm:761 +#: gnu/packages/base.scm:894 msgid "Find full path of shell commands" msgstr "" -#: gnu/packages/base.scm:763 +#: gnu/packages/base.scm:896 msgid "" "The which program finds the location of executables in PATH, with a\n" "variety of options. It is an alternative to the shell \"type\" built-in\n" "command." msgstr "" -#: gnu/packages/base.scm:833 -msgid "The GNU C Library (GNU Hurd variant)" -msgstr "" - -#: gnu/packages/base.scm:935 +#: gnu/packages/base.scm:1001 msgid "Database of current and historical time zones" msgstr "" -#: gnu/packages/base.scm:936 +#: gnu/packages/base.scm:1002 msgid "" "The Time Zone Database (often called tz or zoneinfo)\n" "contains code and data that represent the history of local time for many\n" @@ -1062,11 +1281,22 @@ msgid "" "and daylight-saving rules." msgstr "" -#: gnu/packages/bittorrent.scm:90 +#: gnu/packages/base.scm:1028 +msgid "Character set conversion library" +msgstr "Bibliotek til konvertering af tegnsæt" + +#: gnu/packages/base.scm:1030 +msgid "" +"libiconv provides an implementation of the iconv function for systems\n" +"that lack it. iconv is used to convert between character encodings in a\n" +"program. It supports a wide variety of different encodings." +msgstr "" + +#: gnu/packages/bittorrent.scm:102 msgid "Fast and easy BitTorrent client" msgstr "" -#: gnu/packages/bittorrent.scm:92 +#: gnu/packages/bittorrent.scm:104 msgid "" "Transmission is a BitTorrent client that comes with graphical,\n" "textual, and Web user interfaces. Transmission also has a daemon for\n" @@ -1074,49 +1304,74 @@ msgid "" "DHT, µTP, PEX and Magnet Links." msgstr "" -#: gnu/packages/bittorrent.scm:124 +#: gnu/packages/bittorrent.scm:136 msgid "BitTorrent library of rtorrent" -msgstr "" +msgstr "BitTorrent-bibliotek for rtorrent" -#: gnu/packages/bittorrent.scm:126 +#: gnu/packages/bittorrent.scm:138 msgid "" "LibTorrent is a BitTorrent library used by and developed in parallel\n" "with the BitTorrent client rtorrent. It is written in C++ with emphasis on\n" "speed and efficiency." msgstr "" -#: gnu/packages/bittorrent.scm:153 +#: gnu/packages/bittorrent.scm:165 msgid "BitTorrent client with ncurses interface" msgstr "" -#: gnu/packages/bittorrent.scm:155 +#: gnu/packages/bittorrent.scm:167 msgid "" "rTorrent is a BitTorrent client with an ncurses interface. It supports\n" "full encryption, DHT, PEX, and Magnet Links. It can also be controlled via\n" "XML-RPC over SCGI." msgstr "" -#: gnu/packages/bittorrent.scm:196 +#: gnu/packages/bittorrent.scm:208 msgid "Console client for the Transmission BitTorrent daemon" msgstr "" -#: gnu/packages/bittorrent.scm:197 +#: gnu/packages/bittorrent.scm:209 msgid "" "Transmission-remote-cli is a console client, with a curses\n" "interface, for the Transmission BitTorrent daemon." msgstr "" -#: gnu/packages/bittorrent.scm:240 +#: gnu/packages/bittorrent.scm:254 msgid "Utility for parallel downloading files" -msgstr "" +msgstr "Redskab for parallel overførsel af filer" -#: gnu/packages/bittorrent.scm:242 +#: gnu/packages/bittorrent.scm:256 msgid "" "Aria2 is a lightweight, multi-protocol & multi-source command-line\n" "download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.\n" "Aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces." msgstr "" +#: gnu/packages/bittorrent.scm:289 +msgid "Universal download manager with GTK+ interface" +msgstr "" + +#: gnu/packages/bittorrent.scm:291 +msgid "" +"uGet is portable download manager with GTK+ interface supporting\n" +"HTTP, HTTPS, BitTorrent and Metalink, supporting multi-connection\n" +"downloads, download scheduling, download rate limiting." +msgstr "" + +#: gnu/packages/bittorrent.scm:319 +msgid "Utility to create BitTorrent metainfo files" +msgstr "Redskab til at oprette BitTorrent-metainfofiler" + +#: gnu/packages/bittorrent.scm:320 +msgid "" +"mktorrent is a simple command-line utility to create\n" +"BitTorrent @dfn{metainfo} files, often known simply as @dfn{torrents}, from\n" +"both single files and whole directories. It can add multiple trackers and web\n" +"seed URLs, and set the @code{private} flag to disallow advertisement through\n" +"the distributed hash table (DHT) and Peer Exchange. Hashing is multi-threaded\n" +"and will take advantage of multiple processor cores where possible." +msgstr "" + #: gnu/packages/certs.scm:65 msgid "Python script to extract .pem data from certificate collection" msgstr "" @@ -1128,21 +1383,21 @@ msgid "" ".pem formatted certificates." msgstr "" -#: gnu/packages/certs.scm:124 +#: gnu/packages/certs.scm:136 msgid "CA certificates from Mozilla" msgstr "" -#: gnu/packages/certs.scm:126 +#: gnu/packages/certs.scm:138 msgid "" "This package provides certificates for Certification Authorities (CA)\n" "taken from the NSS package and thus ultimately from the Mozilla project." msgstr "" -#: gnu/packages/compression.scm:75 +#: gnu/packages/compression.scm:83 msgid "Compression library" msgstr "" -#: gnu/packages/compression.scm:77 +#: gnu/packages/compression.scm:85 msgid "" "zlib is designed to be a free, general-purpose, legally unencumbered --\n" "that is, not covered by any patents -- lossless data-compression library for\n" @@ -1155,31 +1410,31 @@ msgid "" "in compression." msgstr "" -#: gnu/packages/compression.scm:102 +#: gnu/packages/compression.scm:110 msgid "Replacement for Sun's 'jar' utility" msgstr "" -#: gnu/packages/compression.scm:104 +#: gnu/packages/compression.scm:112 msgid "" "FastJar is an attempt to create a much faster replacement for Sun's 'jar'\n" "utility. Instead of being written in Java, FastJar is written in C." msgstr "" -#: gnu/packages/compression.scm:122 +#: gnu/packages/compression.scm:146 msgid "C library for manipulating POSIX tar files" msgstr "" -#: gnu/packages/compression.scm:124 +#: gnu/packages/compression.scm:148 msgid "" "libtar is a C library for manipulating POSIX tar files. It handles\n" "adding and extracting files to/from a tar archive." msgstr "" -#: gnu/packages/compression.scm:141 +#: gnu/packages/compression.scm:165 msgid "General file (de)compression (using lzw)" msgstr "" -#: gnu/packages/compression.scm:146 +#: gnu/packages/compression.scm:170 msgid "" "GNU Gzip provides data compression and decompression utilities; the\n" "typical extension is \".gz\". Unlike the \"zip\" format, it compresses a single\n" @@ -1187,11 +1442,11 @@ msgid "" "\".tar.gz\" or \".tgz\", etc." msgstr "" -#: gnu/packages/compression.scm:222 +#: gnu/packages/compression.scm:246 msgid "High-quality data compression program" msgstr "" -#: gnu/packages/compression.scm:224 +#: gnu/packages/compression.scm:248 msgid "" "bzip2 is a freely available, patent free (see below), high-quality data\n" "compressor. It typically compresses files to within 10% to 15% of the best\n" @@ -1200,11 +1455,25 @@ msgid "" "decompression." msgstr "" -#: gnu/packages/compression.scm:254 +#: gnu/packages/compression.scm:269 +msgid "Parallel bzip2 compression utility" +msgstr "" + +#: gnu/packages/compression.scm:271 +msgid "" +"lbzip2 is a multi-threaded compression utility with support for the\n" +"bzip2 compressed file format. lbzip2 can process standard bz2 files in\n" +"parallel. It uses POSIX threading model (pthreads), which allows it to take\n" +"full advantage of symmetric multiprocessing (SMP) systems. It has been proven\n" +"to scale linearly, even to over one hundred processor cores. lbzip2 is fully\n" +"compatible with bzip2 – both at file format and command line level." +msgstr "" + +#: gnu/packages/compression.scm:301 msgid "Parallel bzip2 implementation" msgstr "" -#: gnu/packages/compression.scm:256 +#: gnu/packages/compression.scm:303 msgid "" "Pbzip2 is a parallel implementation of the bzip2 block-sorting file\n" "compressor that uses pthreads and achieves near-linear speedup on SMP machines.\n" @@ -1212,11 +1481,11 @@ msgid "" "compressed with pbzip2 can be decompressed with bzip2)." msgstr "" -#: gnu/packages/compression.scm:277 +#: gnu/packages/compression.scm:324 msgid "General-purpose data compression" msgstr "" -#: gnu/packages/compression.scm:279 +#: gnu/packages/compression.scm:326 msgid "" "XZ Utils is free general-purpose data compression software with high\n" "compression ratio. XZ Utils were written for POSIX-like systems, but also\n" @@ -1229,11 +1498,11 @@ msgid "" "than gzip and 15 % smaller output than bzip2." msgstr "" -#: gnu/packages/compression.scm:307 +#: gnu/packages/compression.scm:354 msgid "Data compression library suitable for real-time data de-/compression" msgstr "" -#: gnu/packages/compression.scm:309 +#: gnu/packages/compression.scm:356 msgid "" "LZO is a data compression library which is suitable for data\n" "de-/compression in real-time. This means it favours speed over\n" @@ -1243,11 +1512,11 @@ msgid "" "format are designed to be portable across platforms." msgstr "" -#: gnu/packages/compression.scm:332 +#: gnu/packages/compression.scm:379 msgid "Compress or expand files" msgstr "" -#: gnu/packages/compression.scm:334 +#: gnu/packages/compression.scm:381 msgid "" "Lzop is a file compressor which is very similar to gzip. Lzop uses the\n" "LZO data compression library for compression services, and its main advantages\n" @@ -1255,11 +1524,11 @@ msgid "" "some compression ratio)." msgstr "" -#: gnu/packages/compression.scm:353 +#: gnu/packages/compression.scm:400 msgid "Lossless data compressor based on the LZMA algorithm" msgstr "" -#: gnu/packages/compression.scm:355 +#: gnu/packages/compression.scm:402 msgid "" "Lzip is a lossless data compressor with a user interface similar to the\n" "one of gzip or bzip2. Lzip decompresses almost as fast as gzip and compresses\n" @@ -1267,11 +1536,11 @@ msgid "" "archiving. Lzip is a clean implementation of the LZMA algorithm." msgstr "" -#: gnu/packages/compression.scm:387 +#: gnu/packages/compression.scm:434 msgid "Archives in shell scripts, uuencode/uudecode" msgstr "" -#: gnu/packages/compression.scm:389 +#: gnu/packages/compression.scm:436 msgid "" "GNU sharutils is a package for creating and manipulating shell\n" "archives that can be readily emailed. A shell archive is a file that can be\n" @@ -1279,71 +1548,71 @@ msgid "" "This package is mostly for compatibility and historical interest." msgstr "" -#: gnu/packages/compression.scm:420 +#: gnu/packages/compression.scm:467 msgid "Library for SoundFont decompression" msgstr "" -#: gnu/packages/compression.scm:422 +#: gnu/packages/compression.scm:469 msgid "" "SfArkLib is a C++ library for decompressing SoundFont files compressed\n" "with the sfArk algorithm." msgstr "" -#: gnu/packages/compression.scm:454 +#: gnu/packages/compression.scm:502 msgid "Basic sfArk decompressor" msgstr "" -#: gnu/packages/compression.scm:455 +#: gnu/packages/compression.scm:503 msgid "" "SfArk extractor converts SoundFonts in the compressed legacy\n" "sfArk file format to the uncompressed sf2 format." msgstr "" -#: gnu/packages/compression.scm:472 +#: gnu/packages/compression.scm:520 msgid "Compression tools for some formats used by Microsoft" msgstr "" -#: gnu/packages/compression.scm:474 +#: gnu/packages/compression.scm:522 msgid "" "The purpose of libmspack is to provide both compression and\n" "decompression of some loosely related file formats used by Microsoft." msgstr "" -#: gnu/packages/compression.scm:493 +#: gnu/packages/compression.scm:541 msgid "Low-level interface to bzip2 compression library" msgstr "" -#: gnu/packages/compression.scm:494 +#: gnu/packages/compression.scm:542 msgid "" "This module provides a Perl interface to the bzip2\n" "compression library." msgstr "" -#: gnu/packages/compression.scm:528 +#: gnu/packages/compression.scm:576 msgid "Low-level interface to zlib compression library" msgstr "" -#: gnu/packages/compression.scm:529 +#: gnu/packages/compression.scm:577 msgid "" "This module provides a Perl interface to the zlib\n" "compression library." msgstr "" -#: gnu/packages/compression.scm:550 +#: gnu/packages/compression.scm:598 msgid "IO Interface to compressed files/buffers" msgstr "" -#: gnu/packages/compression.scm:551 +#: gnu/packages/compression.scm:599 msgid "" "IO-Compress provides a Perl interface to allow reading and\n" "writing of compressed data created with the zlib and bzip2 libraries." msgstr "" -#: gnu/packages/compression.scm:577 +#: gnu/packages/compression.scm:625 msgid "Compression algorithm focused on speed" msgstr "" -#: gnu/packages/compression.scm:578 +#: gnu/packages/compression.scm:626 msgid "" "LZ4 is a lossless compression algorithm, providing\n" "compression speed at 400 MB/s per core (0.16 Bytes/cycle). It also features an\n" @@ -1352,35 +1621,35 @@ msgid "" "time for compression ratio." msgstr "" -#: gnu/packages/compression.scm:618 -msgid "Tools to create and extract squashfs filesystems" +#: gnu/packages/compression.scm:667 +msgid "Tools to create and extract squashfs file systems" msgstr "" -#: gnu/packages/compression.scm:620 +#: gnu/packages/compression.scm:669 msgid "" -"Squashfs is a highly compressed read-only filesystem for Linux. It uses\n" +"Squashfs is a highly compressed read-only file system for Linux. It uses\n" "zlib to compress files, inodes, and directories. All blocks are packed to\n" "minimize the data overhead, and block sizes of between 4K and 1M are supported.\n" "It is intended to be used for archival use, for live CDs, and for embedded\n" "systems where low overhead is needed. This package allows you to create and\n" -"extract such filesystems." +"extract such file systems." msgstr "" -#: gnu/packages/compression.scm:657 +#: gnu/packages/compression.scm:706 msgid "Parallel implementation of gzip" msgstr "" -#: gnu/packages/compression.scm:659 +#: gnu/packages/compression.scm:708 msgid "" "This package provides a parallel implementation of gzip that exploits\n" "multiple processors and multiple cores when compressing data." msgstr "" -#: gnu/packages/compression.scm:683 +#: gnu/packages/compression.scm:732 msgid "Parallel indexing implementation of LZMA" msgstr "" -#: gnu/packages/compression.scm:685 +#: gnu/packages/compression.scm:734 msgid "" "The existing XZ Utils provide great compression in the .xz file format,\n" "but they produce just one big block of compressed data. Pixz instead produces\n" @@ -1389,53 +1658,145 @@ msgid "" "tarballs." msgstr "" -#: gnu/packages/databases.scm:75 +#: gnu/packages/compression.scm:775 +msgid "Implementation of the Brotli compression algorithm" +msgstr "" + +#: gnu/packages/compression.scm:777 +msgid "" +"Brotli is a general-purpose lossless compression algorithm. It is\n" +"similar in speed to deflate but offers denser compression. This package\n" +"provides encoder and a decoder libraries: libbrotlienc and libbrotlidec,\n" +"respectively, based on the reference implementation from Google." +msgstr "" + +#: gnu/packages/compression.scm:801 +msgid "Tool to unpack Cabinet archives" +msgstr "" + +#: gnu/packages/compression.scm:802 +msgid "Extracts files out of Microsoft Cabinet (.cab) archives" +msgstr "" + +#: gnu/packages/compression.scm:834 +msgid "Delta encoder for binary files" +msgstr "" + +#: gnu/packages/compression.scm:835 +msgid "" +"xdelta encodes only the differences between two binary files\n" +"using the VCDIFF algorithm and patch file format described in RFC 3284. It can\n" +"also be used to apply such patches. xdelta is similar to @command{diff} and\n" +"@command{patch}, but is not limited to plain text and does not generate\n" +"human-readable output." +msgstr "" + +#: gnu/packages/compression.scm:867 +msgid "Large file compressor with a very high compression ratio" +msgstr "" + +#: gnu/packages/compression.scm:868 +msgid "" +"lrzip is a compression utility that uses long-range\n" +"redundancy reduction to improve the subsequent compression ratio of\n" +"larger files. It can then further compress the result with the ZPAQ or\n" +"LZMA algorithms for maximum compression, or LZO for maximum speed. This\n" +"choice between size or speed allows for either better compression than\n" +"even LZMA can provide, or a higher speed than gzip while compressing as\n" +"well as bzip2." +msgstr "" + +#: gnu/packages/compression.scm:892 +msgid "Fast compressor/decompressor" +msgstr "" + +#: gnu/packages/compression.scm:893 +msgid "" +"Snappy is a compression/decompression library. It does not\n" +"aim for maximum compression, or compatibility with any other compression library;\n" +"instead, it aims for very high speeds and reasonable compression. For instance,\n" +"compared to the fastest mode of zlib, Snappy is an order of magnitude faster\n" +"for most inputs, but the resulting compressed files are anywhere from 20% to\n" +"100% bigger." +msgstr "" + +#: gnu/packages/compression.scm:960 +msgid "Command-line file archiver with high compression ratio" +msgstr "" + +#: gnu/packages/compression.scm:961 +msgid "" +"p7zip is a command-line port of 7-Zip, a file archiver that\n" +"handles the 7z format which features very high compression ratios." +msgstr "" + +#: gnu/packages/compression.scm:1000 +msgid "Compressed C++ iostream" +msgstr "" + +#: gnu/packages/compression.scm:1001 +msgid "" +"gzstream is a small library for providing zlib\n" +"functionality in a C++ iostream." +msgstr "" + +#: gnu/packages/databases.scm:116 +msgid "Clustered RDF storage and query engine" +msgstr "" + +#: gnu/packages/databases.scm:117 +msgid "" +"4store is a RDF/SPARQL store written in C, supporting\n" +"either single machines or networked clusters." +msgstr "" + +#: gnu/packages/databases.scm:136 msgid "Hash library of database functions compatible with traditional dbm" msgstr "" -#: gnu/packages/databases.scm:77 +#: gnu/packages/databases.scm:138 msgid "" "GDBM is a library for manipulating hashed databases. It is used to\n" "store key/value pairs in a file in a manner similar to the Unix dbm library\n" "and provides interfaces to the traditional file format." msgstr "" -#: gnu/packages/databases.scm:123 +#: gnu/packages/databases.scm:189 msgid "Berkeley database" msgstr "" -#: gnu/packages/databases.scm:125 +#: gnu/packages/databases.scm:191 msgid "" "Berkeley DB is an embeddable database allowing developers the choice of\n" "SQL, Key/Value, XML/XQuery or Java Object storage for their data model." msgstr "" -#: gnu/packages/databases.scm:199 +#: gnu/packages/databases.scm:278 msgid "Fast, easy to use, and popular database" msgstr "" -#: gnu/packages/databases.scm:201 +#: gnu/packages/databases.scm:280 msgid "" "MySQL is a fast, reliable, and easy to use relational database\n" "management system that supports the standardized Structured Query\n" "Language." msgstr "" -#: gnu/packages/databases.scm:268 +#: gnu/packages/databases.scm:347 msgid "SQL database server" msgstr "" -#: gnu/packages/databases.scm:270 +#: gnu/packages/databases.scm:349 msgid "" "MariaDB is a multi-user and multi-threaded SQL database server, designed\n" "as a drop-in replacement of MySQL." msgstr "" -#: gnu/packages/databases.scm:290 +#: gnu/packages/databases.scm:379 msgid "Powerful object-relational database system" msgstr "" -#: gnu/packages/databases.scm:292 +#: gnu/packages/databases.scm:381 msgid "" "PostgreSQL is a powerful object-relational database system. It is fully\n" "ACID compliant, has full support for foreign keys, joins, views, triggers, and\n" @@ -1445,11 +1806,11 @@ msgid "" "pictures, sounds, or video." msgstr "" -#: gnu/packages/databases.scm:330 +#: gnu/packages/databases.scm:436 msgid "Manipulate plain text files as databases" msgstr "" -#: gnu/packages/databases.scm:332 +#: gnu/packages/databases.scm:438 msgid "" "GNU Recutils is a set of tools and libraries for creating and\n" "manipulating text-based, human-editable databases. Despite being text-based,\n" @@ -1458,11 +1819,26 @@ msgid "" "types are supported, as is encryption." msgstr "" -#: gnu/packages/databases.scm:384 +#: gnu/packages/databases.scm:495 +msgid "Command-line tool for accessing SPARQL endpoints over HTTP" +msgstr "" + +#: gnu/packages/databases.scm:496 +msgid "" +"Sparql-query is a command-line tool for accessing SPARQL\n" +"endpoints over HTTP. It has been intentionally designed to 'feel' similar to\n" +"tools for interrogating SQL databases. For example, you can enter a query over\n" +"several lines, using a semi-colon at the end of a line to indicate the end of\n" +"your query. It also supports readline so that you can more easily recall and\n" +"edit previous queries, even across sessions. It can be used non-interactively,\n" +"for example from a shell script." +msgstr "" + +#: gnu/packages/databases.scm:553 msgid "The SQLite database management system" msgstr "" -#: gnu/packages/databases.scm:386 +#: gnu/packages/databases.scm:555 msgid "" "SQLite is a software library that implements a self-contained, serverless,\n" "zero-configuration, transactional SQL database engine. SQLite is the most\n" @@ -1470,11 +1846,11 @@ msgid "" "is in the public domain." msgstr "" -#: gnu/packages/databases.scm:421 +#: gnu/packages/databases.scm:610 msgid "Trivial database" msgstr "" -#: gnu/packages/databases.scm:423 +#: gnu/packages/databases.scm:612 msgid "" "TDB is a Trivial Database. In concept, it is very much like GDBM,\n" "and BSD's DB except that it allows multiple simultaneous writers and uses\n" @@ -1482,19 +1858,19 @@ msgid "" "extremely small." msgstr "" -#: gnu/packages/databases.scm:442 +#: gnu/packages/databases.scm:631 msgid "Database independent interface for Perl" msgstr "" -#: gnu/packages/databases.scm:443 +#: gnu/packages/databases.scm:632 msgid "This package provides an database interface for Perl." msgstr "" -#: gnu/packages/databases.scm:490 +#: gnu/packages/databases.scm:679 msgid "Extensible and flexible object <-> relational mapper" msgstr "" -#: gnu/packages/databases.scm:491 +#: gnu/packages/databases.scm:680 msgid "" "An SQL to OO mapper with an object API inspired by\n" "Class::DBI (with a compatibility layer as a springboard for porting) and a\n" @@ -1506,21 +1882,21 @@ msgid "" "\"ORDER BY\" and \"HAVING\" support." msgstr "" -#: gnu/packages/databases.scm:521 +#: gnu/packages/databases.scm:710 msgid "Cursor with built-in caching support" msgstr "" -#: gnu/packages/databases.scm:522 +#: gnu/packages/databases.scm:711 msgid "" "DBIx::Class::Cursor::Cached provides a cursor class with\n" "built-in caching support." msgstr "" -#: gnu/packages/databases.scm:542 +#: gnu/packages/databases.scm:731 msgid "Introspect many-to-many relationships" msgstr "" -#: gnu/packages/databases.scm:543 +#: gnu/packages/databases.scm:732 msgid "" "Because the many-to-many relationships are not real\n" "relationships, they can not be introspected with DBIx::Class. Many-to-many\n" @@ -1530,26 +1906,34 @@ msgid "" "introspected and examined." msgstr "" -#: gnu/packages/databases.scm:600 +#: gnu/packages/databases.scm:789 msgid "Create a DBIx::Class::Schema based on a database" msgstr "Opret et DBIx::Class::Schema baseret på en database" -#: gnu/packages/databases.scm:601 +#: gnu/packages/databases.scm:790 msgid "" "DBIx::Class::Schema::Loader automates the definition of a\n" "DBIx::Class::Schema by scanning database table definitions and setting up the\n" "columns, primary keys, unique constraints and relationships." msgstr "" -#: gnu/packages/databases.scm:625 +#: gnu/packages/databases.scm:814 msgid "DBI PostgreSQL interface" msgstr "DBI PostgreSQL-grænseflade" -#: gnu/packages/databases.scm:648 +#: gnu/packages/databases.scm:815 +msgid "" +"This package provides a PostgreSQL driver for the Perl5\n" +"@dfn{Database Interface} (DBI)." +msgstr "" +"Denne pakke tilbyder en PostgreSQL-driver for Perl5-\n" +"@dfn{Database Interface} (DBI)." + +#: gnu/packages/databases.scm:838 msgid "DBI MySQL interface" msgstr "DBI MySQL-grænseflade" -#: gnu/packages/databases.scm:649 +#: gnu/packages/databases.scm:839 msgid "" "This package provides a MySQL driver for the Perl5\n" "@dfn{Database Interface} (DBI)." @@ -1557,11 +1941,11 @@ msgstr "" "Denne pakke tilbyder en MySQL-driver for Perl5-\n" "@dfn{Database Interface} (DBI)." -#: gnu/packages/databases.scm:668 +#: gnu/packages/databases.scm:858 msgid "SQlite interface for Perl" msgstr "SQlite-grænseflade for Perl" -#: gnu/packages/databases.scm:669 +#: gnu/packages/databases.scm:859 msgid "" "DBD::SQLite is a Perl DBI driver for SQLite, that includes\n" "the entire thing in the distribution. So in order to get a fast transaction\n" @@ -1569,11 +1953,11 @@ msgid "" "module, and nothing else." msgstr "" -#: gnu/packages/databases.scm:699 +#: gnu/packages/databases.scm:889 msgid "Generate SQL from Perl data structures" msgstr "Opret SQL fra Perldatastrukturer" -#: gnu/packages/databases.scm:700 +#: gnu/packages/databases.scm:890 msgid "" "This module was inspired by the excellent DBIx::Abstract.\n" "While based on the concepts used by DBIx::Abstract, the concepts used have\n" @@ -1583,43 +1967,43 @@ msgid "" "time your data changes." msgstr "" -#: gnu/packages/databases.scm:729 +#: gnu/packages/databases.scm:919 msgid "Split SQL code into atomic statements" msgstr "" -#: gnu/packages/databases.scm:730 +#: gnu/packages/databases.scm:920 msgid "" "This module tries to split any SQL code, even including\n" "non-standard extensions, into the atomic statements it is composed of." msgstr "" -#: gnu/packages/databases.scm:748 +#: gnu/packages/databases.scm:938 msgid "SQL tokenizer" msgstr "" -#: gnu/packages/databases.scm:749 +#: gnu/packages/databases.scm:939 msgid "" "SQL::Tokenizer is a tokenizer for SQL queries. It does not\n" "claim to be a parser or query verifier. It just creates sane tokens from a\n" "valid SQL query." msgstr "" -#: gnu/packages/databases.scm:766 +#: gnu/packages/databases.scm:957 msgid "Data source abstraction library" msgstr "Abstraktionsbibliotek for datakilde" -#: gnu/packages/databases.scm:767 +#: gnu/packages/databases.scm:958 msgid "" "Unixodbc is a library providing an API with which to access\n" "data sources. Data sources include SQL Servers and any software with an ODBC\n" "Driver." msgstr "" -#: gnu/packages/databases.scm:791 +#: gnu/packages/databases.scm:982 msgid "In-memory key/value and document store" msgstr "" -#: gnu/packages/databases.scm:793 +#: gnu/packages/databases.scm:984 msgid "" "UnQLite is an in-process software library which implements a\n" "self-contained, serverless, zero-configuration, transactional NoSQL\n" @@ -1628,33 +2012,99 @@ msgid "" "similar to BerkeleyDB, LevelDB, etc." msgstr "" -#: gnu/packages/databases.scm:820 +#: gnu/packages/databases.scm:1012 msgid "Key-value cache and store" msgstr "" -#: gnu/packages/databases.scm:821 +#: gnu/packages/databases.scm:1013 msgid "" "Redis is an advanced key-value cache and store. Redis\n" "supports many data structures including strings, hashes, lists, sets, sorted\n" "sets, bitmaps and hyperloglogs." msgstr "" -#: gnu/packages/databases.scm:847 +#: gnu/packages/databases.scm:1039 msgid "Kyoto Cabinet is a modern implementation of the DBM database" msgstr "" -#: gnu/packages/databases.scm:849 +#: gnu/packages/databases.scm:1041 msgid "" "Kyoto Cabinet is a standalone file-based database that supports Hash\n" "and B+ Tree data storage models. It is a fast key-value lightweight\n" "database and supports many programming languages. It is a NoSQL database." msgstr "" -#: gnu/packages/debug.scm:74 +#: gnu/packages/databases.scm:1073 +msgid "NoSQL data engine" +msgstr "" + +#: gnu/packages/databases.scm:1075 +msgid "" +"WiredTiger is an extensible platform for data management. It supports\n" +"row-oriented storage (where all columns of a row are stored together),\n" +"column-oriented storage (where columns are stored in groups, allowing for\n" +"more efficient access and storage of column subsets) and log-structured merge\n" +"trees (LSM), for sustained throughput under random insert workloads." +msgstr "" + +#: gnu/packages/databases.scm:1111 +msgid "Perl5 access to Berkeley DB version 1.x" +msgstr "" + +#: gnu/packages/databases.scm:1113 +msgid "The DB::File module provides Perl bindings to the Berkeley DB version 1.x." +msgstr "" + +#: gnu/packages/databases.scm:1140 +msgid "Lightning memory-mapped database library" +msgstr "" + +#: gnu/packages/databases.scm:1141 +msgid "Lightning memory-mapped database library." +msgstr "" + +#: gnu/packages/databases.scm:1162 +msgid "C++ connector for PostgreSQL" +msgstr "" + +#: gnu/packages/databases.scm:1164 +msgid "" +"Libpqxx is a C++ library to enable user programs to communicate with the\n" +"PostgreSQL database back-end. The database back-end can be local or it may be\n" +"on another machine, accessed via TCP/IP." +msgstr "" + +#: gnu/packages/databases.scm:1187 +msgid "Small object-relational mapping utility" +msgstr "" + +#: gnu/packages/databases.scm:1189 +msgid "" +"Peewee is a simple and small ORM (object-relation mapping) tool. Peewee\n" +"handles converting between pythonic values and those used by databases, so you\n" +"can use Python types in your code without having to worry. It has built-in\n" +"support for sqlite, mysql and postgresql. If you already have a database, you\n" +"can autogenerate peewee models using @code{pwiz}, a model generator." +msgstr "" + +#: gnu/packages/databases.scm:1236 +msgid "Library providing transparent encryption of SQLite database files" +msgstr "" + +#: gnu/packages/databases.scm:1237 +msgid "" +"SQLCipher is an implementation of SQLite, extended to\n" +"provide transparent 256-bit AES encryption of database files. Pages are\n" +"encrypted before being written to disk and are decrypted when read back. It’s\n" +"well suited for protecting embedded application databases and for mobile\n" +"development." +msgstr "" + +#: gnu/packages/debug.scm:78 msgid "Heuristical file minimizer" msgstr "" -#: gnu/packages/debug.scm:76 +#: gnu/packages/debug.scm:80 msgid "" "Delta assists you in minimizing \"interesting\" files subject to a test\n" "of their interestingness. A common such situation is when attempting to\n" @@ -1662,11 +2112,11 @@ msgid "" "program to exhibit a bug." msgstr "" -#: gnu/packages/debug.scm:135 +#: gnu/packages/debug.scm:134 msgid "Reducer for interesting code" msgstr "" -#: gnu/packages/debug.scm:137 +#: gnu/packages/debug.scm:136 msgid "" "C-Reduce is a tool that takes a large C or C++ program that has a\n" "property of interest (such as triggering a compiler bug) and automatically\n" @@ -1675,11 +2125,11 @@ msgid "" "tools that process C/C++ code." msgstr "" -#: gnu/packages/debug.scm:249 +#: gnu/packages/debug.scm:251 msgid "Security-oriented fuzzer" msgstr "" -#: gnu/packages/debug.scm:251 +#: gnu/packages/debug.scm:253 msgid "" "American fuzzy lop is a security-oriented fuzzer that employs a novel\n" "type of compile-time instrumentation and genetic algorithms to automatically\n" @@ -1690,35 +2140,47 @@ msgid "" "down the road." msgstr "" -#: gnu/packages/dejagnu.scm:78 -msgid "GNU software testing framework" +#: gnu/packages/debug.scm:305 +msgid "Expose race conditions in Makefiles" msgstr "" -#: gnu/packages/dejagnu.scm:80 +#: gnu/packages/debug.scm:307 msgid "" -"DejaGnu is a framework for testing software. In effect, it serves as\n" -"a front-end for all tests written for a program. Thus, each program can have\n" -"multiple test suites, which are then all managed by a single harness." +"Stress Make is a customized GNU Make that explicitely managess the\n" +"order in which concurrent jobs are run in order to provoke erroneous behavior\n" +"into becoming manifest. It can run jobs in the order they're launched, in\n" +"backwards order, or in random order. The thought is that if code builds\n" +"correctly with Stress Make then it is likely that the @code{Makefile} contains\n" +"no race conditions." msgstr "" -#: gnu/packages/feh.scm:54 -msgid "Fast and light imlib2-based image viewer" -msgstr "Hurtig og simpel imlib2-baseret billedfremviser" +#: gnu/packages/debug.scm:334 +msgid "Transparent application input fuzzer" +msgstr "" -#: gnu/packages/feh.scm:56 +#: gnu/packages/debug.scm:335 msgid "" -"feh is an X11 image viewer aimed mostly at console users.\n" -"Unlike most other viewers, it does not have a fancy GUI, but simply\n" -"displays images. It can also be used to set the desktop wallpaper.\n" -"It is controlled via commandline arguments and configurable key/mouse\n" -"actions." +"Zzuf is a transparent application input fuzzer. It works by\n" +"intercepting file operations and changing random bits in the program's\n" +"input. Zzuf's behaviour is deterministic, making it easy to reproduce bugs." +msgstr "" + +#: gnu/packages/dejagnu.scm:77 +msgid "GNU software testing framework" +msgstr "" + +#: gnu/packages/dejagnu.scm:79 +msgid "" +"DejaGnu is a framework for testing software. In effect, it serves as\n" +"a front-end for all tests written for a program. Thus, each program can have\n" +"multiple test suites, which are then all managed by a single harness." msgstr "" -#: gnu/packages/games.scm:119 +#: gnu/packages/games.scm:137 msgid "Backgammon game" msgstr "Backgammonspil" -#: gnu/packages/games.scm:120 +#: gnu/packages/games.scm:138 msgid "" "The GNU backgammon application can be used for playing, analyzing and\n" "teaching the game. It has an advanced evaluation engine based on artificial\n" @@ -1732,11 +2194,11 @@ msgstr "" "avancerede spillere. Udover grænsefladen for kommandolinjen har\n" "spillet også en attraktiv 3D-repræsentation af brættet." -#: gnu/packages/games.scm:149 +#: gnu/packages/games.scm:167 msgid "3d Rubik's cube game" msgstr "" -#: gnu/packages/games.scm:151 +#: gnu/packages/games.scm:169 msgid "" "GNUbik is a puzzle game in which you must manipulate a cube to make\n" "each of its faces have a uniform color. The game is customizable, allowing\n" @@ -1745,11 +2207,11 @@ msgid "" "scriptable with Guile." msgstr "" -#: gnu/packages/games.scm:201 +#: gnu/packages/games.scm:221 msgid "GNU/Linux port of the indie game \"l'Abbaye des Morts\"" msgstr "GNU/Linux-port af indiespillet »l'Abbaye des Morts«" -#: gnu/packages/games.scm:202 +#: gnu/packages/games.scm:222 msgid "" "L'Abbaye des Morts is a 2D platform game set in 13th century\n" "France. The Cathars, who preach about good Christian beliefs, were being\n" @@ -1758,11 +2220,11 @@ msgid "" "that beneath its ruins lay buried an ancient evil." msgstr "" -#: gnu/packages/games.scm:245 +#: gnu/packages/games.scm:266 msgid "Lemmings clone" msgstr "Lemmingsklon" -#: gnu/packages/games.scm:247 +#: gnu/packages/games.scm:268 msgid "" "Pingus is a free Lemmings-like puzzle game in which the player takes\n" "command of a bunch of small animals and has to guide them through levels.\n" @@ -1772,22 +2234,22 @@ msgid "" "level's exit. The game is presented in a 2D side view." msgstr "" -#: gnu/packages/games.scm:269 +#: gnu/packages/games.scm:290 msgid "Convert English text to humorous dialects" msgstr "" -#: gnu/packages/games.scm:270 +#: gnu/packages/games.scm:291 msgid "" "The GNU Talk Filters are programs that convert English text\n" "into stereotyped or otherwise humorous dialects. The filters are provided as\n" "a C library, so they can easily be integrated into other programs." msgstr "" -#: gnu/packages/games.scm:302 +#: gnu/packages/games.scm:323 msgid "Simulate the display from \"The Matrix\"" msgstr "" -#: gnu/packages/games.scm:303 +#: gnu/packages/games.scm:324 msgid "" "CMatrix simulates the display from \"The Matrix\" and is\n" "based on the screensaver from the movie's website. It works with terminal\n" @@ -1795,22 +2257,22 @@ msgid "" "asynchronously and at a user-defined speed." msgstr "" -#: gnu/packages/games.scm:323 +#: gnu/packages/games.scm:344 msgid "Full chess implementation" msgstr "Fuld skakimplementering" -#: gnu/packages/games.scm:324 +#: gnu/packages/games.scm:345 msgid "" "GNU Chess is a chess engine. It allows you to compete\n" "against the computer in a game of chess, either through the default terminal\n" "interface or via an external visual interface such as GNU XBoard." msgstr "" -#: gnu/packages/games.scm:352 +#: gnu/packages/games.scm:373 msgid "Twisted adventures of young pig farmer Dink Smallwood" msgstr "" -#: gnu/packages/games.scm:354 +#: gnu/packages/games.scm:375 msgid "" "GNU FreeDink is a free and portable re-implementation of the engine\n" "for the role-playing game Dink Smallwood. It supports not only the original\n" @@ -1818,19 +2280,19 @@ msgid "" "To that extent, it also includes a front-end for managing all of your D-Mods." msgstr "" -#: gnu/packages/games.scm:376 +#: gnu/packages/games.scm:397 msgid "Game data for GNU Freedink" msgstr "Spildata for GNU Freedink" -#: gnu/packages/games.scm:378 +#: gnu/packages/games.scm:399 msgid "This package contains the game data of GNU Freedink." msgstr "Denne pakke indeholder spildataen for GNU Freedink." -#: gnu/packages/games.scm:430 +#: gnu/packages/games.scm:451 msgid "Graphical user interface for chess programs" msgstr "Grafisk brugerflade for skakprogrammer" -#: gnu/packages/games.scm:431 +#: gnu/packages/games.scm:452 msgid "" "GNU XBoard is a graphical board for all varieties of chess,\n" "including international chess, xiangqi (Chinese chess), shogi (Japanese chess)\n" @@ -1839,11 +2301,11 @@ msgid "" "Portable Game Notation." msgstr "" -#: gnu/packages/games.scm:484 +#: gnu/packages/games.scm:505 msgid "Ball and paddle game" msgstr "" -#: gnu/packages/games.scm:485 +#: gnu/packages/games.scm:506 msgid "" "XBoing is a blockout type game where you have a paddle which\n" "you control to bounce a ball around the game zone destroying blocks with a\n" @@ -1851,11 +2313,11 @@ msgid "" "destroy, the better your score. The person with the highest score wins." msgstr "" -#: gnu/packages/games.scm:517 +#: gnu/packages/games.scm:538 msgid "Typing tutor" msgstr "" -#: gnu/packages/games.scm:519 +#: gnu/packages/games.scm:540 msgid "" "GNU Typist is a universal typing tutor. It can be used to learn and\n" "practice touch-typing. Several tutorials are included; in addition to\n" @@ -1864,11 +2326,11 @@ msgid "" "are primarily in English, however some in other languages are provided." msgstr "" -#: gnu/packages/games.scm:572 +#: gnu/packages/games.scm:587 msgid "3D game engine written in C++" msgstr "3D-spilmotor skrevet i C++" -#: gnu/packages/games.scm:574 +#: gnu/packages/games.scm:589 msgid "" "The Irrlicht Engine is a high performance realtime 3D engine written in\n" "C++. Features include an OpenGL renderer, extensible materials, scene graph\n" @@ -1876,11 +2338,11 @@ msgid "" "for common mesh file formats, and collision detection." msgstr "" -#: gnu/packages/games.scm:626 +#: gnu/packages/games.scm:641 msgid "2D space shooter" msgstr "2D-rumskyder" -#: gnu/packages/games.scm:628 +#: gnu/packages/games.scm:643 msgid "" "M.A.R.S. is a 2D space shooter with pretty visual effects and\n" "attractive physics. Players can battle each other or computer controlled\n" @@ -1888,19 +2350,19 @@ msgid "" "match, cannon keep, and grave-itation pit." msgstr "" -#: gnu/packages/games.scm:669 +#: gnu/packages/games.scm:684 msgid "Main game data for the Minetest game engine" msgstr "Spildata for spilmotoren Minetest" -#: gnu/packages/games.scm:671 +#: gnu/packages/games.scm:686 msgid "Game data for the Minetest infinite-world block sandox game." msgstr "" -#: gnu/packages/games.scm:723 +#: gnu/packages/games.scm:738 msgid "Infinite-world block sandbox game" msgstr "" -#: gnu/packages/games.scm:725 +#: gnu/packages/games.scm:740 msgid "" "Minetest is a sandbox construction game. Players can create and destroy\n" "various types of blocks in a three-dimensional open world. This allows\n" @@ -1909,11 +2371,11 @@ msgid "" "in different ways." msgstr "" -#: gnu/packages/games.scm:764 +#: gnu/packages/games.scm:779 msgid "Curses Implementation of the Glk API" msgstr "" -#: gnu/packages/games.scm:766 +#: gnu/packages/games.scm:781 msgid "" "Glk defines a portable API for applications with text UIs. It was\n" "primarily designed for interactive fiction, but it should be suitable for many\n" @@ -1922,11 +2384,11 @@ msgid "" "using the curses.h library for screen control." msgstr "" -#: gnu/packages/games.scm:803 +#: gnu/packages/games.scm:818 msgid "Interpreter for Glulx VM" msgstr "Fortolker for Glulx VM" -#: gnu/packages/games.scm:805 +#: gnu/packages/games.scm:820 msgid "" "Glulx is a 32-bit portable virtual machine intended for writing and\n" "playing interactive fiction. It was designed by Andrew Plotkin to relieve\n" @@ -1934,22 +2396,22 @@ msgid "" "reference interpreter, using Glk API." msgstr "" -#: gnu/packages/games.scm:841 +#: gnu/packages/games.scm:856 msgid "Z-machine interpreter" msgstr "" -#: gnu/packages/games.scm:843 +#: gnu/packages/games.scm:858 msgid "" "Fizmo is a console-based Z-machine interpreter. It is used to play\n" "interactive fiction, also known as text adventures, which were implemented\n" "either by Infocom or created using the Inform compiler." msgstr "" -#: gnu/packages/games.scm:893 +#: gnu/packages/games.scm:908 msgid "Reference frontend for the libretro API" msgstr "" -#: gnu/packages/games.scm:895 +#: gnu/packages/games.scm:910 msgid "" "Libretro is a simple but powerful development interface that allows for\n" "the easy creation of emulators, games and multimedia applications that can plug\n" @@ -1958,11 +2420,11 @@ msgid "" "multi-system game/emulator system." msgstr "" -#: gnu/packages/games.scm:915 +#: gnu/packages/games.scm:930 msgid "Play the game of Go" msgstr "Spil Go" -#: gnu/packages/games.scm:917 +#: gnu/packages/games.scm:932 msgid "" "GNU Go is a program that plays the game of Go, in which players\n" "place stones on a grid to form territory or capture other stones. While\n" @@ -1973,11 +2435,11 @@ msgid "" "Protocol)." msgstr "" -#: gnu/packages/games.scm:967 +#: gnu/packages/games.scm:960 msgid "High speed arctic racing game based on Tux Racer" msgstr "" -#: gnu/packages/games.scm:969 +#: gnu/packages/games.scm:962 msgid "" "Extreme Tux Racer, or etracer as it is called for short, is\n" "a simple OpenGL racing game featuring Tux, the Linux mascot. The goal of the\n" @@ -1990,11 +2452,23 @@ msgid "" "This game is based on the GPL version of the famous game TuxRacer." msgstr "" -#: gnu/packages/games.scm:1007 +#: gnu/packages/games.scm:1042 +msgid "3D kart racing game" +msgstr "" + +#: gnu/packages/games.scm:1043 +msgid "" +"SuperTuxKart is a 3D kart racing game, with a focus on\n" +"having fun over realism. You can play with up to 4 friends on one PC, racing\n" +"against each other or just trying to beat the computer; single-player mode is\n" +"also available." +msgstr "" + +#: gnu/packages/games.scm:1075 msgid "Game of jumping to the next floor, trying not to fall" msgstr "" -#: gnu/packages/games.scm:1009 +#: gnu/packages/games.scm:1077 msgid "" "GNUjump is a simple, yet addictive game in which you must jump from\n" "platform to platform to avoid falling, while the platforms drop at faster rates\n" @@ -2002,11 +2476,11 @@ msgid "" "falling, themeable graphics and sounds, and replays." msgstr "" -#: gnu/packages/games.scm:1050 +#: gnu/packages/games.scm:1120 msgid "Turn-based strategy game" msgstr "" -#: gnu/packages/games.scm:1052 +#: gnu/packages/games.scm:1122 msgid "" "The Battle for Wesnoth is a fantasy, turn based tactical strategy game,\n" "with several single player campaigns, and multiplayer games (both networked and\n" @@ -2018,11 +2492,11 @@ msgid "" "next campaign." msgstr "" -#: gnu/packages/games.scm:1096 +#: gnu/packages/games.scm:1166 msgid "X86 emulator with CGA/EGA/VGA/etc. graphics and sound" msgstr "X86-emulator med CGA/EGA/VGA/etc. grafik og lyd" -#: gnu/packages/games.scm:1097 +#: gnu/packages/games.scm:1167 msgid "" "DOSBox is a DOS-emulator that uses the SDL library. DOSBox\n" "also emulates CPU:286/386 realmode/protected mode, Directory\n" @@ -2031,22 +2505,22 @@ msgid "" "older games." msgstr "" -#: gnu/packages/games.scm:1142 +#: gnu/packages/games.scm:1212 msgid "Mouse and keyboard discovery for children" msgstr "" -#: gnu/packages/games.scm:1144 +#: gnu/packages/games.scm:1214 msgid "" "Gamine is a game designed for young children who are learning to use the\n" "mouse and keyboard. The child uses the mouse to draw colored dots and lines\n" "on the screen and keyboard to display letters." msgstr "" -#: gnu/packages/games.scm:1175 +#: gnu/packages/games.scm:1246 msgid "Puzzle game with a cat in lead role" msgstr "" -#: gnu/packages/games.scm:1176 +#: gnu/packages/games.scm:1247 msgid "" "Project Raincat is a game developed by Carnegie Mellon\n" "students through GCS during the Fall 2008 semester. Raincat features game\n" @@ -2055,11 +2529,11 @@ msgid "" "is programmed in Haskell." msgstr "" -#: gnu/packages/games.scm:1211 +#: gnu/packages/games.scm:1282 msgid "Client for 'The Mana World' and similar games" msgstr "" -#: gnu/packages/games.scm:1213 +#: gnu/packages/games.scm:1284 msgid "" "ManaPlus is a 2D MMORPG client for game servers. It is the only\n" "fully supported client for @uref{http://www.themanaworld.org, The mana\n" @@ -2067,96 +2541,96 @@ msgid "" "@uref{http://landoffire.org, Land of fire}." msgstr "" -#: gnu/packages/games.scm:1263 +#: gnu/packages/games.scm:1334 msgid "Nintendo 64 emulator core library" msgstr "Nintendo 64-emulator - grundlæggende bibliotek" -#: gnu/packages/games.scm:1265 +#: gnu/packages/games.scm:1336 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "core library." msgstr "" -#: gnu/packages/games.scm:1309 gnu/packages/games.scm:1354 -#: gnu/packages/games.scm:1396 gnu/packages/games.scm:1438 -#: gnu/packages/games.scm:1755 +#: gnu/packages/games.scm:1380 gnu/packages/games.scm:1425 +#: gnu/packages/games.scm:1467 gnu/packages/games.scm:1509 +#: gnu/packages/games.scm:1825 msgid "Mupen64Plus SDL input plugin" msgstr "" -#: gnu/packages/games.scm:1311 +#: gnu/packages/games.scm:1382 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "SDL audio plugin." msgstr "" -#: gnu/packages/games.scm:1356 +#: gnu/packages/games.scm:1427 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "SDL input plugin." msgstr "" -#: gnu/packages/games.scm:1398 +#: gnu/packages/games.scm:1469 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "high-level emulation (HLE) RSP processor plugin." msgstr "" -#: gnu/packages/games.scm:1440 +#: gnu/packages/games.scm:1511 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Z64 RSP processor plugin." msgstr "" -#: gnu/packages/games.scm:1484 gnu/packages/games.scm:1538 -#: gnu/packages/games.scm:1588 gnu/packages/games.scm:1636 +#: gnu/packages/games.scm:1555 gnu/packages/games.scm:1609 +#: gnu/packages/games.scm:1659 gnu/packages/games.scm:1707 msgid "Mupen64Plus Rice Video plugin" msgstr "" -#: gnu/packages/games.scm:1486 +#: gnu/packages/games.scm:1557 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Arachnoid video plugin." msgstr "" -#: gnu/packages/games.scm:1540 +#: gnu/packages/games.scm:1611 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Glide64 video plugin." msgstr "" -#: gnu/packages/games.scm:1590 +#: gnu/packages/games.scm:1661 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Glide64MK2 video plugin." msgstr "" -#: gnu/packages/games.scm:1638 +#: gnu/packages/games.scm:1709 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Rice Video plugin." msgstr "" -#: gnu/packages/games.scm:1690 +#: gnu/packages/games.scm:1761 msgid "Mupen64Plus Z64 video plugin" msgstr "" -#: gnu/packages/games.scm:1692 +#: gnu/packages/games.scm:1763 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" "Z64 video plugin." msgstr "" -#: gnu/packages/games.scm:1757 +#: gnu/packages/games.scm:1827 msgid "" "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n" "which is capable of accurately playing many games. This package contains the\n" @@ -2164,22 +2638,22 @@ msgid "" "towards a working Mupen64Plus for casual users." msgstr "" -#: gnu/packages/games.scm:1821 +#: gnu/packages/games.scm:1884 msgid "Nintendo Entertainment System (NES/Famicom) emulator" msgstr "" -#: gnu/packages/games.scm:1823 +#: gnu/packages/games.scm:1886 msgid "" "Nestopia UE (Undead Edition) is a fork of the Nintendo Entertainment\n" "System (NES/Famicom) emulator Nestopia, with enhancements from members of the\n" "emulation community. It provides highly accurate emulation." msgstr "" -#: gnu/packages/games.scm:1852 +#: gnu/packages/games.scm:1916 msgid "Video game console emulator front-end" msgstr "" -#: gnu/packages/games.scm:1853 +#: gnu/packages/games.scm:1917 msgid "" "EmulationStation provides a graphical front-end to a large\n" "number of video game console emulators. It features an interface that is\n" @@ -2187,63 +2661,288 @@ msgid "" "and a game metadata scraper." msgstr "" -#: gnu/packages/games.scm:1893 +#: gnu/packages/games.scm:1969 +msgid "Transportation economics simulator" +msgstr "" + +#: gnu/packages/games.scm:1970 +msgid "" +"OpenTTD is a game in which you transport goods and\n" +"passengers by land, water and air. It is a re-implementation of Transport\n" +"Tycoon Deluxe with many enhancements including multiplayer mode,\n" +"internationalization support, conditional orders and the ability to clone,\n" +"autoreplace and autoupdate vehicles. This package only includes the game engine. When you start\n" +"it you will be prompted to download a graphics set." +msgstr "" + +#: gnu/packages/games.scm:2025 msgid "Pinball simulator" msgstr "Pinball-simulator" -#: gnu/packages/games.scm:1894 +#: gnu/packages/games.scm:2026 msgid "" "The Emilia Pinball Project is a pinball simulator. There\n" "are only two levels to play with, but they are very addictive." msgstr "" -#: gnu/packages/games.scm:1915 +#: gnu/packages/games.scm:2047 msgid "Board game inspired by The Settlers of Catan" msgstr "Brætspil inspireret af The Settlers of Catan" -#: gnu/packages/games.scm:1916 +#: gnu/packages/games.scm:2048 msgid "" "Pioneers is an emulation of the board game The Settlers of\n" "Catan. It can be played on a local network, on the internet, and with AI\n" "players." msgstr "" -#: gnu/packages/games.scm:1950 +#: gnu/packages/games.scm:2082 msgid "Nintendo DS emulator" msgstr "Nintendo DS-emulator" -#: gnu/packages/games.scm:1952 +#: gnu/packages/games.scm:2084 msgid "DeSmuME is an emulator for the Nintendo DS handheld gaming console." msgstr "DeSmuME er en emulator for den håndholdte spilkonsol Nintendo DS." -#: gnu/packages/gcc.scm:313 -msgid "GNU Compiler Collection" +#: gnu/packages/games.scm:2122 +msgid "Logic puzzle game" +msgstr "" + +#: gnu/packages/games.scm:2123 +msgid "" +"The goal of this logic game is to open all cards in a 6x6\n" +"grid, using a number of hints as to their relative position. The game idea\n" +"is attributed to Albert Einstein." +msgstr "" + +#: gnu/packages/games.scm:2152 +msgid "MUD and telnet client" +msgstr "" + +#: gnu/packages/games.scm:2154 +msgid "" +"POWWOW is a client software which can be used for telnet as well as for\n" +"@dfn{Multi-User Dungeon} (MUD). Additionally it can serve as a nice client for\n" +"the chat server psyced with the specific config located at\n" +"http://lavachat.symlynx.com/unix/" +msgstr "" + +#: gnu/packages/games.scm:2296 +msgid "Arena shooter derived from the Cube 2 engine" +msgstr "Arenaskydespil afledt fra Cube 2-motoren" + +#: gnu/packages/games.scm:2298 +msgid "" +"Red Eclipse is an arena shooter, created from the Cube2 engine.\n" +"Offering an innovative parkour system and distinct but all potent weapons,\n" +"Red Eclipse provides fast paced and accessible gameplay." +msgstr "" + +#: gnu/packages/games.scm:2392 +msgid "Nintendo multi-system emulator" +msgstr "Nintendo multi-system-emulator" + +#: gnu/packages/games.scm:2394 +msgid "" +"higan (formerly bsnes) is an emulator for multiple Nintendo video game\n" +"consoles, including the Nintendo Entertainment System (NES/Famicom), Super\n" +"Nintendo Entertainment System (SNES/Super Famicom), Game Boy, Game Boy\n" +"Color (GBC), and Game Boy Advance (GBA). It also supports the subsystems\n" +"Super Game Boy, BS-X Satellaview, and Sufami Turbo." +msgstr "" + +#: gnu/packages/games.scm:2454 +msgid "Text adventure game" +msgstr "" + +#: gnu/packages/games.scm:2456 +msgid "" +"Grue Hunter is a text adventure game written in Perl. You must make\n" +"your way through an underground cave system in search of the Grue. Can you\n" +"capture it and get out alive?" +msgstr "" + +#: gnu/packages/games.scm:2505 +msgid "3D Real-time strategy and real-time tactics game" +msgstr "" + +#: gnu/packages/games.scm:2507 +msgid "" +"Warzone 2100 offers campaign, multi-player, and single-player skirmish\n" +"modes. An extensive tech tree with over 400 different technologies, combined\n" +"with the unit design system, allows for a wide variety of possible units and\n" +"tactics." +msgstr "" + +#: gnu/packages/games.scm:2550 +msgid "2D scrolling shooter game" +msgstr "2D-rullende skydespil" + +#: gnu/packages/games.scm:2552 +msgid "" +"In the year 2579, the intergalactic weapons corporation, WEAPCO, has\n" +"dominated the galaxy. Guide Chris Bainfield and his friend Sid Wilson on\n" +"their quest to liberate the galaxy from the clutches of WEAPCO. Along the\n" +"way, you will encounter new foes, make new allies, and assist local rebels\n" +"in strikes against the evil corporation." +msgstr "" + +#: gnu/packages/games.scm:2583 +msgid "Fast-paced, arcade-style, top-scrolling space shooter" +msgstr "" + +#: gnu/packages/games.scm:2585 +msgid "" +"In this game you are the captain of the cargo ship Chromium B.S.U. and\n" +"are responsible for delivering supplies to the troops on the front line. Your\n" +"ship has a small fleet of robotic fighters which you control from the relative\n" +"safety of the Chromium vessel." +msgstr "" + +#: gnu/packages/games.scm:2659 +msgid "Drawing software for children" +msgstr "" + +#: gnu/packages/games.scm:2661 +msgid "" +"Tux Paint is a free drawing program designed for young children (kids\n" +"ages 3 and up). It has a simple, easy-to-use interface; fun sound effects;\n" +"and an encouraging cartoon mascot who helps guide children as they use the\n" +"program. It provides a blank canvas and a variety of drawing tools to help\n" +"your child be creative." +msgstr "" + +#: gnu/packages/games.scm:2699 +msgid "Stamp images for Tux Paint" +msgstr "" + +#: gnu/packages/games.scm:2701 +msgid "" +"This package contains a set of \"Rubber Stamp\" images which can be used\n" +"with the \"Stamp\" tool within Tux Paint." +msgstr "" + +#: gnu/packages/games.scm:2748 +msgid "Configure Tux Paint" +msgstr "Konfigurer Tux Paint" + +#: gnu/packages/games.scm:2750 +msgid "Tux Paint Config is a graphical configuration editor for Tux Paint." +msgstr "Tux Paint Config er et grafisk redigeringsprogram til konfigurationen for Tux Paint." + +#: gnu/packages/games.scm:2782 +msgid "2D platformer game" +msgstr "2D-platformsspil" + +#: gnu/packages/games.scm:2783 +msgid "" +"SuperTux is a free classic 2D jump'n run sidescroller game\n" +"in a style similar to the original Super Mario games covered under\n" +"the GNU GPL." +msgstr "" + +#: gnu/packages/games.scm:2817 +msgid "MUD client" +msgstr "MUD-klient" + +#: gnu/packages/games.scm:2819 +msgid "" +"TinTin++ is a MUD client which supports MCCP (Mud Client Compression Protocol),\n" +"MMCP (Mud Master Chat Protocol), xterm 256 colors, most TELNET options used by MUDs,\n" +"as well as those required to login via telnet on Linux / Mac OS X servers, and an\n" +"auto mapper with a VT100 map display." +msgstr "" + +#: gnu/packages/games.scm:2856 +msgid "Programming game" +msgstr "Programmeringsspil" + +#: gnu/packages/games.scm:2857 +msgid "" +"Learn programming, playing with ants and spider webs ;-)\n" +"Your robot ant can be programmed in many languages: OCaml, Python, C, C++,\n" +"Java, Ruby, Lua, JavaScript, Pascal, Perl, Scheme, Vala, Prolog. Experienced\n" +"programmers may also add their own favorite language." +msgstr "" + +#: gnu/packages/games.scm:2901 +msgid "Keyboard mashing and doodling game for babies" +msgstr "" + +#: gnu/packages/games.scm:2902 +msgid "" +"Bambam is a simple baby keyboard (and gamepad) masher\n" +"application that locks the keyboard and mouse and instead displays bright\n" +"colors, pictures, and sounds." +msgstr "" + +#: gnu/packages/games.scm:2945 +msgid "Arcade-style fire fighting game" +msgstr "" + +#: gnu/packages/games.scm:2947 +msgid "" +"Mr. Rescue is an arcade styled 2d action game centered around evacuating\n" +"civilians from burning buildings. The game features fast paced fire\n" +"extinguishing action, intense boss battles, a catchy soundtrack and lots of\n" +"throwing people around in pseudo-randomly generated buildings." +msgstr "" + +#: gnu/packages/games.scm:3023 +msgid "Non-euclidean graphical rogue-like game" +msgstr "" + +#: gnu/packages/games.scm:3025 +msgid "" +"HyperRogue is a game in which the player collects treasures and fights\n" +"monsters -- rogue-like but for the fact that it is played on the hyperbolic\n" +"plane and not in euclidean space.\n" +"\n" +"In HyperRogue, the player can move through different parts of the world, which\n" +"are home to particular creatures and may be subject to own rules of \"physics\".\n" +"\n" +"While it can use ASCII characters to display the world the classical rogue\n" +"symbols, the game needs graphics to render the non-euclidean world." +msgstr "" + +#: gnu/packages/games.scm:3065 +msgid "Shooter with space station destruction" +msgstr "" + +#: gnu/packages/games.scm:3067 +msgid "" +"Kobo Deluxe is an enhanced version of Akira Higuchi's XKobo graphical game\n" +"for Un*x systems with X11." msgstr "" #: gnu/packages/gcc.scm:315 +msgid "GNU Compiler Collection" +msgstr "" + +#: gnu/packages/gcc.scm:317 msgid "" "GCC is the GNU Compiler Collection. It provides compiler front-ends\n" "for several languages, including C, C++, Objective-C, Fortran, Java, Ada, and\n" "Go. It also includes runtime support libraries for these languages." msgstr "" -#: gnu/packages/gcc.scm:380 +#: gnu/packages/gcc.scm:403 msgid "GNU C++ standard library" -msgstr "" +msgstr "GNU C++-standardbibliotek" -#: gnu/packages/gcc.scm:415 +#: gnu/packages/gcc.scm:438 msgid "Collection of subroutines used by various GNU programs" -msgstr "" +msgstr "Samling af underrutiner brugt af diverse GNU-programmer" -#: gnu/packages/gcc.scm:610 +#: gnu/packages/gcc.scm:692 msgid "GNU libstdc++ documentation" msgstr "" -#: gnu/packages/gcc.scm:678 +#: gnu/packages/gcc.scm:761 msgid "Manipulating sets and relations of integer points bounded by linear constraints" msgstr "" -#: gnu/packages/gcc.scm:681 +#: gnu/packages/gcc.scm:764 msgid "" "isl is a library for manipulating sets and relations of integer points\n" "bounded by linear constraints. Supported operations on sets include\n" @@ -2255,11 +2954,11 @@ msgid "" "dependence analysis and bounds on piecewise step-polynomials." msgstr "" -#: gnu/packages/gcc.scm:713 +#: gnu/packages/gcc.scm:796 msgid "Library to generate code for scanning Z-polyhedra" msgstr "" -#: gnu/packages/gcc.scm:715 +#: gnu/packages/gcc.scm:798 msgid "" "CLooG is a free software library to generate code for scanning\n" "Z-polyhedra. That is, it finds a code (e.g., in C, FORTRAN...) that\n" @@ -2274,11 +2973,11 @@ msgid "" "effective code." msgstr "" -#: gnu/packages/gcc.scm:770 +#: gnu/packages/gcc.scm:853 msgid "Reference manual for the C programming language" msgstr "" -#: gnu/packages/gcc.scm:772 +#: gnu/packages/gcc.scm:855 msgid "" "This is a reference manual for the C programming language, as\n" "implemented by the GNU C Compiler (gcc). As a reference, it is not intended\n" @@ -2286,60 +2985,38 @@ msgid "" "of the language. Library functions are not included." msgstr "" -#: gnu/packages/geeqie.scm:48 -msgid "Library and command-line utility to manage image metadata" -msgstr "Bibliotek og kommandolinjeredskab til at håndtere billedmetadata" - -#: gnu/packages/geeqie.scm:50 -msgid "" -"Exiv2 is a C++ library and a command line utility to manage image\n" -"metadata. It provides fast and easy read and write access to the Exif, IPTC\n" -"and XMP metadata of images in various formats." -msgstr "" - -#: gnu/packages/geeqie.scm:82 -msgid "Lightweight GTK+ based image viewer" -msgstr "" +#: gnu/packages/gettext.scm:90 +msgid "Tools and documentation for translation (used to build other packages)" +msgstr "Værktøjer og dokumentation for oversættelse (brugt til at bygge andre pakker)" -#: gnu/packages/geeqie.scm:84 +#: gnu/packages/gettext.scm:92 msgid "" -"Geeqie is a lightweight GTK+ based image viewer for Unix like operating\n" -"systems. It features: EXIF, IPTC and XMP metadata browsing and editing\n" -"interoperability; easy integration with other software; geeqie works on files\n" -"and directories, there is no need to import images; fast preview for many raw\n" -"image formats; tools for image comparison, sorting and managing photo\n" -"collection. Geeqie was initially based on GQview." +"GNU Gettext is a package providing a framework for translating the\n" +"textual output of programs into multiple languages. It provides translators\n" +"with the means to create message catalogs, and a runtime library to load\n" +"translated messages from the catalogs. Nearly all GNU packages use Gettext." msgstr "" -#: gnu/packages/gettext.scm:93 +#: gnu/packages/gettext.scm:122 msgid "Tools and documentation for translation" msgstr "Værktøjer og dokumentation for oversættelse" -#: gnu/packages/gettext.scm:95 -msgid "" -"GNU Gettext is a package providing a framework for translating the\n" -"textual output of programs into multiple languages. It provides translators\n" -"with the means to create message catalogs, as well as an Emacs mode to work\n" -"with them, and a runtime library to load translated messages from the\n" -"catalogs. Nearly all GNU packages use Gettext." -msgstr "" - -#: gnu/packages/gettext.scm:151 +#: gnu/packages/gettext.scm:173 msgid "Scripts to ease maintenance of translations" msgstr "" -#: gnu/packages/gettext.scm:153 +#: gnu/packages/gettext.scm:175 msgid "" "The po4a (PO for anything) project goal is to ease translations (and\n" "more interestingly, the maintenance of translations) using gettext tools on\n" "areas where they were not expected like documentation." msgstr "" -#: gnu/packages/gimp.scm:53 +#: gnu/packages/gimp.scm:60 msgid "Image pixel format conversion library" msgstr "" -#: gnu/packages/gimp.scm:55 +#: gnu/packages/gimp.scm:62 msgid "" "Babl is a dynamic, any to any, pixel format translation library.\n" "It allows converting between different methods of storing pixels known as\n" @@ -2350,22 +3027,22 @@ msgid "" "provided as well as the framework to add new color models and data types." msgstr "" -#: gnu/packages/gimp.scm:110 +#: gnu/packages/gimp.scm:118 msgid "Graph based image processing framework" msgstr "Grafbaseret billedbehandlingsramme" -#: gnu/packages/gimp.scm:111 +#: gnu/packages/gimp.scm:119 msgid "" "GEGL (Generic Graphics Library) provides infrastructure to\n" "do demand based cached non destructive image editing on larger than RAM\n" "buffers." msgstr "" -#: gnu/packages/gimp.scm:153 +#: gnu/packages/gimp.scm:178 msgid "GNU Image Manipulation Program" msgstr "" -#: gnu/packages/gimp.scm:155 +#: gnu/packages/gimp.scm:180 msgid "" "GIMP is an application for image manipulation tasks such as photo\n" "retouching, composition and authoring. It supports all common image formats\n" @@ -2373,22 +3050,46 @@ msgid "" "that is extensible via a plugin system." msgstr "" -#: gnu/packages/gnome.scm:156 +#: gnu/packages/gimp.scm:228 +msgid "GIMP plug-in to edit image in fourier space" +msgstr "" + +#: gnu/packages/gimp.scm:230 +msgid "" +"This package provides a simple plug-in to apply the fourier transform on\n" +"an image, allowing you to work with the transformed image inside GIMP. You\n" +"can draw or apply filters in fourier space and get the modified image with an\n" +"inverse fourier transform." +msgstr "" + +#: gnu/packages/gnome.scm:165 msgid "CD/DVD burning tool for Gnome" msgstr "Cd/dvd-brændeværktøj for GNOME" -#: gnu/packages/gnome.scm:157 +#: gnu/packages/gnome.scm:166 msgid "" "Brasero is an application to burn CD/DVD for the Gnome\n" "Desktop. It is designed to be as simple as possible and has some unique\n" "features to enable users to create their discs easily and quickly." msgstr "" -#: gnu/packages/gnome.scm:177 -msgid "Bootstrap GNOME modules built from Git" +#: gnu/packages/gnome.scm:213 +msgid "Diagram creation for GNOME" +msgstr "Diagramoprettelse for GNOME" + +#: gnu/packages/gnome.scm:214 +msgid "" +"Dia can be used to draw different types of diagrams, and\n" +"includes support for UML static structure diagrams (class diagrams), entity\n" +"relationship modeling, and network diagrams. The program supports various file\n" +"formats like PNG, SVG, PDF and EPS." msgstr "" -#: gnu/packages/gnome.scm:178 +#: gnu/packages/gnome.scm:235 +msgid "Bootstrap GNOME modules built from Git" +msgstr "Bootstrap GNOME-moduler kompileret fra Git" + +#: gnu/packages/gnome.scm:236 msgid "" "gnome-common contains various files needed to bootstrap\n" "GNOME modules built from Git. It contains a common \"autogen.sh\" script that\n" @@ -2396,11 +3097,11 @@ msgid "" "commonly used macros." msgstr "" -#: gnu/packages/gnome.scm:219 +#: gnu/packages/gnome.scm:277 msgid "Libgnome-desktop, gnome-about, and desktop-wide documents" msgstr "" -#: gnu/packages/gnome.scm:221 +#: gnu/packages/gnome.scm:279 msgid "" "The libgnome-desktop library provides API shared by several applications\n" "on the desktop, but that cannot live in the platform for various reasons.\n" @@ -2410,41 +3111,41 @@ msgid "" "The gnome-about program helps find which version of GNOME is installed." msgstr "" -#: gnu/packages/gnome.scm:254 +#: gnu/packages/gnome.scm:312 msgid "Documentation utilities for the Gnome project" msgstr "Dokumentationsredskaber for GNOME-projektet" -#: gnu/packages/gnome.scm:256 +#: gnu/packages/gnome.scm:314 msgid "" "Gnome-doc-utils is a collection of documentation utilities for the\n" "Gnome project. It includes xml2po tool which makes it easier to translate\n" "and keep up to date translations of documentation." msgstr "" -#: gnu/packages/gnome.scm:300 +#: gnu/packages/gnome.scm:358 msgid "Libraries for displaying certificates and accessing key stores" msgstr "" -#: gnu/packages/gnome.scm:302 +#: gnu/packages/gnome.scm:360 msgid "" "The GCR package contains libraries used for displaying certificates and\n" "accessing key stores. It also provides the viewer for crypto files on the\n" "GNOME Desktop." msgstr "" -#: gnu/packages/gnome.scm:331 +#: gnu/packages/gnome.scm:389 msgid "Accessing passwords from the GNOME keyring" msgstr "" -#: gnu/packages/gnome.scm:333 +#: gnu/packages/gnome.scm:391 msgid "Client library to access passwords from the GNOME keyring." msgstr "" -#: gnu/packages/gnome.scm:395 +#: gnu/packages/gnome.scm:453 msgid "Daemon to store passwords and encryption keys" msgstr "Dæmon til at lagre adgandskoder og krypteringsnøgler" -#: gnu/packages/gnome.scm:397 +#: gnu/packages/gnome.scm:455 msgid "" "gnome-keyring is a program that keeps passwords and other secrets for\n" "users. It is run as a daemon in the session, similar to ssh-agent, and other\n" @@ -2455,11 +3156,11 @@ msgid "" "forgotten when the session ends." msgstr "" -#: gnu/packages/gnome.scm:462 +#: gnu/packages/gnome.scm:528 msgid "GNOME's document viewer" msgstr "" -#: gnu/packages/gnome.scm:464 +#: gnu/packages/gnome.scm:530 msgid "" "Evince is a document viewer for multiple document formats. It\n" "currently supports PDF, PostScript, DjVu, TIFF and DVI. The goal\n" @@ -2467,32 +3168,32 @@ msgid "" "on the GNOME Desktop with a single simple application." msgstr "" -#: gnu/packages/gnome.scm:493 +#: gnu/packages/gnome.scm:559 msgid "GNOME settings for various desktop components" msgstr "" -#: gnu/packages/gnome.scm:495 +#: gnu/packages/gnome.scm:561 msgid "" "Gsettings-desktop-schemas contains a collection of GSettings schemas\n" "for settings shared by various components of the GNOME desktop." msgstr "" -#: gnu/packages/gnome.scm:529 +#: gnu/packages/gnome.scm:595 msgid "Utility to implement the Freedesktop Icon Naming Specification" msgstr "" -#: gnu/packages/gnome.scm:531 +#: gnu/packages/gnome.scm:597 msgid "" "To help with the transition to the Freedesktop Icon Naming\n" "Specification, the icon naming utility maps the icon names used by the\n" "GNOME and KDE desktops to the icon names proposed in the specification." msgstr "" -#: gnu/packages/gnome.scm:553 +#: gnu/packages/gnome.scm:619 msgid "Utilities for working with desktop entries" msgstr "" -#: gnu/packages/gnome.scm:555 +#: gnu/packages/gnome.scm:621 msgid "" "This package contains a few command line utilities for working with\n" "desktop entries:\n" @@ -2507,19 +3208,19 @@ msgid "" " handled by desktop files." msgstr "" -#: gnu/packages/gnome.scm:589 +#: gnu/packages/gnome.scm:660 msgid "GNOME icon theme" msgstr "GNOME-ikontema" -#: gnu/packages/gnome.scm:591 +#: gnu/packages/gnome.scm:662 msgid "Icons for the GNOME desktop." msgstr "Ikoner for GNOME-skrivebordet." -#: gnu/packages/gnome.scm:630 +#: gnu/packages/gnome.scm:703 msgid "Database of common MIME types" msgstr "Database med gængse MIME-typer" -#: gnu/packages/gnome.scm:632 +#: gnu/packages/gnome.scm:705 msgid "" "The shared-mime-info package contains the core database of common types\n" "and the update-mime-database command used to extend it. It requires glib2 to\n" @@ -2528,19 +3229,19 @@ msgid "" "database is translated at Transifex." msgstr "" -#: gnu/packages/gnome.scm:656 +#: gnu/packages/gnome.scm:729 msgid "Freedesktop icon theme" msgstr "Freedesktop-ikontema" -#: gnu/packages/gnome.scm:658 +#: gnu/packages/gnome.scm:731 msgid "Freedesktop icon theme." msgstr "Freedesktop-ikondtema." -#: gnu/packages/gnome.scm:685 +#: gnu/packages/gnome.scm:759 msgid "GNOME desktop notification library" msgstr "" -#: gnu/packages/gnome.scm:687 +#: gnu/packages/gnome.scm:761 msgid "" "Libnotify is a library that sends desktop notifications to a\n" "notification daemon, as defined in the Desktop Notifications spec. These\n" @@ -2548,11 +3249,11 @@ msgid "" "some form of information without getting in the user's way." msgstr "" -#: gnu/packages/gnome.scm:719 +#: gnu/packages/gnome.scm:793 msgid "GObject plugin system" msgstr "" -#: gnu/packages/gnome.scm:721 +#: gnu/packages/gnome.scm:795 msgid "" "Libpeas is a gobject-based plugins engine, and is targetted at giving\n" "every application the chance to assume its own extensibility. It also has a\n" @@ -2561,33 +3262,33 @@ msgid "" "the API." msgstr "" -#: gnu/packages/gnome.scm:750 +#: gnu/packages/gnome.scm:824 msgid "OpenGL extension to GTK+" msgstr "OpenGL-udvidelse til GTK+" -#: gnu/packages/gnome.scm:751 +#: gnu/packages/gnome.scm:825 msgid "" "GtkGLExt is an OpenGL extension to GTK+. It provides\n" "additional GDK objects which support OpenGL rendering in GTK+ and GtkWidget\n" "API add-ons to make GTK+ widgets OpenGL-capable." msgstr "" -#: gnu/packages/gnome.scm:794 +#: gnu/packages/gnome.scm:868 msgid "GTK+ rapid application development tool" msgstr "" -#: gnu/packages/gnome.scm:795 +#: gnu/packages/gnome.scm:869 msgid "" "Glade is a rapid application development (RAD) tool to\n" "enable quick & easy development of user interfaces for the GTK+ toolkit and\n" "the GNOME desktop environment." msgstr "" -#: gnu/packages/gnome.scm:820 +#: gnu/packages/gnome.scm:894 msgid "CSS2 parsing and manipulation library" msgstr "CSS2-fortolknings- og manipuleringsbibliotek" -#: gnu/packages/gnome.scm:822 +#: gnu/packages/gnome.scm:896 msgid "" "Libcroco is a standalone CSS2 parsing and manipulation library.\n" "The parser provides a low level event driven SAC-like API and a CSS object\n" @@ -2595,31 +3296,31 @@ msgid "" "XML/CSS rendering engine." msgstr "" -#: gnu/packages/gnome.scm:855 +#: gnu/packages/gnome.scm:929 msgid "GNOME's Structured File Library" msgstr "" -#: gnu/packages/gnome.scm:857 +#: gnu/packages/gnome.scm:931 msgid "" "Libgsf aims to provide an efficient extensible I/O abstraction for\n" "dealing with different structured file formats." msgstr "" -#: gnu/packages/gnome.scm:922 +#: gnu/packages/gnome.scm:982 msgid "Render SVG files using Cairo" msgstr "" -#: gnu/packages/gnome.scm:924 +#: gnu/packages/gnome.scm:984 msgid "" "Librsvg is a C library to render SVG files using the Cairo 2D graphics\n" "library." msgstr "" -#: gnu/packages/gnome.scm:948 +#: gnu/packages/gnome.scm:1008 msgid "Create trees of CORBA Interface Definition Language files" msgstr "" -#: gnu/packages/gnome.scm:949 +#: gnu/packages/gnome.scm:1009 msgid "" "Libidl is a library for creating trees of CORBA Interface\n" "Definition Language (idl) files, which is a specification for defining\n" @@ -2628,144 +3329,144 @@ msgid "" "functionality was designed to be as reusable and portable as possible." msgstr "" -#: gnu/packages/gnome.scm:989 +#: gnu/packages/gnome.scm:1049 msgid "CORBA 2.4-compliant Object Request Broker" msgstr "" -#: gnu/packages/gnome.scm:990 +#: gnu/packages/gnome.scm:1050 msgid "" "ORBit2 is a CORBA 2.4-compliant Object Request Broker (orb)\n" "featuring mature C, C++ and Python bindings." msgstr "" -#: gnu/packages/gnome.scm:1036 +#: gnu/packages/gnome.scm:1097 msgid "Framework for creating reusable components for use in GNOME applications" msgstr "" -#: gnu/packages/gnome.scm:1037 +#: gnu/packages/gnome.scm:1098 msgid "" "Bonobo is a framework for creating reusable components for\n" "use in GNOME applications, built on top of CORBA." msgstr "" -#: gnu/packages/gnome.scm:1068 +#: gnu/packages/gnome.scm:1129 msgid "Store application preferences" msgstr "" -#: gnu/packages/gnome.scm:1069 +#: gnu/packages/gnome.scm:1130 msgid "" "Gconf is a system for storing application preferences. It\n" "is intended for user preferences; not arbitrary data storage." msgstr "" -#: gnu/packages/gnome.scm:1091 +#: gnu/packages/gnome.scm:1153 msgid "Base MIME and Application database for GNOME" msgstr "" -#: gnu/packages/gnome.scm:1092 +#: gnu/packages/gnome.scm:1154 msgid "" "GNOME Mime Data is a module which contains the base MIME\n" "and Application database for GNOME. The data stored by this module is\n" "designed to be accessed through the MIME functions in GnomeVFS." msgstr "" -#: gnu/packages/gnome.scm:1136 +#: gnu/packages/gnome.scm:1198 msgid "Access files and folders in GNOME applications" msgstr "" -#: gnu/packages/gnome.scm:1138 +#: gnu/packages/gnome.scm:1200 msgid "" "GnomeVFS is the core library used to access files and folders in GNOME\n" "applications. It provides a file system abstraction which allows applications\n" "to access local and remote files with a single consistent API." msgstr "" -#: gnu/packages/gnome.scm:1182 +#: gnu/packages/gnome.scm:1244 msgid "Useful routines for building applications" msgstr "" -#: gnu/packages/gnome.scm:1183 +#: gnu/packages/gnome.scm:1245 msgid "" "The libgnome library provides a number of useful routines\n" "for building modern applications, including session management, activation of\n" "files and URIs, and displaying help." msgstr "" -#: gnu/packages/gnome.scm:1206 +#: gnu/packages/gnome.scm:1268 msgid "2D drawing library" msgstr "2D-tegnebibliotek" -#: gnu/packages/gnome.scm:1207 +#: gnu/packages/gnome.scm:1269 msgid "" "Libart is a 2D drawing library intended as a\n" "high-quality vector-based 2D library with antialiasing and alpha composition." msgstr "" -#: gnu/packages/gnome.scm:1234 +#: gnu/packages/gnome.scm:1296 msgid "Flexible widget for creating interactive structured graphics" msgstr "" -#: gnu/packages/gnome.scm:1235 +#: gnu/packages/gnome.scm:1297 msgid "" "The GnomeCanvas widget provides a flexible widget for\n" "creating interactive structured graphics." msgstr "" -#: gnu/packages/gnome.scm:1259 +#: gnu/packages/gnome.scm:1321 msgid "C++ bindings to the GNOME Canvas library" msgstr "" -#: gnu/packages/gnome.scm:1260 +#: gnu/packages/gnome.scm:1322 msgid "C++ bindings to the GNOME Canvas library." msgstr "" -#: gnu/packages/gnome.scm:1291 +#: gnu/packages/gnome.scm:1353 msgid "Additional widgets for applications" msgstr "" -#: gnu/packages/gnome.scm:1292 +#: gnu/packages/gnome.scm:1354 msgid "" "The libgnomeui library provides additional widgets for\n" "applications. Many of the widgets from libgnomeui have already been\n" "ported to GTK+." msgstr "" -#: gnu/packages/gnome.scm:1318 +#: gnu/packages/gnome.scm:1380 msgid "Load glade interfaces and access the glade built widgets" msgstr "" -#: gnu/packages/gnome.scm:1319 +#: gnu/packages/gnome.scm:1381 msgid "" "Libglade is a library that provides interfaces for loading\n" "graphical interfaces described in glade files and for accessing the\n" "widgets built in the loading process." msgstr "" -#: gnu/packages/gnome.scm:1356 gnu/packages/gnome.scm:1388 +#: gnu/packages/gnome.scm:1411 gnu/packages/gnome.scm:1443 msgid "Printing framework for GNOME" msgstr "" -#: gnu/packages/gnome.scm:1358 +#: gnu/packages/gnome.scm:1413 msgid "" "GNOME-print was a printing framework for GNOME. It has been deprecated\n" "since ca. 2006, when GTK+ itself incorporated printing support." msgstr "" -#: gnu/packages/gnome.scm:1433 +#: gnu/packages/gnome.scm:1488 msgid "Some user interface controls using Bonobo" msgstr "" -#: gnu/packages/gnome.scm:1434 +#: gnu/packages/gnome.scm:1489 msgid "" "The Bonobo UI library provides a number of user interface\n" "controls using the Bonobo component framework." msgstr "" -#: gnu/packages/gnome.scm:1458 +#: gnu/packages/gnome.scm:1513 msgid "Window Navigator Construction Kit" msgstr "" -#: gnu/packages/gnome.scm:1460 +#: gnu/packages/gnome.scm:1515 msgid "" "Libwnck is the Window Navigator Construction Kit, a library for use in\n" "writing pagers, tasklists, and more generally applications that are dealing\n" @@ -2773,19 +3474,19 @@ msgid "" "Hints specification (EWMH)." msgstr "" -#: gnu/packages/gnome.scm:1513 +#: gnu/packages/gnome.scm:1568 msgid "Document-centric objects and utilities" msgstr "" -#: gnu/packages/gnome.scm:1514 +#: gnu/packages/gnome.scm:1569 msgid "A GLib/GTK+ set of document-centric objects and utilities." msgstr "" -#: gnu/packages/gnome.scm:1596 +#: gnu/packages/gnome.scm:1652 msgid "Spreadsheet application" msgstr "" -#: gnu/packages/gnome.scm:1598 +#: gnu/packages/gnome.scm:1654 msgid "" "GNUmeric is a GNU spreadsheet application, running under GNOME. It is\n" "interoperable with other spreadsheet applications. It has a vast array of\n" @@ -2794,29 +3495,29 @@ msgid "" "engineering." msgstr "" -#: gnu/packages/gnome.scm:1644 +#: gnu/packages/gnome.scm:1694 msgid "Default GNOME 3 themes" msgstr "Standardtemaer for GNOME 3" -#: gnu/packages/gnome.scm:1646 +#: gnu/packages/gnome.scm:1696 msgid "The default GNOME 3 themes (Adwaita and some accessibility themes)." msgstr "" -#: gnu/packages/gnome.scm:1679 +#: gnu/packages/gnome.scm:1729 msgid "Manage encryption keys and passwords in the GNOME keyring" msgstr "Håndter krypteringsnøgler og adgangskoder i GNOME keyring" -#: gnu/packages/gnome.scm:1681 +#: gnu/packages/gnome.scm:1731 msgid "" "Seahorse is a GNOME application for managing encryption keys and\n" "passwords in the GNOME keyring." msgstr "" -#: gnu/packages/gnome.scm:1717 gnu/packages/gnome.scm:1882 +#: gnu/packages/gnome.scm:1769 gnu/packages/gnome.scm:1978 msgid "Compiler for the GObject type system" msgstr "" -#: gnu/packages/gnome.scm:1719 +#: gnu/packages/gnome.scm:1771 msgid "" "Vala is a programming language that aims to bring modern programming\n" "language features to GNOME developers without imposing any additional runtime\n" @@ -2824,11 +3525,11 @@ msgid "" "libraries written in C." msgstr "" -#: gnu/packages/gnome.scm:1749 +#: gnu/packages/gnome.scm:1809 msgid "Virtual Terminal Emulator" msgstr "" -#: gnu/packages/gnome.scm:1751 +#: gnu/packages/gnome.scm:1811 msgid "" "VTE is a library (libvte) implementing a terminal emulator widget for\n" "GTK+, and a minimal sample application (vte) using that. Vte is mainly used in\n" @@ -2836,18 +3537,29 @@ msgid "" "editors, IDEs, etc." msgstr "" -#: gnu/packages/gnome.scm:1849 +#: gnu/packages/gnome.scm:1844 +msgid "Enhanced VTE terminal widget" +msgstr "" + +#: gnu/packages/gnome.scm:1846 +msgid "" +"VTE is a library (libvte) implementing a terminal emulator widget for\n" +"GTK+, this fork provides additional functions exposed for keyboard text\n" +"selection and URL hints." +msgstr "" + +#: gnu/packages/gnome.scm:1945 msgid "Low-level GNOME configuration system" msgstr "" -#: gnu/packages/gnome.scm:1850 +#: gnu/packages/gnome.scm:1946 msgid "" "Dconf is a low-level configuration system. Its main purpose\n" "is to provide a backend to GSettings on platforms that don't already have\n" "configuration storage systems." msgstr "" -#: gnu/packages/gnome.scm:1884 +#: gnu/packages/gnome.scm:1980 msgid "" "JSON-GLib is a C library based on GLib providing serialization and\n" "deserialization support for the JavaScript Object Notation (JSON) format\n" @@ -2856,11 +3568,11 @@ msgid "" "and objects." msgstr "" -#: gnu/packages/gnome.scm:1923 +#: gnu/packages/gnome.scm:2019 msgid "High-level API for X Keyboard Extension" msgstr "" -#: gnu/packages/gnome.scm:1925 +#: gnu/packages/gnome.scm:2021 msgid "" "LibXklavier is a library providing high-level API for X Keyboard\n" "Extension known as XKB. This library is intended to support XFree86 and other\n" @@ -2868,72 +3580,84 @@ msgid "" "indicators etc)." msgstr "" -#: gnu/packages/gnome.scm:1953 +#: gnu/packages/gnome.scm:2049 msgid "Python bindings to librsvg" msgstr "" -#: gnu/packages/gnome.scm:1955 +#: gnu/packages/gnome.scm:2051 msgid "" "This packages provides Python bindings to librsvg, the SVG rendering\n" "library." msgstr "" -#: gnu/packages/gnome.scm:2004 +#: gnu/packages/gnome.scm:2100 msgid "Network-related GIO modules" msgstr "" -#: gnu/packages/gnome.scm:2006 +#: gnu/packages/gnome.scm:2102 msgid "" "This package contains various network related extensions for the GIO\n" "library." msgstr "" -#: gnu/packages/gnome.scm:2037 +#: gnu/packages/gnome.scm:2133 msgid "RESTful web api query library" msgstr "" -#: gnu/packages/gnome.scm:2039 +#: gnu/packages/gnome.scm:2135 msgid "" "This library was designed to make it easier to access web services that\n" "claim to be \"RESTful\". It includes convenience wrappers for libsoup and\n" "libxml to ease remote use of the RESTful API." msgstr "" -#: gnu/packages/gnome.scm:2108 +#: gnu/packages/gnome.scm:2204 msgid "GLib-based HTTP Library" msgstr "" -#: gnu/packages/gnome.scm:2110 +#: gnu/packages/gnome.scm:2206 msgid "" "LibSoup is an HTTP client/server library for GNOME. It uses GObjects\n" "and the GLib main loop, to integrate well with GNOME applications." msgstr "" -#: gnu/packages/gnome.scm:2156 +#: gnu/packages/gnome.scm:2252 msgid "GObject bindings for \"Secret Service\" API" msgstr "GObject-bindinger for »Secret Service«-API'en" -#: gnu/packages/gnome.scm:2158 +#: gnu/packages/gnome.scm:2254 msgid "" "Libsecret is a GObject based library for storing and retrieving passwords\n" "and other secrets. It communicates with the \"Secret Service\" using DBus." msgstr "" -#: gnu/packages/gnome.scm:2202 +#: gnu/packages/gnome.scm:2289 msgid "Minesweeper game" msgstr "Minestrygerspil" -#: gnu/packages/gnome.scm:2204 +#: gnu/packages/gnome.scm:2291 msgid "" "Mines (previously gnomine) is a puzzle game where you locate mines\n" "floating in an ocean using only your brain and a little bit of luck." msgstr "" -#: gnu/packages/gnome.scm:2248 +#: gnu/packages/gnome.scm:2322 +msgid "Japanese logic game" +msgstr "" + +#: gnu/packages/gnome.scm:2324 +msgid "" +"Sudoku is a Japanese logic game that exploded in popularity in 2005.\n" +"GNOME Sudoku is meant to have an interface as simple and unobstrusive as\n" +"possible while still providing features that make playing difficult Sudoku\n" +"more fun." +msgstr "" + +#: gnu/packages/gnome.scm:2370 msgid "Terminal emulator" msgstr "Terminalemulator" -#: gnu/packages/gnome.scm:2250 +#: gnu/packages/gnome.scm:2372 msgid "" "GNOME Terminal is a terminal emulator application for accessing a\n" "UNIX shell environment which can be used to run programs available on\n" @@ -2943,22 +3667,22 @@ msgid "" "keyboard shortcuts." msgstr "" -#: gnu/packages/gnome.scm:2316 +#: gnu/packages/gnome.scm:2438 msgid "Color management service" msgstr "" -#: gnu/packages/gnome.scm:2317 +#: gnu/packages/gnome.scm:2439 msgid "" "Colord is a system service that makes it easy to manage,\n" "install and generate color profiles to accurately color manage input and\n" "output devices." msgstr "" -#: gnu/packages/gnome.scm:2359 +#: gnu/packages/gnome.scm:2482 msgid "Geolocation service" msgstr "" -#: gnu/packages/gnome.scm:2360 +#: gnu/packages/gnome.scm:2483 msgid "" "Geoclue is a D-Bus service that provides location\n" "information. The primary goal of the Geoclue project is to make creating\n" @@ -2967,11 +3691,11 @@ msgid "" "permission from user." msgstr "" -#: gnu/packages/gnome.scm:2395 +#: gnu/packages/gnome.scm:2518 msgid "Geocoding and reverse-geocoding library" msgstr "" -#: gnu/packages/gnome.scm:2397 +#: gnu/packages/gnome.scm:2520 msgid "" "geocode-glib is a convenience library for geocoding (finding longitude,\n" "and latitude from an address) and reverse geocoding (finding an address from\n" @@ -2979,11 +3703,11 @@ msgid "" "faster results and to avoid unnecessary server load." msgstr "" -#: gnu/packages/gnome.scm:2450 +#: gnu/packages/gnome.scm:2573 msgid "System daemon for managing power devices" msgstr "Systemdæmon til håndtering af strømenheder" -#: gnu/packages/gnome.scm:2452 +#: gnu/packages/gnome.scm:2575 msgid "" "UPower is an abstraction for enumerating power devices,\n" "listening to device events and querying history and statistics. Any\n" @@ -2991,21 +3715,21 @@ msgid "" "service via the system message bus." msgstr "" -#: gnu/packages/gnome.scm:2502 +#: gnu/packages/gnome.scm:2630 msgid "Location, time zone, and weather library for GNOME" msgstr "" -#: gnu/packages/gnome.scm:2504 +#: gnu/packages/gnome.scm:2632 msgid "" "libgweather is a library to access weather information from online\n" "services for numerous locations." msgstr "" -#: gnu/packages/gnome.scm:2556 +#: gnu/packages/gnome.scm:2683 msgid "GNOME settings daemon" msgstr "" -#: gnu/packages/gnome.scm:2558 +#: gnu/packages/gnome.scm:2685 msgid "" "This package contains the daemon responsible for setting the various\n" "parameters of a GNOME session and the applications that run under it. It\n" @@ -3013,42 +3737,42 @@ msgid "" "settings, themes, mouse settings, and startup of other daemons." msgstr "" -#: gnu/packages/gnome.scm:2594 +#: gnu/packages/gnome.scm:2721 msgid "Library to parse and save media playlists for GNOME" msgstr "" -#: gnu/packages/gnome.scm:2595 +#: gnu/packages/gnome.scm:2722 msgid "" "Totem-pl-parser is a GObjects-based library to parse and save\n" "playlists in a variety of formats." msgstr "" -#: gnu/packages/gnome.scm:2629 +#: gnu/packages/gnome.scm:2756 msgid "Solitaire card games" msgstr "" -#: gnu/packages/gnome.scm:2631 +#: gnu/packages/gnome.scm:2758 msgid "" "Aisleriot (also known as Solitaire or sol) is a collection of card games\n" "which are easy to play with the aid of a mouse." msgstr "" -#: gnu/packages/gnome.scm:2655 +#: gnu/packages/gnome.scm:2782 msgid "API documentation browser for GNOME" msgstr "" -#: gnu/packages/gnome.scm:2657 +#: gnu/packages/gnome.scm:2784 msgid "" "Devhelp is an API documentation browser for GTK+ and GNOME. It works\n" "natively with GTK-Doc (the API reference system developed for GTK+ and used\n" "throughout GNOME for API documentation)." msgstr "" -#: gnu/packages/gnome.scm:2718 +#: gnu/packages/gnome.scm:2845 msgid "Object oriented GL/GLES Abstraction/Utility Layer" msgstr "" -#: gnu/packages/gnome.scm:2720 +#: gnu/packages/gnome.scm:2847 msgid "" "Cogl is a small library for using 3D graphics hardware to draw pretty\n" "pictures. The API departs from the flat state machine style of OpenGL and is\n" @@ -3056,26 +3780,26 @@ msgid "" "without stepping on each others toes." msgstr "" -#: gnu/packages/gnome.scm:2775 +#: gnu/packages/gnome.scm:2902 msgid "Open GL based interactive canvas library" msgstr "" -#: gnu/packages/gnome.scm:2777 gnu/packages/gnome.scm:2806 +#: gnu/packages/gnome.scm:2904 gnu/packages/gnome.scm:2933 msgid "" "Clutter is an Open GL based interactive canvas library, designed for\n" "creating fast, mainly 2D single window applications such as media box UIs,\n" "presentations, kiosk style applications and so on." msgstr "" -#: gnu/packages/gnome.scm:2804 +#: gnu/packages/gnome.scm:2931 msgid "Open GL based interactive canvas library GTK+ widget" msgstr "" -#: gnu/packages/gnome.scm:2834 +#: gnu/packages/gnome.scm:2961 msgid "Integration library for using GStreamer with Clutter" msgstr "" -#: gnu/packages/gnome.scm:2836 +#: gnu/packages/gnome.scm:2963 msgid "" "Clutter-Gst is an integration library for using GStreamer with Clutter.\n" "It provides a GStreamer sink to upload frames to GL and an actor that\n" @@ -3083,11 +3807,11 @@ msgid "" "GL based interactive canvas library." msgstr "" -#: gnu/packages/gnome.scm:2866 +#: gnu/packages/gnome.scm:2997 msgid "C library providing a ClutterActor to display maps" msgstr "" -#: gnu/packages/gnome.scm:2868 +#: gnu/packages/gnome.scm:2999 msgid "" "libchamplain is a C library providing a ClutterActor to display maps.\n" "It also provides a Gtk+ widget to display maps in Gtk+ applications. Python\n" @@ -3095,22 +3819,32 @@ msgid "" "such as OpenStreetMap, OpenCycleMap, OpenAerialMap, and Maps for free." msgstr "" -#: gnu/packages/gnome.scm:2899 +#: gnu/packages/gnome.scm:3030 msgid "Object mapper from GObjects to SQLite" msgstr "" -#: gnu/packages/gnome.scm:2901 +#: gnu/packages/gnome.scm:3032 msgid "" "Gom provides an object mapper from GObjects to SQLite. It helps you\n" "write applications that need to store structured data as well as make complex\n" "queries upon that data." msgstr "" -#: gnu/packages/gnome.scm:2929 +#: gnu/packages/gnome.scm:3067 +msgid "Useful functionality shared among GNOME games" +msgstr "" + +#: gnu/packages/gnome.scm:3069 +msgid "" +"libgames-support is a small library intended for internal use by\n" +"GNOME Games, but it may be used by others." +msgstr "" + +#: gnu/packages/gnome.scm:3097 msgid "Sliding block puzzles" msgstr "" -#: gnu/packages/gnome.scm:2931 +#: gnu/packages/gnome.scm:3099 msgid "" "GNOME Klotski is a set of block sliding puzzles. The objective is to move\n" "the patterned block to the area bordered by green markers. To do so, you will\n" @@ -3118,67 +3852,67 @@ msgid "" "as possible!" msgstr "" -#: gnu/packages/gnome.scm:2982 +#: gnu/packages/gnome.scm:3150 msgid "Framework for discovering and browsing media" msgstr "" -#: gnu/packages/gnome.scm:2984 gnu/packages/gnome.scm:3036 +#: gnu/packages/gnome.scm:3152 gnu/packages/gnome.scm:3205 msgid "" "Grilo is a framework focused on making media discovery and browsing easy\n" "for application developers." msgstr "" -#: gnu/packages/gnome.scm:3034 +#: gnu/packages/gnome.scm:3203 msgid "Plugins for the Grilo media discovery library" msgstr "" -#: gnu/packages/gnome.scm:3111 +#: gnu/packages/gnome.scm:3281 msgid "Simple media player for GNOME based on GStreamer" msgstr "" -#: gnu/packages/gnome.scm:3112 +#: gnu/packages/gnome.scm:3282 msgid "" "Totem is a simple yet featureful media player for GNOME\n" "which can read a large number of file formats." msgstr "" -#: gnu/packages/gnome.scm:3201 +#: gnu/packages/gnome.scm:3372 msgid "Music player for GNOME" msgstr "" -#: gnu/packages/gnome.scm:3202 +#: gnu/packages/gnome.scm:3373 msgid "" "Rhythmbox is a music playing application for GNOME. It\n" "supports playlists, song ratings, and any codecs installed through gstreamer." msgstr "" -#: gnu/packages/gnome.scm:3252 +#: gnu/packages/gnome.scm:3423 msgid "GNOME image viewer" msgstr "" -#: gnu/packages/gnome.scm:3253 +#: gnu/packages/gnome.scm:3424 msgid "" "Eye of GNOME is the GNOME image viewer. It\n" "supports image conversion, rotation, and slideshows." msgstr "" -#: gnu/packages/gnome.scm:3278 +#: gnu/packages/gnome.scm:3449 msgid "GObject bindings for libudev" msgstr "" -#: gnu/packages/gnome.scm:3280 +#: gnu/packages/gnome.scm:3451 msgid "" "This library provides GObject bindings for libudev. It was originally\n" "part of udev-extras, then udev, then systemd. It's now a project on its own." msgstr "" -#: gnu/packages/gnome.scm:3326 -msgid "Userspace virtual filesystem for GIO" +#: gnu/packages/gnome.scm:3497 +msgid "Userspace virtual file system for GIO" msgstr "" -#: gnu/packages/gnome.scm:3328 +#: gnu/packages/gnome.scm:3499 msgid "" -"GVFS is a userspace virtual filesystem designed to work with the I/O\n" +"GVFS is a userspace virtual file system designed to work with the I/O\n" "abstraction of GIO. It contains a GIO module that seamlessly adds GVFS support\n" "to all applications using the GIO API. It also supports exposing the GVFS\n" "mounts to non-GIO applications using FUSE.\n" @@ -3187,11 +3921,11 @@ msgid "" "DAV, and others." msgstr "" -#: gnu/packages/gnome.scm:3374 +#: gnu/packages/gnome.scm:3545 msgid "GLib binding for libusb1" msgstr "GLib-binding for libusb1" -#: gnu/packages/gnome.scm:3376 +#: gnu/packages/gnome.scm:3547 msgid "" "GUsb is a GObject wrapper for libusb1 that makes it easy to do\n" "asynchronous control, bulk and interrupt transfers with proper cancellation\n" @@ -3199,11 +3933,11 @@ msgid "" "USB transfers with your high-level application or system daemon." msgstr "" -#: gnu/packages/gnome.scm:3413 +#: gnu/packages/gnome.scm:3598 msgid "Document and image scanner" msgstr "Dokument- og billedskanner" -#: gnu/packages/gnome.scm:3414 +#: gnu/packages/gnome.scm:3599 msgid "" "Simple Scan is an easy-to-use application, designed to let\n" "users connect their scanner and quickly have the image/document in an\n" @@ -3212,52 +3946,52 @@ msgid "" "work and the interface is well tested." msgstr "" -#: gnu/packages/gnome.scm:3463 +#: gnu/packages/gnome.scm:3646 msgid "GNOME web browser" msgstr "GNOME-internetbrowser" -#: gnu/packages/gnome.scm:3465 +#: gnu/packages/gnome.scm:3648 msgid "" "Epiphany is a GNOME web browser targeted at non-technical users. Its\n" "principles are simplicity and standards compliance." msgstr "" -#: gnu/packages/gnome.scm:3521 +#: gnu/packages/gnome.scm:3704 msgid "D-Bus debugger" msgstr "D-Bus-fejlsøger" -#: gnu/packages/gnome.scm:3523 +#: gnu/packages/gnome.scm:3706 msgid "" "D-Feet is a D-Bus debugger, which can be used to inspect D-Bus interfaces\n" "of running programs and invoke methods on those interfaces." msgstr "" -#: gnu/packages/gnome.scm:3545 +#: gnu/packages/gnome.scm:3728 msgid "XSL stylesheets for Yelp" msgstr "XSL-stilark for Yelp" -#: gnu/packages/gnome.scm:3547 +#: gnu/packages/gnome.scm:3730 msgid "" "Yelp-xsl contains XSL stylesheets that are used by the yelp help browser\n" "to format Docbook and Mallard documents." msgstr "" -#: gnu/packages/gnome.scm:3577 +#: gnu/packages/gnome.scm:3761 msgid "GNOME help browser" msgstr "" -#: gnu/packages/gnome.scm:3579 +#: gnu/packages/gnome.scm:3763 msgid "" "Yelp is the help viewer in Gnome. It natively views Mallard, DocBook,\n" "man, info, and HTML documents. It can locate documents according to the\n" "freedesktop.org help system specification." msgstr "" -#: gnu/packages/gnome.scm:3607 +#: gnu/packages/gnome.scm:3791 msgid "Yelp documentation tools" msgstr "Yelp-dokumentationsværktøjer" -#: gnu/packages/gnome.scm:3609 +#: gnu/packages/gnome.scm:3793 msgid "" "Yelp-tools is a collection of scripts and build utilities to help create,\n" "manage, and publish documentation for Yelp and the web. Most of the heavy\n" @@ -3265,32 +3999,32 @@ msgid "" "wraps things up in a developer-friendly way." msgstr "" -#: gnu/packages/gnome.scm:3646 +#: gnu/packages/gnome.scm:3830 msgid "GObject collection library" msgstr "GObject-samlingsbibliotek" -#: gnu/packages/gnome.scm:3648 +#: gnu/packages/gnome.scm:3832 msgid "" "Libgee is a utility library providing GObject-based interfaces and\n" "classes for commonly used data structures." msgstr "" -#: gnu/packages/gnome.scm:3675 +#: gnu/packages/gnome.scm:3859 msgid "GObject wrapper around the Exiv2 photo metadata library" msgstr "" -#: gnu/packages/gnome.scm:3677 +#: gnu/packages/gnome.scm:3861 msgid "" "Gexiv2 is a GObject wrapper around the Exiv2 photo metadata library. It\n" "allows for GNOME applications to easily inspect and update EXIF, IPTC, and XMP\n" "metadata in photo and video files of various formats." msgstr "" -#: gnu/packages/gnome.scm:3729 +#: gnu/packages/gnome.scm:3904 msgid "Photo manager for GNOME 3" msgstr "Billedhåndtering for GNOME 3" -#: gnu/packages/gnome.scm:3731 +#: gnu/packages/gnome.scm:3906 msgid "" "Shotwell is a digital photo manager designed for the GNOME desktop\n" "environment. It allows you to import photos from disk or camera, organize\n" @@ -3298,42 +4032,42 @@ msgid "" "share them with others via social networking and more." msgstr "" -#: gnu/packages/gnome.scm:3763 +#: gnu/packages/gnome.scm:3947 msgid "Graphical archive manager for GNOME" msgstr "Grafisk arkivhåndtering for GNOME" -#: gnu/packages/gnome.scm:3764 +#: gnu/packages/gnome.scm:3948 msgid "" "File Roller is an archive manager for the GNOME desktop\n" "environment that allows users to view, unpack, and create compressed archives\n" "such as gzip tarballs." msgstr "" -#: gnu/packages/gnome.scm:3799 +#: gnu/packages/gnome.scm:4026 msgid "Session manager for GNOME" msgstr "" -#: gnu/packages/gnome.scm:3801 +#: gnu/packages/gnome.scm:4028 msgid "" "This package contains the GNOME session manager, as well as a\n" "configuration program to choose applications starting on login." msgstr "" -#: gnu/packages/gnome.scm:3846 +#: gnu/packages/gnome.scm:4079 msgid "Javascript bindings for GNOME" msgstr "Javascript-bindinger for GNOME" -#: gnu/packages/gnome.scm:3849 +#: gnu/packages/gnome.scm:4082 msgid "" "Gjs is a javascript binding for GNOME. It's mainly based on spidermonkey\n" "javascript engine and the GObject introspection framework." msgstr "" -#: gnu/packages/gnome.scm:3905 +#: gnu/packages/gnome.scm:4141 msgid "GNOME text editor" msgstr "GNOME-tesktredigeringsprogram" -#: gnu/packages/gnome.scm:3906 +#: gnu/packages/gnome.scm:4142 msgid "" "While aiming at simplicity and ease of use, gedit is a\n" "powerful general purpose text editor." @@ -3341,21 +4075,21 @@ msgstr "" "Selv om den forsøger at være enkel og nem at bruge, så\n" "er gedit et funktionsrigt og alment tekstredigeringsprogram." -#: gnu/packages/gnome.scm:3930 +#: gnu/packages/gnome.scm:4166 msgid "Display graphical dialog boxes from shell scripts" msgstr "Vis grafiske dialogbokse fra skalskripter" -#: gnu/packages/gnome.scm:3933 +#: gnu/packages/gnome.scm:4169 msgid "" "Zenity is a rewrite of gdialog, the GNOME port of dialog which allows you\n" "to display dialog boxes from the commandline and shell scripts." msgstr "" -#: gnu/packages/gnome.scm:3978 +#: gnu/packages/gnome.scm:4214 msgid "Window and compositing manager" msgstr "" -#: gnu/packages/gnome.scm:3981 +#: gnu/packages/gnome.scm:4217 msgid "" "Mutter is a window and compositing manager that displays and manages your\n" "desktop via OpenGL. Mutter combines a sophisticated display engine using the\n" @@ -3363,11 +4097,11 @@ msgid "" "window manager." msgstr "" -#: gnu/packages/gnome.scm:4016 +#: gnu/packages/gnome.scm:4252 msgid "Single sign-on framework for GNOME" msgstr "" -#: gnu/packages/gnome.scm:4019 +#: gnu/packages/gnome.scm:4255 msgid "" "GNOME Online Accounts provides interfaces so that applications and\n" "libraries in GNOME can access the user's online accounts. It has providers for\n" @@ -3375,32 +4109,32 @@ msgid "" "Exchange, Last.fm, IMAP/SMTP, Jabber, SIP and Kerberos." msgstr "" -#: gnu/packages/gnome.scm:4078 +#: gnu/packages/gnome.scm:4317 msgid "Store address books and calendars" msgstr "" -#: gnu/packages/gnome.scm:4081 +#: gnu/packages/gnome.scm:4320 msgid "" "This package provides a unified backend for programs that work with\n" "contacts, tasks, and calendar information. It was originally developed for\n" "Evolution (hence the name), but is now used by other packages as well." msgstr "" -#: gnu/packages/gnome.scm:4144 +#: gnu/packages/gnome.scm:4383 msgid "Text entry and UI navigation application" msgstr "" -#: gnu/packages/gnome.scm:4147 +#: gnu/packages/gnome.scm:4386 msgid "" "Caribou is an input assistive technology intended for switch and pointer\n" "users." msgstr "" -#: gnu/packages/gnome.scm:4233 +#: gnu/packages/gnome.scm:4492 msgid "Network connection manager" msgstr "" -#: gnu/packages/gnome.scm:4236 +#: gnu/packages/gnome.scm:4495 msgid "" "NetworkManager is a system network service that manages your network\n" "devices and connections, attempting to keep active network connectivity when\n" @@ -3409,21 +4143,29 @@ msgid "" "services." msgstr "" -#: gnu/packages/gnome.scm:4271 +#: gnu/packages/gnome.scm:4520 +msgid "Database of broadband connection configuration" +msgstr "" + +#: gnu/packages/gnome.scm:4521 +msgid "Database of broadband connection configuration." +msgstr "" + +#: gnu/packages/gnome.scm:4556 msgid "Applet for managing network connections" msgstr "" -#: gnu/packages/gnome.scm:4274 +#: gnu/packages/gnome.scm:4559 msgid "" "This package contains a systray applet for NetworkManager. It displays\n" "the available networks and allows users to easily switch between them." msgstr "" -#: gnu/packages/gnome.scm:4299 +#: gnu/packages/gnome.scm:4584 msgid "C++ wrapper for XML parser library libxml2" msgstr "C++-omslag for XML-fortolkerbiblioteket libxml2" -#: gnu/packages/gnome.scm:4301 +#: gnu/packages/gnome.scm:4586 msgid "" "This package provides a C++ wrapper for the XML parser library\n" "libxml2." @@ -3431,41 +4173,41 @@ msgstr "" "Denne pakke tilbyder et C++-omslag for XML-fortolkerbiblioteket\n" "libxml2." -#: gnu/packages/gnome.scm:4358 +#: gnu/packages/gnome.scm:4657 msgid "Display manager for GNOME" msgstr "" -#: gnu/packages/gnome.scm:4361 +#: gnu/packages/gnome.scm:4660 msgid "" "GNOME Display Manager is a system service that is responsible for\n" "providing graphical log-ins and managing local and remote displays." msgstr "" -#: gnu/packages/gnome.scm:4385 +#: gnu/packages/gnome.scm:4684 msgid "Portable system access library" msgstr "" -#: gnu/packages/gnome.scm:4388 +#: gnu/packages/gnome.scm:4687 msgid "" "LibGTop is a library to get system specific data such as CPU and memory\n" "usage and information about running processes." msgstr "" -#: gnu/packages/gnome.scm:4418 +#: gnu/packages/gnome.scm:4717 msgid "GNOME Bluetooth subsystem" msgstr "" -#: gnu/packages/gnome.scm:4421 +#: gnu/packages/gnome.scm:4720 msgid "" "This package contains tools for managing and manipulating Bluetooth\n" "devices using the GNOME desktop." msgstr "" -#: gnu/packages/gnome.scm:4486 +#: gnu/packages/gnome.scm:4786 msgid "Utilities to configure the GNOME desktop" msgstr "" -#: gnu/packages/gnome.scm:4489 +#: gnu/packages/gnome.scm:4789 msgid "" "This package contains configuration applets for the GNOME desktop,\n" "allowing to set accessibility configuration, desktop fonts, keyboard and mouse\n" @@ -3473,21 +4215,21 @@ msgid "" "properties, screen resolution, and other GNOME parameters." msgstr "" -#: gnu/packages/gnome.scm:4570 +#: gnu/packages/gnome.scm:4870 msgid "Desktop shell for GNOME" msgstr "" -#: gnu/packages/gnome.scm:4573 +#: gnu/packages/gnome.scm:4873 msgid "" "GNOME Shell provides core user interface functions for the GNOME desktop,\n" "like switching to windows and launching applications." msgstr "" -#: gnu/packages/gnome.scm:4607 +#: gnu/packages/gnome.scm:4907 msgid "VNC viewer widget for GTK+" msgstr "" -#: gnu/packages/gnome.scm:4609 +#: gnu/packages/gnome.scm:4909 msgid "" "GTK-VNC is a VNC viewer widget for GTK+, used by remote desktop viewing\n" "applications, for instance the Vinagre client, GNOME Boxes and virt-viewer.\n" @@ -3495,22 +4237,22 @@ msgid "" "as SASL, TLS and VeNCrypt. Additionally it supports encoding extensions." msgstr "" -#: gnu/packages/gnome.scm:4647 +#: gnu/packages/gnome.scm:4952 msgid "File manager for GNOME" msgstr "Filhåndtering for GNOME" -#: gnu/packages/gnome.scm:4650 +#: gnu/packages/gnome.scm:4955 msgid "" "Nautilus (Files) is a file manager designed to fit the GNOME desktop\n" "design and behaviour, giving the user a simple way to navigate and manage its\n" "files." msgstr "" -#: gnu/packages/gnome.scm:4678 +#: gnu/packages/gnome.scm:4983 msgid "Disk usage analyzer for GNOME" msgstr "" -#: gnu/packages/gnome.scm:4680 +#: gnu/packages/gnome.scm:4985 msgid "" "Baobab (Disk Usage Analyzer) is a graphical application to analyse disk\n" "usage in the GNOME desktop environment. It can easily scan device volumes or\n" @@ -3518,11 +4260,11 @@ msgid "" "is complete it provides a graphical representation of each selected folder." msgstr "" -#: gnu/packages/gnome.scm:4704 +#: gnu/packages/gnome.scm:5009 msgid "Background images for the GNOME desktop" msgstr "" -#: gnu/packages/gnome.scm:4706 +#: gnu/packages/gnome.scm:5011 msgid "" "GNOME backgrounds package contains a collection of graphics files which\n" "can be used as backgrounds in the GNOME Desktop environment. Additionally,\n" @@ -3530,55 +4272,243 @@ msgid "" "can add your own files to the collection." msgstr "" -#: gnu/packages/gnome.scm:4739 +#: gnu/packages/gnome.scm:5044 msgid "Take pictures of your screen" msgstr "" -#: gnu/packages/gnome.scm:4741 +#: gnu/packages/gnome.scm:5046 msgid "" "GNOME Screenshot is a utility used for taking screenshots of the entire\n" "screen, a window or a user defined area of the screen, with optional\n" "beautifying border effects." msgstr "" -#: gnu/packages/gnome.scm:4769 +#: gnu/packages/gnome.scm:5083 msgid "Graphical editor for GNOME's dconf configuration system" msgstr "" -#: gnu/packages/gnome.scm:4771 +#: gnu/packages/gnome.scm:5085 msgid "" "Dconf-editor is a graphical tool for browsing and editing the dconf\n" "configuration system for GNOME. It allows users to configure desktop\n" "software that do not provide their own configuration interface." msgstr "" -#: gnu/packages/gnome.scm:4809 +#: gnu/packages/gnome.scm:5130 msgid "The GNU desktop environment" msgstr "GNU-skrivebordsmiljøet" -#: gnu/packages/gnome.scm:4812 +#: gnu/packages/gnome.scm:5133 msgid "" "GNOME is the graphical desktop for GNU. It includes a wide variety of\n" "applications for browsing the web, editing text and images, creating\n" "documents and diagrams, playing media, scanning, and much more." msgstr "" -#: gnu/packages/gnome.scm:4863 +#: gnu/packages/gnome.scm:5184 msgid "Desktop recording program" msgstr "Skrivebordsoptagelsesprogram" -#: gnu/packages/gnome.scm:4864 +#: gnu/packages/gnome.scm:5185 msgid "" "Byzanz is a simple desktop recording program with a\n" "command-line interface. It can record part or all of an X display for a\n" "specified duration and save it as a GIF encoded animated image file." msgstr "" -#: gnu/packages/gnuzilla.scm:95 -msgid "Mozilla javascript engine" +#: gnu/packages/gnome.scm:5213 +msgid "Library for accessing SkyDrive and Hotmail" +msgstr "Bibliotek til at tilgå SkyDrive og Hotmail" + +#: gnu/packages/gnome.scm:5215 +msgid "" +"Libzapojit is a GLib-based library for accessing online service APIs of\n" +"Microsoft SkyDrive and Hotmail, using their REST protocols." +msgstr "" + +#: gnu/packages/gnome.scm:5241 +msgid "GNOME's calendar application" +msgstr "GNOME's kalenderprogram" + +#: gnu/packages/gnome.scm:5243 +msgid "" +"GNOME Calendar is a simple calendar application designed to fit the GNOME\n" +"desktop. It supports multiple calendars, monthly view and yearly view." +msgstr "" + +#: gnu/packages/gnome.scm:5271 +msgid "Look up words in dictionary sources" +msgstr "" + +#: gnu/packages/gnome.scm:5273 +msgid "" +"GNOME Dictionary can look for the definition or translation of a word in\n" +"existing databases over the internet." +msgstr "" + +#: gnu/packages/gnome.scm:5311 +msgid "Customize advanced GNOME 3 options" +msgstr "Tilpas avancerede GNOME 3-indstillinger" + +#: gnu/packages/gnome.scm:5314 +msgid "" +"GNOME Tweak Tool allows adjusting advanced configuration settings in\n" +"GNOME 3. This includes things like the fonts used in user interface elements,\n" +"alternative user interface themes, changes in window management behavior,\n" +"GNOME Shell appearance and extension, etc." +msgstr "" + +#: gnu/packages/gnome.scm:5341 +msgid "Extensions for GNOME Shell" +msgstr "" + +#: gnu/packages/gnome.scm:5342 +msgid "" +"GNOME Shell extensions modify and extend GNOME Shell\n" +"functionality and behavior." +msgstr "" + +#: gnu/packages/gnome.scm:5372 +msgid "A flat GTK+ theme with transparent elements" +msgstr "" + +#: gnu/packages/gnome.scm:5373 +msgid "" +"Arc is a flat theme with transparent elements for GTK 3, GTK\n" +"2, and GNOME Shell which supports GTK 3 and GTK 2 based desktop environments\n" +"like GNOME, Unity, Budgie, Pantheon, XFCE, Mate, etc." +msgstr "" + +#: gnu/packages/gnome.scm:5409 +msgid "Moka icon theme" +msgstr "Moka-ikontema" + +#: gnu/packages/gnome.scm:5410 +msgid "" +"Moka is a stylized desktop icon set, designed to be clear,\n" +"simple and consistent." msgstr "" -#: gnu/packages/gnuzilla.scm:96 +#: gnu/packages/gnome.scm:5440 +msgid "Arc icon theme" +msgstr "Arc-ikontema" + +#: gnu/packages/gnome.scm:5441 +msgid "" +"The Arc icon theme provides a set of icons matching the\n" +"style of the Arc GTK theme. Icons missing from the Arc theme are provided by\n" +"the Moka icon theme." +msgstr "" + +#: gnu/packages/gnome.scm:5473 +msgid "Library to aggregate data about people" +msgstr "Bibliotek til at aggregere data om folk" + +#: gnu/packages/gnome.scm:5474 +msgid "" +"Libfolks is a library that aggregates information about people\n" +"from multiple sources (e.g., Telepathy connection managers for IM contacts,\n" +"Evolution Data Server for local contacts, libsocialweb for web service contacts,\n" +"etc.) to create metacontacts. It's written in Vala, which generates C code when\n" +"compiled." +msgstr "" + +#: gnu/packages/gnome.scm:5509 +msgid "GLib/GObject wrapper for the Facebook API" +msgstr "GLib/GObject-omslag for Facebook-API'en" + +#: gnu/packages/gnome.scm:5510 +msgid "" +"This library allows you to use the Facebook API from\n" +"GLib/GObject code." +msgstr "" + +#: gnu/packages/gnome.scm:5538 +msgid "GNOME keyboard configuration library" +msgstr "Konfigurationsbibliotek for GNOME-tastatur" + +#: gnu/packages/gnome.scm:5540 +msgid "" +"Libgnomekbd is a keyboard configuration library for the GNOME desktop\n" +"environment, which can notably display keyboard layouts." +msgstr "" + +#: gnu/packages/gnome.scm:5574 +msgid "Library for writing single instance applications" +msgstr "Bibliotek til at skrive enkel instans-programmer" + +#: gnu/packages/gnome.scm:5576 +msgid "" +"Libunique is a library for writing single instance applications. If you\n" +"launch a single instance application twice, the second instance will either just\n" +"quit or will send a message to the running instance. Libunique makes it easy to\n" +"write this kind of application, by providing a base class, taking care of all\n" +"the IPC machinery needed to send messages to a running instance, and also\n" +"handling the startup notification side." +msgstr "" + +#: gnu/packages/gnome.scm:5608 +msgid "Desktop calculator" +msgstr "Skrivebordslommeregner" + +#: gnu/packages/gnome.scm:5610 +msgid "" +"Calculator is an application that solves mathematical equations and\n" +"is suitable as a default application in a Desktop environment." +msgstr "" + +#: gnu/packages/gnome.scm:5635 +msgid "Virtual sticky note" +msgstr "" + +#: gnu/packages/gnome.scm:5637 +msgid "" +"Xpad is a sticky note that strives to be simple, fault tolerant,\n" +"and customizable. Xpad consists of independent pad windows, each is\n" +"basically a text box in which notes can be written." +msgstr "" + +#: gnu/packages/gnome.scm:5667 +msgid "Unicode character picker and font browser" +msgstr "" + +#: gnu/packages/gnome.scm:5669 +msgid "" +"This program allows you to browse through all the available Unicode\n" +"characters and categories for the installed fonts, and to examine their\n" +"detailed properties. It is an easy way to find the character you might\n" +"only know by its Unicode name or code point." +msgstr "" + +#: gnu/packages/gnome.scm:5699 +msgid "Web development studio" +msgstr "" + +#: gnu/packages/gnome.scm:5701 +msgid "" +"Bluefish is an editor targeted towards programmers and web developers,\n" +"with many options to write web sites, scripts and other code.\n" +"Bluefish supports many programming and markup languages." +msgstr "" + +#: gnu/packages/gnome.scm:5733 +msgid "Process viewer and system resource monitor for GNOME" +msgstr "" + +#: gnu/packages/gnome.scm:5735 +msgid "" +"GNOME System Monitor is a GNOME process viewer and system monitor with\n" +"an attractive, easy-to-use interface. It has features, such as a tree view\n" +"for process dependencies, icons for processes, the ability to hide processes,\n" +"graphical time histories of CPU/memory/swap usage and the ability to\n" +"kill/reinice processes." +msgstr "" + +#: gnu/packages/gnuzilla.scm:101 +msgid "Mozilla javascript engine" +msgstr "Mozillas javascriptmotor" + +#: gnu/packages/gnuzilla.scm:102 msgid "" "SpiderMonkey is Mozilla's JavaScript engine written\n" "in C/C++." @@ -3586,22 +4516,22 @@ msgstr "" "SpiderMonkey er Mozillas JavaScript-motor skrevet\n" "i C/C++." -#: gnu/packages/gnuzilla.scm:171 +#: gnu/packages/gnuzilla.scm:180 msgid "Netscape API for system level and libc-like functions" msgstr "" -#: gnu/packages/gnuzilla.scm:172 +#: gnu/packages/gnuzilla.scm:181 msgid "" "Netscape Portable Runtime (NSPR) provides a\n" "platform-neutral API for system level and libc-like functions. It is used\n" "in the Mozilla clients." msgstr "" -#: gnu/packages/gnuzilla.scm:268 +#: gnu/packages/gnuzilla.scm:285 msgid "Network Security Services" msgstr "" -#: gnu/packages/gnuzilla.scm:270 +#: gnu/packages/gnuzilla.scm:287 msgid "" "Network Security Services (NSS) is a set of libraries designed to support\n" "cross-platform development of security-enabled client and server applications.\n" @@ -3610,33 +4540,33 @@ msgid "" "standards." msgstr "" -#: gnu/packages/gnuzilla.scm:507 +#: gnu/packages/gnuzilla.scm:623 msgid "Entirely free browser derived from Mozilla Firefox" msgstr "" -#: gnu/packages/gnuzilla.scm:509 +#: gnu/packages/gnuzilla.scm:625 msgid "" "IceCat is the GNU version of the Firefox browser. It is entirely free\n" "software, which does not recommend non-free plugins and addons. It also\n" "features built-in privacy-protecting features." msgstr "" -#: gnu/packages/gtk.scm:87 +#: gnu/packages/gtk.scm:94 msgid "GNOME accessibility toolkit" msgstr "" -#: gnu/packages/gtk.scm:89 +#: gnu/packages/gtk.scm:96 msgid "" "ATK provides the set of accessibility interfaces that are implemented\n" "by other toolkits and applications. Using the ATK interfaces, accessibility\n" "tools have full access to view and control running applications." msgstr "" -#: gnu/packages/gtk.scm:128 +#: gnu/packages/gtk.scm:136 msgid "2D graphics library" msgstr "2D-grafikbibliotek" -#: gnu/packages/gtk.scm:130 +#: gnu/packages/gtk.scm:138 msgid "" "Cairo is a 2D graphics library with support for multiple output devices.\n" "Currently supported output targets include the X Window System (via both\n" @@ -3654,52 +4584,56 @@ msgid "" "affine transformation (scale, rotation, shear, etc.)." msgstr "" -#: gnu/packages/gtk.scm:178 +#: gnu/packages/gtk.scm:166 +msgid "2D graphics library (with X11 support)" +msgstr "2D-grafikbibliotek (med X11-understøttelse)" + +#: gnu/packages/gtk.scm:199 msgid "OpenType text shaping engine" -msgstr "" +msgstr "OpenType-tekstformningsmotor" -#: gnu/packages/gtk.scm:180 +#: gnu/packages/gtk.scm:201 msgid "HarfBuzz is an OpenType text shaping engine." -msgstr "" +msgstr "HarfBuzz er et OpenType-tekstformningsmotor." -#: gnu/packages/gtk.scm:211 +#: gnu/packages/gtk.scm:232 msgid "GNOME text and font handling library" msgstr "" -#: gnu/packages/gtk.scm:213 +#: gnu/packages/gtk.scm:234 msgid "" "Pango is the core text and font handling library used in GNOME\n" "applications. It has extensive support for the different writing systems\n" "used throughout the world." msgstr "" -#: gnu/packages/gtk.scm:239 +#: gnu/packages/gtk.scm:260 msgid "Obsolete pango functions" msgstr "" -#: gnu/packages/gtk.scm:240 +#: gnu/packages/gtk.scm:261 msgid "" "Pangox was a X backend to pango. It is now obsolete and no\n" "longer provided by recent pango releases. pangox-compat provides the\n" "functions which were removed." msgstr "" -#: gnu/packages/gtk.scm:276 +#: gnu/packages/gtk.scm:297 msgid "GTK+ widget for interactive graph-like environments" msgstr "" -#: gnu/packages/gtk.scm:278 +#: gnu/packages/gtk.scm:299 msgid "" "Ganv is an interactive GTK+ widget for interactive “boxes and lines” or\n" "graph-like environments, e.g. modular synths or finite state machine\n" "diagrams." msgstr "" -#: gnu/packages/gtk.scm:330 +#: gnu/packages/gtk.scm:368 msgid "Widget that extends the standard GTK+ 2.x 'GtkTextView' widget" msgstr "" -#: gnu/packages/gtk.scm:332 +#: gnu/packages/gtk.scm:370 msgid "" "GtkSourceView is a portable C library that extends the standard GTK+\n" "framework for multiline text editing with support for configurable syntax\n" @@ -3707,52 +4641,56 @@ msgid "" "printing and other features typical of a source code editor." msgstr "" -#: gnu/packages/gtk.scm:381 +#: gnu/packages/gtk.scm:419 msgid "GNOME source code widget" msgstr "" -#: gnu/packages/gtk.scm:382 +#: gnu/packages/gtk.scm:420 msgid "" "GtkSourceView is a text widget that extends the standard\n" "GTK+ text widget GtkTextView. It improves GtkTextView by implementing syntax\n" "highlighting and other features typical of a source code editor." msgstr "" -#: gnu/packages/gtk.scm:429 +#: gnu/packages/gtk.scm:470 msgid "GNOME image loading and manipulation library" msgstr "" -#: gnu/packages/gtk.scm:431 +#: gnu/packages/gtk.scm:472 msgid "" "GdkPixbuf is a library for image loading and manipulation developed\n" "in the GNOME project." msgstr "" -#: gnu/packages/gtk.scm:474 +#: gnu/packages/gtk.scm:504 +msgid "GNOME image loading and manipulation library, with SVG support" +msgstr "GNOME-billedindlæsnings- og manipuleringsbibliotek, med SVG-understøttelse" + +#: gnu/packages/gtk.scm:544 msgid "Assistive Technology Service Provider Interface, core components" msgstr "" -#: gnu/packages/gtk.scm:476 +#: gnu/packages/gtk.scm:546 msgid "" "The Assistive Technology Service Provider Interface, core components,\n" "is part of the GNOME accessibility project." msgstr "" -#: gnu/packages/gtk.scm:509 +#: gnu/packages/gtk.scm:579 msgid "Assistive Technology Service Provider Interface, ATK bindings" msgstr "" -#: gnu/packages/gtk.scm:511 +#: gnu/packages/gtk.scm:581 msgid "" "The Assistive Technology Service Provider Interface\n" "is part of the GNOME accessibility project." msgstr "" -#: gnu/packages/gtk.scm:568 +#: gnu/packages/gtk.scm:640 msgid "Cross-platform toolkit for creating graphical user interfaces" msgstr "" -#: gnu/packages/gtk.scm:570 +#: gnu/packages/gtk.scm:642 msgid "" "GTK+, or the GIMP Toolkit, is a multi-platform toolkit for creating\n" "graphical user interfaces. Offering a complete set of widgets, GTK+ is\n" @@ -3760,11 +4698,11 @@ msgid "" "application suites." msgstr "" -#: gnu/packages/gtk.scm:705 +#: gnu/packages/gtk.scm:774 msgid "Cairo bindings for GNU Guile" msgstr "" -#: gnu/packages/gtk.scm:707 +#: gnu/packages/gtk.scm:776 msgid "" "Guile-Cairo wraps the Cairo graphics library for Guile Scheme.\n" "Guile-Cairo is complete, wrapping almost all of the Cairo API. It is API\n" @@ -3774,21 +4712,21 @@ msgid "" "exceptions, macros, and a dynamic programming environment." msgstr "" -#: gnu/packages/gtk.scm:747 +#: gnu/packages/gtk.scm:816 msgid "Render SVG images using Cairo from Guile" msgstr "" -#: gnu/packages/gtk.scm:749 +#: gnu/packages/gtk.scm:818 msgid "" "Guile-RSVG wraps the RSVG library for Guile, allowing you to render SVG\n" "images onto Cairo surfaces." msgstr "" -#: gnu/packages/gtk.scm:793 +#: gnu/packages/gtk.scm:862 msgid "Create SVG or PDF presentations in Guile" msgstr "Opret SVG- eller PDF-præsentationer i Guile" -#: gnu/packages/gtk.scm:795 +#: gnu/packages/gtk.scm:864 msgid "" "Guile-Present defines a declarative vocabulary for presentations,\n" "together with tools to render presentation documents as SVG or PDF.\n" @@ -3797,41 +4735,51 @@ msgid "" "documents." msgstr "" -#: gnu/packages/gtk.scm:829 +#: gnu/packages/gtk.scm:918 +msgid "Guile interface for GTK+ programming for GNOME" +msgstr "Guile brugerflade til GTK+-programmering for GNOME" + +#: gnu/packages/gtk.scm:920 +msgid "" +"Includes guile-clutter, guile-gnome-gstreamer,\n" +"guile-gnome-platform (GNOME developer libraries), and guile-gtksourceview." +msgstr "" + +#: gnu/packages/gtk.scm:952 msgid "C++ bindings to the Cairo 2D graphics library" msgstr "C++-bindinger til CAiro 2D-grafikbiblioteket" -#: gnu/packages/gtk.scm:831 +#: gnu/packages/gtk.scm:954 msgid "" "Cairomm provides a C++ programming interface to the Cairo 2D graphics\n" "library." msgstr "" -#: gnu/packages/gtk.scm:855 +#: gnu/packages/gtk.scm:978 msgid "C++ interface to the Pango text rendering library" msgstr "C++-grænseflade til tekstoptegningsbiblioteket Pango" -#: gnu/packages/gtk.scm:857 +#: gnu/packages/gtk.scm:980 msgid "" "Pangomm provides a C++ programming interface to the Pango text rendering\n" "library." msgstr "" -#: gnu/packages/gtk.scm:878 +#: gnu/packages/gtk.scm:1001 msgid "C++ interface to the ATK accessibility library" -msgstr "" +msgstr "C++-grænseflade til ATK-tilgængelighedsbiblioteket" -#: gnu/packages/gtk.scm:880 +#: gnu/packages/gtk.scm:1003 msgid "" "ATKmm provides a C++ programming interface to the ATK accessibility\n" "toolkit." msgstr "" -#: gnu/packages/gtk.scm:907 +#: gnu/packages/gtk.scm:1043 msgid "C++ interface to the GTK+ graphical user interface library" msgstr "" -#: gnu/packages/gtk.scm:909 +#: gnu/packages/gtk.scm:1045 msgid "" "gtkmm is the official C++ interface for the popular GUI library GTK+.\n" "Highlights include typesafe callbacks, and a comprehensive set of widgets that\n" @@ -3840,30 +4788,30 @@ msgid "" "extensive documentation, including API reference and a tutorial." msgstr "" -#: gnu/packages/gtk.scm:968 +#: gnu/packages/gtk.scm:1104 msgid "Python bindings for cairo" -msgstr "" +msgstr "Pythonbindinger for cairo" -#: gnu/packages/gtk.scm:970 +#: gnu/packages/gtk.scm:1106 msgid "Pycairo is a set of Python bindings for the Cairo graphics library." -msgstr "" +msgstr "Pycairo er et sæt af Pythonbindinger for grafikbiblioteket Cairo." -#: gnu/packages/gtk.scm:1054 +#: gnu/packages/gtk.scm:1190 msgid "Python bindings for GTK+" -msgstr "" +msgstr "Pythonbindinger for GTK+" -#: gnu/packages/gtk.scm:1056 +#: gnu/packages/gtk.scm:1192 msgid "" "PyGTK allows you to write full featured GTK programs in Python. It is\n" "targetted at GTK 2.x, and can be used in conjunction with gnome-python to\n" "write GNOME applications." msgstr "" -#: gnu/packages/gtk.scm:1087 +#: gnu/packages/gtk.scm:1223 msgid "Library for minimalistic gtk+3 user interfaces" msgstr "" -#: gnu/packages/gtk.scm:1088 +#: gnu/packages/gtk.scm:1224 msgid "" "Girara is a library that implements a user interface that\n" "focuses on simplicity and minimalism. Currently based on GTK+, a\n" @@ -3874,43 +4822,64 @@ msgid "" "information." msgstr "" -#: gnu/packages/gtk.scm:1149 +#: gnu/packages/gtk.scm:1286 msgid "Documentation generator from C source code" msgstr "" -#: gnu/packages/gtk.scm:1151 +#: gnu/packages/gtk.scm:1288 msgid "" "GTK-Doc generates API documentation from comments added to C code. It is\n" "typically used to document the public API of GTK+ and GNOME libraries, but it\n" "can also be used to document application code." msgstr "" -#: gnu/packages/gtk.scm:1178 +#: gnu/packages/gtk.scm:1316 msgid "Theming engines for GTK+ 2.x" msgstr "" -#: gnu/packages/gtk.scm:1180 +#: gnu/packages/gtk.scm:1318 msgid "" "This package contains the standard GTK+ 2.x theming engines including\n" "Clearlooks, Crux, High Contrast, Industrial, LighthouseBlue, Metal, Mist,\n" "Redmond95 and ThinIce." msgstr "" -#: gnu/packages/gtk.scm:1208 +#: gnu/packages/gtk.scm:1346 msgid "Cairo-based theming engine for GTK+ 2.x" msgstr "" -#: gnu/packages/gtk.scm:1210 +#: gnu/packages/gtk.scm:1348 msgid "" "Murrine is a cairo-based GTK+ theming engine. It is named after the\n" "glass artworks done by Venicians glass blowers." msgstr "" -#: gnu/packages/guile.scm:114 gnu/packages/guile.scm:182 +#: gnu/packages/gtk.scm:1373 +msgid "Spell-checking addon for GTK's TextView widget" +msgstr "" + +#: gnu/packages/gtk.scm:1375 +msgid "" +"GtkSpell provides word-processor-style highlighting and replacement of\n" +"misspelled words in a GtkTextView widget." +msgstr "" + +#: gnu/packages/gtk.scm:1398 +msgid "Lightweight GTK+ clipboard manager" +msgstr "" + +#: gnu/packages/gtk.scm:1400 +msgid "" +"ClipIt is a clipboard manager with features such as a history, search\n" +"thereof, global hotkeys and clipboard item actions. It was forked from\n" +"Parcellite and adds bugfixes and features." +msgstr "" + +#: gnu/packages/guile.scm:123 gnu/packages/guile.scm:199 msgid "Scheme implementation intended especially for extensions" msgstr "" -#: gnu/packages/guile.scm:116 gnu/packages/guile.scm:184 +#: gnu/packages/guile.scm:125 gnu/packages/guile.scm:201 msgid "" "Guile is the GNU Ubiquitous Intelligent Language for Extensions, the\n" "official extension language of the GNU system. It is an implementation of\n" @@ -3919,15 +4888,15 @@ msgid "" "without requiring the source code to be rewritten." msgstr "" -#: gnu/packages/guile.scm:215 +#: gnu/packages/guile.scm:249 msgid "Snapshot of what will become version 2.2 of GNU Guile" msgstr "" -#: gnu/packages/guile.scm:313 +#: gnu/packages/guile.scm:367 msgid "Web application framework written in Guile" msgstr "" -#: gnu/packages/guile.scm:314 +#: gnu/packages/guile.scm:368 msgid "" "GNU Artanis is a web application framework written in Guile\n" "Scheme. A web application framework (WAF) is a software framework that is\n" @@ -3939,11 +4908,11 @@ msgid "" "more." msgstr "" -#: gnu/packages/guile.scm:344 +#: gnu/packages/guile.scm:398 msgid "Framework for building readers for GNU Guile" msgstr "Ramme til at bygge læsere for GNU Guile" -#: gnu/packages/guile.scm:346 +#: gnu/packages/guile.scm:400 msgid "" "Guile-Reader is a simple framework for building readers for GNU Guile.\n" "\n" @@ -3958,21 +4927,21 @@ msgid "" "many readers as needed)." msgstr "" -#: gnu/packages/guile.scm:395 +#: gnu/packages/guile.scm:445 msgid "Guile bindings to ncurses" msgstr "Guilebindinger til ncurses" -#: gnu/packages/guile.scm:397 +#: gnu/packages/guile.scm:447 msgid "" "guile-ncurses provides Guile language bindings for the ncurses\n" "library." msgstr "" -#: gnu/packages/guile.scm:417 +#: gnu/packages/guile.scm:467 msgid "Run jobs at scheduled times" msgstr "Afvikl job på planlagte tidspunkter" -#: gnu/packages/guile.scm:419 +#: gnu/packages/guile.scm:469 msgid "" "GNU Mcron is a complete replacement for Vixie cron. It is used to run\n" "tasks on a schedule, such as every hour or every Monday. Mcron is written in\n" @@ -3980,11 +4949,11 @@ msgid "" "format is also supported." msgstr "" -#: gnu/packages/guile.scm:447 +#: gnu/packages/guile.scm:556 msgid "Collection of useful Guile Scheme modules" msgstr "" -#: gnu/packages/guile.scm:449 +#: gnu/packages/guile.scm:558 msgid "" "Guile-Lib is intended as an accumulation place for pure-scheme Guile\n" "modules, allowing for people to cooperate integrating their generic Guile\n" @@ -3992,11 +4961,11 @@ msgid "" "for Guile\"." msgstr "" -#: gnu/packages/guile.scm:480 +#: gnu/packages/guile.scm:593 msgid "JSON module for Guile" msgstr "JSON-modul for Guile" -#: gnu/packages/guile.scm:482 +#: gnu/packages/guile.scm:595 msgid "" "Guile-json supports parsing and building JSON documents according to the\n" "http:://json.org specification. These are the main features:\n" @@ -4006,11 +4975,11 @@ msgid "" "- Allows JSON pretty printing." msgstr "" -#: gnu/packages/guile.scm:553 +#: gnu/packages/guile.scm:676 msgid "MiniKanren declarative logic system, packaged for Guile" msgstr "" -#: gnu/packages/guile.scm:555 +#: gnu/packages/guile.scm:678 msgid "" "MiniKanren is a relational programming extension to the Scheme\n" "programming Language, written as a smaller version of Kanren suitable for\n" @@ -4023,43 +4992,51 @@ msgid "" "See http://minikanren.org/ for more on miniKanren generally." msgstr "" -#: gnu/packages/guile.scm:638 +#: gnu/packages/guile.scm:767 msgid "S-expression based regular expressions" msgstr "" -#: gnu/packages/guile.scm:640 +#: gnu/packages/guile.scm:769 msgid "" "Irregex is an s-expression based alternative to your classic\n" "string-based regular expressions. It implements SRFI 115 and is deeply\n" "inspired by the SCSH regular expression system." msgstr "" -#: gnu/packages/guile.scm:704 +#: gnu/packages/guile.scm:836 msgid "Guile bindings to the GDBM library via Guile's FFI" msgstr "" -#: gnu/packages/guile.scm:706 +#: gnu/packages/guile.scm:838 msgid "" "Guile bindings to the GDBM key-value storage system, using\n" "Guile's foreign function interface." msgstr "" -#: gnu/packages/guile.scm:746 +#: gnu/packages/guile.scm:886 +msgid "Access SQLite databases from Guile" +msgstr "Tilgå SQLite-databaser fra Guile" + +#: gnu/packages/guile.scm:888 +msgid "This package provides Guile bindings to the SQLite database system." +msgstr "Denne pakke tilbyder Guilebindinger til SQLite-databasesystemet." + +#: gnu/packages/guile.scm:932 msgid "Functional static site generator" msgstr "" -#: gnu/packages/guile.scm:747 +#: gnu/packages/guile.scm:933 msgid "" "Haunt is a static site generator written in Guile\n" "Scheme. Haunt features a functional build system and an extensible\n" "interface for reading articles in any format." msgstr "" -#: gnu/packages/guile.scm:768 +#: gnu/packages/guile.scm:954 msgid "Guile application configuration parsing library" msgstr "" -#: gnu/packages/guile.scm:770 +#: gnu/packages/guile.scm:956 msgid "" "Guile Config is a library providing a declarative approach to\n" "application configuration specification. The library provides clean\n" @@ -4070,43 +5047,43 @@ msgid "" "above command-line parameters." msgstr "" -#: gnu/packages/guile.scm:804 +#: gnu/packages/guile.scm:994 msgid "Redis client library for Guile" msgstr "" -#: gnu/packages/guile.scm:805 +#: gnu/packages/guile.scm:995 msgid "" "Guile-redis provides a Scheme interface to the Redis\n" "key-value cache and store." msgstr "" -#: gnu/packages/guile.scm:879 +#: gnu/packages/guile.scm:1072 msgid "Whitespace to lisp syntax for Guile" msgstr "" -#: gnu/packages/guile.scm:880 +#: gnu/packages/guile.scm:1073 msgid "" "Wisp is a syntax for Guile which provides a Python-like\n" "whitespace-significant language. It may be easier on the eyes for some\n" "users and in some situations." msgstr "" -#: gnu/packages/guile.scm:913 +#: gnu/packages/guile.scm:1106 msgid "2D/3D game engine for GNU Guile" msgstr "" -#: gnu/packages/guile.scm:914 +#: gnu/packages/guile.scm:1107 msgid "" "Sly is a 2D/3D game engine written in Guile Scheme. Sly\n" "features a functional reactive programming interface and live coding\n" "capabilities." msgstr "" -#: gnu/packages/guile.scm:939 +#: gnu/packages/guile.scm:1142 msgid "Generate C bindings for Guile" msgstr "" -#: gnu/packages/guile.scm:940 +#: gnu/packages/guile.scm:1143 msgid "" "G-Wrap is a tool and Guile library for generating function\n" "wrappers for inter-language calls. It currently only supports generating Guile\n" @@ -4115,13 +5092,93 @@ msgid "" "provides access to that interface and its types from the Scheme level." msgstr "" -#: gnu/packages/imagemagick.scm:101 gnu/packages/imagemagick.scm:195 +#: gnu/packages/guile.scm:1180 +msgid "Guile database abstraction layer" +msgstr "Guile-databaseabstraktionslag" + +#: gnu/packages/guile.scm:1183 +msgid "" +"guile-dbi is a library for Guile that provides a convenient interface to\n" +"SQL databases. Database programming with guile-dbi is generic in that the same\n" +"programming interface is presented regardless of which database system is used.\n" +"It currently supports MySQL, Postgres and SQLite3." +msgstr "" + +#: gnu/packages/guile.scm:1209 +msgid "Guile DBI driver for SQLite" +msgstr "Guile DBI-driver for SQLite" + +#: gnu/packages/guile.scm:1212 +msgid "" +"guile-dbi is a library for Guile that provides a convenient interface to\n" +"SQL databases. This package implements the interface for SQLite." +msgstr "" + +#: gnu/packages/guile.scm:1238 +msgid "XOSD bindings for Guile" +msgstr "XOSD-bindinger for Guile" + +#: gnu/packages/guile.scm:1240 +msgid "" +"Guile-XOSD provides Guile bindings for @code{libxosd},\n" +"@uref{http://sourceforge.net/projects/libxosd/, the X On Screen Display\n" +"library}." +msgstr "" + +#: gnu/packages/guile.scm:1263 +msgid "Evaluate code in a running Guile process" +msgstr "Evaluer kode i en kørende Guileproces" + +#: gnu/packages/guile.scm:1265 +msgid "" +"Guile-Daemon is a small Guile program that loads your initial\n" +"configuration file, and then reads and evaluates Guile expressions that\n" +"you send to a FIFO file." +msgstr "" + +#: gnu/packages/guile.scm:1296 +msgid "CommonMark parser for Guile" +msgstr "" + +#: gnu/packages/guile.scm:1298 +msgid "" +"guile-commonmark is a library for parsing CommonMark, a fully specified\n" +"variant of Markdown. The library is written in Guile Scheme and is designed\n" +"to transform a CommonMark document to SXML. guile-commonmark tries to closely\n" +"follow the @uref{http://commonmark.org/, CommonMark spec}, the main difference\n" +"is no support for parsing block and inline level HTML." +msgstr "" + +#: gnu/packages/guile.scm:1380 +msgid "Structured access to bytevector contents for Guile" +msgstr "" + +#: gnu/packages/guile.scm:1382 +msgid "" +"Guile bytestructures offers a system imitating the type system\n" +"of the C programming language, to be used on bytevectors. C's type\n" +"system works on raw memory, and Guile works on bytevectors which are\n" +"an abstraction over raw memory. It's also more powerful than the C\n" +"type system, elevating types to first-class status." +msgstr "" + +#: gnu/packages/guile.scm:1419 +msgid "Spell-checking from Guile" +msgstr "" + +#: gnu/packages/guile.scm:1421 +msgid "" +"guile-aspell is a Guile Scheme library for comparing a string against a\n" +"dictionary and suggesting spelling corrections." +msgstr "" + +#: gnu/packages/imagemagick.scm:106 gnu/packages/imagemagick.scm:208 msgid "Create, edit, compose, or convert bitmap images" msgstr "Opret, rediger, komponer eller konverter bitmap-billeder" -#: gnu/packages/imagemagick.scm:103 +#: gnu/packages/imagemagick.scm:108 msgid "" -"ImageMagick® is a software suite to create, edit, compose, or convert\n" +"ImageMagick is a software suite to create, edit, compose, or convert\n" "bitmap images. It can read and write images in a variety of formats (over 100)\n" "including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG,\n" "and TIFF. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and\n" @@ -4129,11 +5186,11 @@ msgid "" "text, lines, polygons, ellipses and Bézier curves." msgstr "" -#: gnu/packages/imagemagick.scm:147 +#: gnu/packages/imagemagick.scm:153 msgid "Perl interface to ImageMagick" msgstr "Perlgrænseflade til ImageMagick" -#: gnu/packages/imagemagick.scm:148 +#: gnu/packages/imagemagick.scm:154 msgid "" "This Perl extension allows the reading, manipulation and\n" "writing of a large number of image file formats using the ImageMagick library.\n" @@ -4141,28 +5198,28 @@ msgid "" "script." msgstr "" -#: gnu/packages/imagemagick.scm:197 +#: gnu/packages/imagemagick.scm:210 msgid "" "GraphicsMagick provides a comprehensive collection of utilities,\n" "programming interfaces, and GUIs, to support file format conversion, image\n" "processing, and 2D vector rendering." msgstr "" -#: gnu/packages/image.scm:71 +#: gnu/packages/image.scm:84 msgid "Library for handling PNG files" msgstr "Bibliotek for håndtering af PNG-filer" -#: gnu/packages/image.scm:73 +#: gnu/packages/image.scm:86 msgid "" "Libpng is the official PNG (Portable Network Graphics) reference\n" "library. It supports almost all PNG features and is extensible." msgstr "" -#: gnu/packages/image.scm:89 +#: gnu/packages/image.scm:118 msgid "Library for handling JPEG files" msgstr "Bibliotek for håndtering af JPEG-filer" -#: gnu/packages/image.scm:91 +#: gnu/packages/image.scm:120 msgid "" "Libjpeg implements JPEG image encoding, decoding, and transcoding.\n" "JPEG is a standardized compression method for full-color and gray-scale\n" @@ -4171,22 +5228,46 @@ msgid "" "image files in PBMPLUS PPM/PGM, GIF, BMP, and Targa file formats." msgstr "" -#: gnu/packages/image.scm:124 +#: gnu/packages/image.scm:185 +msgid "Implementation of the JPEG XR standard" +msgstr "" + +#: gnu/packages/image.scm:186 +msgid "" +"JPEG XR is an approved ISO/IEC International standard (its\n" +"official designation is ISO/IEC 29199-2). This library is an implementation of that standard." +msgstr "" + +#: gnu/packages/image.scm:209 msgid "Optimize JPEG images" msgstr "Optimer JPEG-billeder" -#: gnu/packages/image.scm:126 +#: gnu/packages/image.scm:211 msgid "" "jpegoptim provides lossless optimization (based on optimizing\n" "the Huffman tables) and \"lossy\" optimization based on setting\n" "maximum quality factor." msgstr "" -#: gnu/packages/image.scm:157 +#: gnu/packages/image.scm:236 +msgid "Library for handling Mac OS icns resource files" +msgstr "Bibliotek for håndtering af Mac OS-ikonressourcefiler" + +#: gnu/packages/image.scm:238 +msgid "" +"Libicns is a library for the manipulation of Mac OS IconFamily resource\n" +"type files (ICNS). @command{icns2png} and @command{png2icns} are provided to\n" +"convert between PNG and ICNS. @command{icns2png} will extract image files from\n" +"ICNS files under names like \"Foo_48x48x32.png\" useful for installing for use\n" +"with .desktop files. Additionally, @command{icontainer2png} is provided for\n" +"extracting icontainer icon files." +msgstr "" + +#: gnu/packages/image.scm:273 msgid "Library for handling TIFF files" msgstr "Bibliotek for håndtering af TIFF-filer" -#: gnu/packages/image.scm:159 +#: gnu/packages/image.scm:275 msgid "" "Libtiff provides support for the Tag Image File Format (TIFF), a format\n" "used for storing image data.\n" @@ -4194,11 +5275,11 @@ msgid "" "collection of tools for doing simple manipulations of TIFF images." msgstr "" -#: gnu/packages/image.scm:202 +#: gnu/packages/image.scm:318 msgid "Library for reading images in the Microsoft WMF format" msgstr "Bibliotek for læsning af billeder i Microsoft WMF-formatet" -#: gnu/packages/image.scm:204 +#: gnu/packages/image.scm:320 msgid "" "libwmf is a library for reading vector images in Microsoft's native\n" "Windows Metafile Format (WMF) and for either (a) displaying them in, e.g., an X\n" @@ -4206,11 +5287,11 @@ msgid "" "the W3C's XML-based Scaleable Vector Graphic (SVG) format." msgstr "" -#: gnu/packages/image.scm:271 +#: gnu/packages/image.scm:387 msgid "Library and tools for image processing and analysis" msgstr "Bibliotek og værktøjer for billedbehandling og analyse" -#: gnu/packages/image.scm:273 +#: gnu/packages/image.scm:389 msgid "" "Leptonica is a C library and set of command-line tools for efficient\n" "image processing and image analysis operations. It supports rasterop, affine\n" @@ -4220,11 +5301,11 @@ msgid "" "arithmetic ops." msgstr "" -#: gnu/packages/image.scm:296 +#: gnu/packages/image.scm:411 msgid "Decoder of the JBIG2 image compression format" msgstr "" -#: gnu/packages/image.scm:298 +#: gnu/packages/image.scm:413 msgid "" "JBIG2 is designed for lossy or lossless encoding of 'bilevel' (1-bit\n" "monochrome) images at moderately high resolution, and in particular scanned\n" @@ -4237,11 +5318,11 @@ msgid "" "work." msgstr "" -#: gnu/packages/image.scm:333 +#: gnu/packages/image.scm:451 msgid "JPEG 2000 codec" msgstr "JPEG 2000-kodning" -#: gnu/packages/image.scm:335 +#: gnu/packages/image.scm:453 msgid "" "The OpenJPEG library is a JPEG 2000 codec written in C. It has\n" "been developed in order to promote the use of JPEG 2000, the new\n" @@ -4254,11 +5335,11 @@ msgid "" "error-resilience, a Java-viewer for j2k-images, ..." msgstr "" -#: gnu/packages/image.scm:414 +#: gnu/packages/image.scm:534 msgid "Tools and library for working with GIF images" msgstr "Værktøjer og bibliotek for arbejde med GIF-billeder" -#: gnu/packages/image.scm:416 +#: gnu/packages/image.scm:536 msgid "" "GIFLIB is a library for reading and writing GIF images. It is API and\n" "ABI compatible with libungif which was in wide use while the LZW compression\n" @@ -4266,19 +5347,19 @@ msgid "" "compose, and analyze GIF images." msgstr "" -#: gnu/packages/image.scm:437 +#: gnu/packages/image.scm:558 msgid "GIF decompression library" msgstr "GIF-dekomprimeringsbibliotek" -#: gnu/packages/image.scm:439 +#: gnu/packages/image.scm:560 msgid "libungif is the old GIF decompression library by the GIFLIB project." msgstr "libungif er det gamle GIF-dekomprimeringsbibliotek af GIFLIB-projektet." -#: gnu/packages/image.scm:468 +#: gnu/packages/image.scm:589 msgid "Loading, saving, rendering and manipulating image files" msgstr "Indlæs, gem, optegn og manipuler billedfiler" -#: gnu/packages/image.scm:470 +#: gnu/packages/image.scm:591 msgid "" "Imlib2 is a library that does image file loading and saving as well as\n" "rendering, manipulation, arbitrary polygon support, etc.\n" @@ -4291,32 +5372,32 @@ msgid "" "more modular, simple, and flexible." msgstr "" -#: gnu/packages/image.scm:498 +#: gnu/packages/image.scm:623 msgid "Wrapper library for imlib2" msgstr "Omslagsbibliotek for imlib2" -#: gnu/packages/image.scm:500 +#: gnu/packages/image.scm:625 msgid "" "Giblib is a simple library which wraps imlib2's context API, avoiding\n" "all the context_get/set calls, adds fontstyles to the truetype renderer and\n" "supplies a generic doubly-linked list and some string functions." msgstr "" -#: gnu/packages/image.scm:540 +#: gnu/packages/image.scm:666 msgid "Library for handling popular graphics image formats" msgstr "Bibliotek til håndtering af populære grafiske billedformater" -#: gnu/packages/image.scm:542 +#: gnu/packages/image.scm:668 msgid "" "FreeImage is a library for developers who would like to support popular\n" "graphics image formats like PNG, BMP, JPEG, TIFF and others." msgstr "" -#: gnu/packages/image.scm:592 +#: gnu/packages/image.scm:723 msgid "Computer vision library" msgstr "" -#: gnu/packages/image.scm:594 +#: gnu/packages/image.scm:725 msgid "" "VIGRA stands for Vision with Generic Algorithms. It is an image\n" "processing and analysis library that puts its main emphasis on customizable\n" @@ -4324,11 +5405,11 @@ msgid "" "multi-dimensional image processing." msgstr "" -#: gnu/packages/image.scm:625 +#: gnu/packages/image.scm:758 msgid "Lossless and lossy image compression" msgstr "Billedkomprimering med og uden kvalitetetstab" -#: gnu/packages/image.scm:627 +#: gnu/packages/image.scm:760 msgid "" "WebP is a new image format that provides lossless and lossy compression\n" "for images. WebP lossless images are 26% smaller in size compared to\n" @@ -4340,62 +5421,213 @@ msgid "" "channels." msgstr "" -#: gnu/packages/image.scm:655 +#: gnu/packages/image.scm:788 msgid "Library for handling MNG files" msgstr "Bibliotek for håndtering af MNG-filer" -#: gnu/packages/image.scm:657 +#: gnu/packages/image.scm:790 msgid "Libmng is the MNG (Multiple-image Network Graphics) reference library." msgstr "Libmng er MNG-referencebiblioteket (Multiple-image Network Graphics)." -#: gnu/packages/image.scm:705 +#: gnu/packages/image.scm:814 +msgid "Library and command-line utility to manage image metadata" +msgstr "Bibliotek og kommandolinjeredskab til at håndtere billedmetadata" + +#: gnu/packages/image.scm:816 +msgid "" +"Exiv2 is a C++ library and a command line utility to manage image\n" +"metadata. It provides fast and easy read and write access to the Exif, IPTC\n" +"and XMP metadata of images in various formats." +msgstr "" + +#: gnu/packages/image.scm:872 msgid "Library for manipulating many image formats" msgstr "Bibliotek for manipulering af mange billedformater" -#: gnu/packages/image.scm:706 +#: gnu/packages/image.scm:873 msgid "" "Developer's Image Library (DevIL) is a library to develop\n" "applications with support for many types of images. DevIL can load, save,\n" "convert, manipulate, filter and display a wide variety of image formats." msgstr "" -#: gnu/packages/image.scm:738 +#: gnu/packages/image.scm:892 msgid "JPEG-2000 library" msgstr "JPEG-2000-bibliotek" -#: gnu/packages/image.scm:739 +#: gnu/packages/image.scm:893 msgid "" "The JasPer Project is an initiative to provide a reference\n" "implementation of the codec specified in the JPEG-2000 Part-1 standard (i.e.,\n" "ISO/IEC 15444-1)." msgstr "" -#: gnu/packages/inkscape.scm:88 -msgid "Vector graphics editor" +#: gnu/packages/image.scm:923 +msgid "Scaling, colorspace conversion, and dithering library" +msgstr "" + +#: gnu/packages/image.scm:924 +msgid "" +"Zimg implements the commonly required image processing basics\n" +"of scaling, colorspace conversion, and depth conversion. A simple API enables\n" +"conversion between any supported formats to operate with minimal knowledge from\n" +"the programmer." +msgstr "" + +#: gnu/packages/image.scm:957 +msgid "Perceptual image comparison utility" +msgstr "" + +#: gnu/packages/image.scm:958 +msgid "" +"PerceptualDiff visually compares two images to determine\n" +"whether they look alike. It uses a computational model of the human visual\n" +"system to detect similarities. This allows it too see beyond irrelevant\n" +"differences in file encoding, image quality, and other small variations." +msgstr "" + +#: gnu/packages/image.scm:989 +msgid "Image and audio steganography" +msgstr "" + +#: gnu/packages/image.scm:991 +msgid "" +"Steghide is a steganography program that is able to hide data in various\n" +"kinds of image- and audio-files. The color- respectivly sample-frequencies\n" +"are not changed thus making the embedding resistant against first-order\n" +"statistical tests." +msgstr "" + +#: gnu/packages/image.scm:1017 +msgid "Image library for Extempore" +msgstr "Billedbibliotek for Extempore" + +#: gnu/packages/image.scm:1019 +msgid "" +"This package is a collection of assorted single-file libraries. Of\n" +"all included libraries only the image loading and decoding library is\n" +"installed as @code{stb_image}." +msgstr "" + +#: gnu/packages/image.scm:1047 +msgid "" +"Optimizer that recompresses PNG image files to a\n" +"smaller size" +msgstr "" + +#: gnu/packages/image.scm:1049 +msgid "" +"OptiPNG is a PNG optimizer that recompresses image\n" +"files to a smaller size, without losing any information. This program\n" +"also converts external formats (BMP, GIF, PNM and TIFF) to optimized\n" +"PNG, and performs PNG integrity checks and corrections." +msgstr "" + +#: gnu/packages/image.scm:1083 +msgid "SIMD-accelerated JPEG image handling library" +msgstr "" + +#: gnu/packages/image.scm:1084 +msgid "" +"libjpeg-turbo is a JPEG image codec that accelerates baseline\n" +"JPEG compression and decompression using SIMD instructions: MMX on x86, SSE2 on\n" +"x86-64, NEON on ARM, and AltiVec on PowerPC processors. Even on other systems,\n" +"its highly-optimized Huffman coding routines allow it to outperform libjpeg by\n" +"a significant amount.\n" +"libjpeg-turbo implements both the traditional libjpeg API and the less powerful\n" +"but more straightforward TurboJPEG API, and provides a full-featured Java\n" +"interface. It supports color space extensions that allow it to compress from\n" +"and decompress to 32-bit and big-endian pixel buffers (RGBX, XBGR, etc.)." +msgstr "" + +#: gnu/packages/image-viewers.scm:63 +msgid "Fast and light imlib2-based image viewer" +msgstr "Hurtig og simpel imlib2-baseret billedfremviser" + +#: gnu/packages/image-viewers.scm:65 +msgid "" +"feh is an X11 image viewer aimed mostly at console users.\n" +"Unlike most other viewers, it does not have a fancy GUI, but simply\n" +"displays images. It can also be used to set the desktop wallpaper.\n" +"It is controlled via commandline arguments and configurable key/mouse\n" +"actions." +msgstr "" + +#: gnu/packages/image-viewers.scm:111 +msgid "Lightweight GTK+ based image viewer" msgstr "" -#: gnu/packages/inkscape.scm:89 +#: gnu/packages/image-viewers.scm:113 +msgid "" +"Geeqie is a lightweight GTK+ based image viewer for Unix like operating\n" +"systems. It features: EXIF, IPTC and XMP metadata browsing and editing\n" +"interoperability; easy integration with other software; geeqie works on files\n" +"and directories, there is no need to import images; fast preview for many raw\n" +"image formats; tools for image comparison, sorting and managing photo\n" +"collection. Geeqie was initially based on GQview." +msgstr "" + +#: gnu/packages/image-viewers.scm:148 +msgid "Simple X Image Viewer" +msgstr "Simpel X-billedfremviser" + +#: gnu/packages/image-viewers.scm:150 +msgid "" +"sxiv is an alternative to feh and qiv. Its primary goal is to\n" +"provide the most basic features required for fast image viewing. It has\n" +"vi key bindings and works nicely with tiling window managers. Its code\n" +"base should be kept small and clean to make it easy for you to dig into\n" +"it and customize it for your needs." +msgstr "" + +#: gnu/packages/image-viewers.scm:191 +msgid "Simple, fast and elegant image viewer" +msgstr "Simpel, hurtig og elegant billedfremviser" + +#: gnu/packages/image-viewers.scm:192 +msgid "" +"Viewnior is an image viewer program. Created to be simple,\n" +"fast and elegant. Its minimalistic interface provides more screenspace for\n" +"your images. Among its features are:\n" +"@enumerate\n" +"@item Fullscreen & Slideshow\n" +"@item Rotate, flip, crop, save, delete images\n" +"@item Animation support\n" +"@item Browse only selected images\n" +"@item Navigation window\n" +"@item Set image as wallpaper (Gnome 2, Gnome 3, XFCE, LXDE, FluxBox, Nitrogen)\n" +"@item Simple interface\n" +"@item EXIF and IPTC metadata\n" +"@item Configurable mouse actions\n" +"@end enumerate\n" +msgstr "" + +#: gnu/packages/inkscape.scm:92 +msgid "Vector graphics editor" +msgstr "Redigeringsprogram for vektorgrafik" + +#: gnu/packages/inkscape.scm:93 msgid "" "Inkscape is a vector graphics editor. What sets Inkscape\n" "apart is its use of Scalable Vector Graphics (SVG), an XML-based W3C standard,\n" "as the native format." msgstr "" -#: gnu/packages/jemalloc.scm:47 +#: gnu/packages/jemalloc.scm:41 msgid "General-purpose scalable concurrent malloc implementation" msgstr "" -#: gnu/packages/jemalloc.scm:49 +#: gnu/packages/jemalloc.scm:43 msgid "" "This library providing a malloc(3) implementation that emphasizes\n" "fragmentation avoidance and scalable concurrency support." msgstr "" -#: gnu/packages/key-mon.scm:65 +#: gnu/packages/key-mon.scm:50 msgid "Show keyboard and mouse status" msgstr "" -#: gnu/packages/key-mon.scm:67 +#: gnu/packages/key-mon.scm:52 msgid "" "The key-mon utility displays the current keyboard and mouse status.\n" "This is useful for teaching and screencasts." @@ -4422,11 +5654,11 @@ msgstr "" msgid "Clone of the Motif toolkit for the X window system." msgstr "" -#: gnu/packages/libreoffice.scm:86 +#: gnu/packages/libreoffice.scm:87 msgid "General purpose formula parser and interpreter" msgstr "" -#: gnu/packages/libreoffice.scm:87 +#: gnu/packages/libreoffice.scm:88 msgid "" "Ixion is a library for calculating the results of formula\n" "expressions stored in multiple named targets, or \"cells\". The cells can\n" @@ -4434,11 +5666,11 @@ msgid "" "their dependencies automatically upon calculation." msgstr "" -#: gnu/packages/libreoffice.scm:112 +#: gnu/packages/libreoffice.scm:113 msgid "File import filter library for spreadsheet documents" msgstr "" -#: gnu/packages/libreoffice.scm:113 +#: gnu/packages/libreoffice.scm:114 msgid "" "Orcus is a library that provides a collection of standalone\n" "file processing filters. It is currently focused on providing filters for\n" @@ -4448,33 +5680,33 @@ msgid "" "CSV, CSS and XML." msgstr "" -#: gnu/packages/libreoffice.scm:147 +#: gnu/packages/libreoffice.scm:148 msgid "Document importer for office suites" msgstr "" -#: gnu/packages/libreoffice.scm:148 +#: gnu/packages/libreoffice.scm:149 msgid "" "Librevenge is a base library for writing document import\n" "filters. It has interfaces for text documents, vector graphics,\n" "spreadsheets and presentations." msgstr "" -#: gnu/packages/libreoffice.scm:173 +#: gnu/packages/libreoffice.scm:174 msgid "Library for importing WordPerfect documents" msgstr "Bibliotek til import af WordPerfect-dokumenter" -#: gnu/packages/libreoffice.scm:174 +#: gnu/packages/libreoffice.scm:175 msgid "" "Libwpd is a C++ library designed to help process\n" "WordPerfect documents. It is most commonly used to import such documents\n" "into other word processors." msgstr "" -#: gnu/packages/libreoffice.scm:206 +#: gnu/packages/libreoffice.scm:207 msgid "Library for import of reflowable e-book formats" msgstr "" -#: gnu/packages/libreoffice.scm:207 +#: gnu/packages/libreoffice.scm:208 msgid "" "Libe-book is a library and a set of tools for reading and\n" "converting various reflowable e-book formats. Currently supported are:\n" @@ -4484,42 +5716,42 @@ msgid "" "ZVR (simple compressed text format)." msgstr "" -#: gnu/packages/libreoffice.scm:236 +#: gnu/packages/libreoffice.scm:237 msgid "Library and tools for the WordPerfect Graphics format" msgstr "" -#: gnu/packages/libreoffice.scm:237 +#: gnu/packages/libreoffice.scm:238 msgid "" "The libwpg project provides a library and tools for\n" "working with graphics in the WPG (WordPerfect Graphics) format." msgstr "" -#: gnu/packages/libreoffice.scm:278 +#: gnu/packages/libreoffice.scm:279 msgid "CMIS client library" msgstr "" -#: gnu/packages/libreoffice.scm:279 +#: gnu/packages/libreoffice.scm:280 msgid "" "LibCMIS is a C++ client library for the CMIS interface. It\n" "allows C++ applications to connect to any ECM behaving as a CMIS server such\n" "as Alfresco or Nuxeo." msgstr "" -#: gnu/packages/libreoffice.scm:310 +#: gnu/packages/libreoffice.scm:311 msgid "Library for parsing the AbiWord format" msgstr "" -#: gnu/packages/libreoffice.scm:311 +#: gnu/packages/libreoffice.scm:312 msgid "" "Libabw is a library that parses the file format of\n" "AbiWord documents." msgstr "" -#: gnu/packages/libreoffice.scm:341 +#: gnu/packages/libreoffice.scm:342 msgid "Library for parsing the CorelDRAW format" msgstr "Bibliotek til fortolkning af CorelDRAW-formatet" -#: gnu/packages/libreoffice.scm:342 +#: gnu/packages/libreoffice.scm:343 msgid "" "Libcdr is a library that parses the file format of\n" "CorelDRAW documents of all versions." @@ -4527,72 +5759,85 @@ msgstr "" "Libcdr er et bibliotek, som fortolker filformatet\n" "for CorelDraw-dokumenter for alle versioner." -#: gnu/packages/libreoffice.scm:371 +#: gnu/packages/libreoffice.scm:372 msgid "Library for parsing the Apple Keynote format" msgstr "Bibliotek for fortolkning af Apple Keynote-formatet" -#: gnu/packages/libreoffice.scm:372 +#: gnu/packages/libreoffice.scm:373 msgid "" "Libetonyek is a library that parses the file format of\n" "Apple Keynote documents. It currently supports Keynote versions 2 to 5." msgstr "" -#: gnu/packages/libreoffice.scm:389 +#: gnu/packages/libreoffice.scm:396 +msgid "Library to access tags for identifying languages" +msgstr "Bibliotek til at tilgå mærker for identifikation af sprog" + +#: gnu/packages/libreoffice.scm:397 +msgid "" +"Liblangtag implements an interface to work with tags\n" +"for identifying languages as described in RFC 5646. It supports the\n" +"extensions described in RFC6067 and RFC6497, and Extension T for\n" +"language/locale identifiers as described in the Unicode CLDR\n" +"standard 21.0.2." +msgstr "" + +#: gnu/packages/libreoffice.scm:417 msgid "Text Categorization library" msgstr "Tekstkategoriseringsbibliotek" -#: gnu/packages/libreoffice.scm:390 +#: gnu/packages/libreoffice.scm:418 msgid "" "Libexttextcat is an N-Gram-Based Text Categorization\n" "library primarily intended for language guessing." msgstr "" -#: gnu/packages/libreoffice.scm:416 +#: gnu/packages/libreoffice.scm:444 msgid "Library for parsing the FreeHand format" -msgstr "" +msgstr "Bibliotek til at fortolke FreeHand-formatet" -#: gnu/packages/libreoffice.scm:417 +#: gnu/packages/libreoffice.scm:445 msgid "" "Libfreehand is a library that parses the file format of\n" "Aldus/Macromedia/Adobe FreeHand documents." msgstr "" -#: gnu/packages/libreoffice.scm:443 +#: gnu/packages/libreoffice.scm:471 msgid "Library for parsing the Microsoft Publisher format" msgstr "" -#: gnu/packages/libreoffice.scm:444 +#: gnu/packages/libreoffice.scm:472 msgid "" "Libmspub is a library that parses the file format of\n" "Microsoft Publisher documents of all versions." msgstr "" -#: gnu/packages/libreoffice.scm:472 +#: gnu/packages/libreoffice.scm:500 msgid "Library for parsing the PageMaker format" msgstr "Bibliotek til fortolkning af PageMaker-formatet" -#: gnu/packages/libreoffice.scm:473 +#: gnu/packages/libreoffice.scm:501 msgid "" "Libpagemaker is a library that parses the file format of\n" "Aldus/Adobe PageMaker documents. Currently it only understands documents\n" "created by PageMaker version 6.x and 7." msgstr "" -#: gnu/packages/libreoffice.scm:508 +#: gnu/packages/libreoffice.scm:536 msgid "Library for parsing the Microsoft Visio format" msgstr "" -#: gnu/packages/libreoffice.scm:509 +#: gnu/packages/libreoffice.scm:537 msgid "" "Libvisio is a library that parses the file format of\n" "Microsoft Visio documents of all versions." msgstr "" -#: gnu/packages/libreoffice.scm:537 +#: gnu/packages/libreoffice.scm:565 msgid "ODF (Open Document Format) library" msgstr "ODF-bibliotek (Open Document Format)" -#: gnu/packages/libreoffice.scm:538 +#: gnu/packages/libreoffice.scm:566 msgid "" "Libodfgen is a library for generating documents in the\n" "Open Document Format (ODF). It provides generator implementations for all\n" @@ -4600,60 +5845,60 @@ msgid "" "text documents, vector drawings, presentations and spreadsheets." msgstr "" -#: gnu/packages/libreoffice.scm:568 +#: gnu/packages/libreoffice.scm:596 msgid "Import library for some old Macintosh text documents" msgstr "" -#: gnu/packages/libreoffice.scm:569 +#: gnu/packages/libreoffice.scm:597 msgid "" "Libmwaw contains some import filters for old Macintosh\n" "text documents (MacWrite, ClarisWorks, ... ) and for some graphics and\n" "spreadsheet documents." msgstr "" -#: gnu/packages/libreoffice.scm:598 +#: gnu/packages/libreoffice.scm:626 msgid "Import library for Microsoft Works text documents" msgstr "" -#: gnu/packages/libreoffice.scm:599 +#: gnu/packages/libreoffice.scm:627 msgid "" "Libwps is a library for importing files in the Microsoft\n" "Works word processor file format." msgstr "" -#: gnu/packages/libreoffice.scm:617 +#: gnu/packages/libreoffice.scm:645 msgid "" "Hunspell is a spell checker and morphological analyzer\n" "library and program designed for languages with rich morphology and complex\n" "word compounding or character encoding." msgstr "" -#: gnu/packages/libreoffice.scm:638 +#: gnu/packages/libreoffice.scm:667 msgid "Hyphenation library" msgstr "" -#: gnu/packages/libreoffice.scm:639 +#: gnu/packages/libreoffice.scm:668 msgid "" "Hyphen is a hyphenation library using TeX hyphenation\n" "patterns, which are pre-processed by a perl script." msgstr "" -#: gnu/packages/libreoffice.scm:662 +#: gnu/packages/libreoffice.scm:691 msgid "Thesaurus" msgstr "" -#: gnu/packages/libreoffice.scm:663 +#: gnu/packages/libreoffice.scm:692 msgid "" "MyThes is a simple thesaurus that uses a structured text\n" "data file and an index file with binary search to look up words and phrases\n" "and to return information on pronunciations, meanings and synonyms." msgstr "" -#: gnu/packages/libreoffice.scm:829 +#: gnu/packages/libreoffice.scm:861 msgid "Office suite" msgstr "" -#: gnu/packages/libreoffice.scm:830 +#: gnu/packages/libreoffice.scm:862 msgid "" "LibreOffice is a comprehensive office suite. It contains\n" "a number of components: Writer, a word processor; Calc, a spreadsheet\n" @@ -4662,39 +5907,29 @@ msgid "" "Math for editing mathematics." msgstr "" -#: gnu/packages/linux.scm:155 +#: gnu/packages/linux.scm:170 msgid "GNU Linux-Libre kernel headers" msgstr "GNU Linux-LIbre - kerneteksthoveder" -#: gnu/packages/linux.scm:156 +#: gnu/packages/linux.scm:171 msgid "Headers of the Linux-Libre kernel." msgstr "Teksthoveder for Linux-Libre-kernen." -#: gnu/packages/linux.scm:187 -msgid "Tools for loading and managing Linux kernel modules" -msgstr "Værktøjer til at indlæse og håndtere Linuxkernemoduler" - -#: gnu/packages/linux.scm:189 -msgid "" -"Tools for loading and managing Linux kernel modules, such as `modprobe',\n" -"`insmod', `lsmod', and more." -msgstr "" - -#: gnu/packages/linux.scm:322 +#: gnu/packages/linux.scm:321 msgid "100% free redistribution of a cleaned Linux kernel" msgstr "" -#: gnu/packages/linux.scm:324 +#: gnu/packages/linux.scm:323 msgid "" "GNU Linux-Libre is a free (as in freedom) variant of the Linux kernel.\n" "It has been modified to remove all non-free binary blobs." msgstr "" -#: gnu/packages/linux.scm:384 +#: gnu/packages/linux.scm:397 msgid "Pluggable authentication modules for Linux" msgstr "" -#: gnu/packages/linux.scm:386 +#: gnu/packages/linux.scm:399 msgid "" "A *Free* project to implement OSF's RFC 86.0.\n" "Pluggable authentication modules are small shared object files that can\n" @@ -4702,33 +5937,33 @@ msgid "" "at login. Local and dynamic reconfiguration are its key features." msgstr "" -#: gnu/packages/linux.scm:413 -msgid "Small utilities that use the proc filesystem" +#: gnu/packages/linux.scm:441 +msgid "Small utilities that use the proc file system" msgstr "Små redskaber som bruger filsystemet proc" -#: gnu/packages/linux.scm:415 +#: gnu/packages/linux.scm:443 msgid "" "This PSmisc package is a set of some small useful utilities that\n" -"use the proc filesystem. We're not about changing the world, but\n" +"use the proc file system. We're not about changing the world, but\n" "providing the system administrator with some help in common tasks." msgstr "" -#: gnu/packages/linux.scm:480 +#: gnu/packages/linux.scm:520 msgid "Collection of utilities for the Linux kernel" msgstr "Samling af redskaber for Linuxkernen" -#: gnu/packages/linux.scm:481 +#: gnu/packages/linux.scm:521 msgid "" "Util-linux is a diverse collection of Linux kernel\n" -"utilities. It provides dmesg and includes tools for working with filesystems,\n" +"utilities. It provides dmesg and includes tools for working with file systems,\n" "block devices, UUIDs, TTYs, and many other tools." msgstr "" -#: gnu/packages/linux.scm:522 +#: gnu/packages/linux.scm:571 msgid "Utilities that give information about processes" msgstr "Redskaber som giver information om processer" -#: gnu/packages/linux.scm:524 +#: gnu/packages/linux.scm:573 msgid "" "Procps is the package that has a bunch of small useful utilities\n" "that give information about processes using the Linux /proc file system.\n" @@ -4736,107 +5971,107 @@ msgid "" "slabtop, and skill." msgstr "" -#: gnu/packages/linux.scm:549 +#: gnu/packages/linux.scm:599 msgid "Tools for working with USB devices, such as lsusb" msgstr "Værktøjer for arbejde med USB-enheder, såsom lsusb" -#: gnu/packages/linux.scm:551 +#: gnu/packages/linux.scm:601 msgid "Tools for working with USB devices, such as lsusb." msgstr "Værktøjer for arbejde med USB-enheder, såsom lsusb." -#: gnu/packages/linux.scm:625 +#: gnu/packages/linux.scm:679 msgid "Creating and checking ext2/ext3/ext4 file systems" msgstr "Oprettelse og kontrol af ext2/ext3/ext4-filsystemer" -#: gnu/packages/linux.scm:627 +#: gnu/packages/linux.scm:681 msgid "This package provides tools for manipulating ext2/ext3/ext4 file systems." msgstr "Denne pakke tilbyder værktøjer til manipulering af ext2/ext3/ext4-filsystemer." -#: gnu/packages/linux.scm:669 +#: gnu/packages/linux.scm:723 msgid "Statically-linked fsck.* commands from e2fsprogs" msgstr "" -#: gnu/packages/linux.scm:671 +#: gnu/packages/linux.scm:725 msgid "" "This package provides statically-linked command of fsck.ext[234] taken\n" "from the e2fsprogs package. It is meant to be used in initrds." msgstr "" -#: gnu/packages/linux.scm:690 +#: gnu/packages/linux.scm:745 msgid "Recover deleted files from ext2/3/4 partitions" msgstr "Gendan slettede filer fra ext2/3/4-partitioner" -#: gnu/packages/linux.scm:692 +#: gnu/packages/linux.scm:747 msgid "" "Extundelete is a set of tools that can recover deleted files from an\n" "ext3 or ext4 partition." msgstr "" -#: gnu/packages/linux.scm:724 +#: gnu/packages/linux.scm:779 msgid "Zero non-allocated regions in ext2/ext3/ext4 file systems" msgstr "" -#: gnu/packages/linux.scm:726 +#: gnu/packages/linux.scm:781 msgid "" "The zerofree command scans the free blocks in an ext2 file system and\n" "fills any non-zero blocks with zeroes. This is a useful way to make disk\n" "images more compressible." msgstr "" -#: gnu/packages/linux.scm:745 +#: gnu/packages/linux.scm:800 msgid "System call tracer for Linux" msgstr "" -#: gnu/packages/linux.scm:747 +#: gnu/packages/linux.scm:802 msgid "" "strace is a system call tracer, i.e. a debugging tool which prints out a\n" "trace of all the system calls made by a another process/program." msgstr "" -#: gnu/packages/linux.scm:768 +#: gnu/packages/linux.scm:823 msgid "Library call tracer for Linux" msgstr "" -#: gnu/packages/linux.scm:770 +#: gnu/packages/linux.scm:825 msgid "" "ltrace intercepts and records dynamic library calls which are called by\n" "an executed process and the signals received by that process. It can also\n" "intercept and print the system calls executed by the program." msgstr "" -#: gnu/packages/linux.scm:790 +#: gnu/packages/linux.scm:845 msgid "The Advanced Linux Sound Architecture libraries" msgstr "" -#: gnu/packages/linux.scm:792 gnu/packages/linux.scm:834 +#: gnu/packages/linux.scm:847 gnu/packages/linux.scm:890 msgid "" "The Advanced Linux Sound Architecture (ALSA) provides audio and\n" "MIDI functionality to the Linux-based operating system." msgstr "" -#: gnu/packages/linux.scm:832 +#: gnu/packages/linux.scm:888 msgid "Utilities for the Advanced Linux Sound Architecture (ALSA)" msgstr "" -#: gnu/packages/linux.scm:859 +#: gnu/packages/linux.scm:915 msgid "Program to configure the Linux IP packet filtering rules" msgstr "" -#: gnu/packages/linux.scm:861 +#: gnu/packages/linux.scm:917 msgid "" "iptables is the userspace command line program used to configure the\n" -"Linux 2.4.x and later IPv4 packet filtering ruleset. It is targeted towards\n" +"Linux 2.4.x and later IPv4 packet filtering ruleset (firewall). It is targeted at\n" "system administrators. Since Network Address Translation is also configured\n" "from the packet filter ruleset, iptables is used for this, too. The iptables\n" "package also includes ip6tables. ip6tables is used for configuring the IPv6\n" "packet filter." msgstr "" -#: gnu/packages/linux.scm:908 +#: gnu/packages/linux.scm:966 msgid "Utilities for controlling TCP/IP networking and traffic in Linux" msgstr "Redskaber for kontrol af TCP/IP-netværk og trafik i Linux" -#: gnu/packages/linux.scm:910 +#: gnu/packages/linux.scm:968 msgid "" "Iproute2 is a collection of utilities for controlling TCP/IP\n" "networking and traffic with the Linux kernel.\n" @@ -4857,11 +6092,11 @@ msgid "" "manpages." msgstr "" -#: gnu/packages/linux.scm:1022 +#: gnu/packages/linux.scm:1079 msgid "Tools for controlling the network subsystem in Linux" msgstr "" -#: gnu/packages/linux.scm:1024 +#: gnu/packages/linux.scm:1081 msgid "" "This package includes the important tools for controlling the network\n" "subsystem of the Linux kernel. This includes arp, hostname, ifconfig,\n" @@ -4870,21 +6105,21 @@ msgid "" "advanced aspects of IP configuration (iptunnel, ipmaddr)." msgstr "" -#: gnu/packages/linux.scm:1061 +#: gnu/packages/linux.scm:1118 msgid "Library for working with POSIX capabilities" msgstr "Bibliotek til arbejde med POSIX-funktioner" -#: gnu/packages/linux.scm:1063 +#: gnu/packages/linux.scm:1120 msgid "" "Libcap2 provides a programming interface to POSIX capabilities on\n" "Linux-based operating systems." msgstr "" -#: gnu/packages/linux.scm:1106 +#: gnu/packages/linux.scm:1163 msgid "Manipulate Ethernet bridges" msgstr "" -#: gnu/packages/linux.scm:1108 +#: gnu/packages/linux.scm:1165 msgid "" "Utilities for Linux's Ethernet bridging facilities. A bridge is a way\n" "to connect two Ethernet segments together in a protocol independent way.\n" @@ -4893,11 +6128,11 @@ msgid "" "transparently through a bridge." msgstr "" -#: gnu/packages/linux.scm:1130 +#: gnu/packages/linux.scm:1187 msgid "NetLink protocol library suite" msgstr "" -#: gnu/packages/linux.scm:1132 +#: gnu/packages/linux.scm:1189 msgid "" "The libnl suite is a collection of libraries providing APIs to netlink\n" "protocol based Linux kernel interfaces. Netlink is an IPC mechanism primarily\n" @@ -4906,21 +6141,21 @@ msgid "" "configuration and monitoring interfaces." msgstr "" -#: gnu/packages/linux.scm:1162 +#: gnu/packages/linux.scm:1219 msgid "Tool for configuring wireless devices" msgstr "Værktøj til konfiguration af trådløse enheder" -#: gnu/packages/linux.scm:1164 +#: gnu/packages/linux.scm:1221 msgid "" "iw is a new nl80211 based CLI configuration utility for wireless\n" -"devices. It replaces 'iwconfig', which is deprecated." +"devices. It replaces @code{iwconfig}, which is deprecated." msgstr "" -#: gnu/packages/linux.scm:1190 +#: gnu/packages/linux.scm:1267 msgid "Analyze power consumption on Intel-based laptops" msgstr "Analyser strømforbrug på Intelbaserede bærbare" -#: gnu/packages/linux.scm:1192 +#: gnu/packages/linux.scm:1269 msgid "" "PowerTOP is a Linux tool to diagnose issues with power consumption and\n" "power management. In addition to being a diagnostic tool, PowerTOP also has\n" @@ -4929,31 +6164,31 @@ msgid "" "settings." msgstr "" -#: gnu/packages/linux.scm:1214 +#: gnu/packages/linux.scm:1291 msgid "Audio mixer for X and the console" msgstr "" -#: gnu/packages/linux.scm:1216 +#: gnu/packages/linux.scm:1293 msgid "" "Aumix adjusts an audio mixer from X, the console, a terminal,\n" "the command line or a script." msgstr "" -#: gnu/packages/linux.scm:1240 +#: gnu/packages/linux.scm:1317 msgid "Displays the IO activity of running processes" msgstr "Viser IO-aktivet for kørende processer" -#: gnu/packages/linux.scm:1242 +#: gnu/packages/linux.scm:1319 msgid "" "Iotop is a Python program with a top like user interface to show the\n" "processes currently causing I/O." msgstr "" -#: gnu/packages/linux.scm:1297 +#: gnu/packages/linux.scm:1371 msgid "Support file systems implemented in user space" msgstr "" -#: gnu/packages/linux.scm:1299 +#: gnu/packages/linux.scm:1373 msgid "" "As a consequence of its monolithic design, file system code for Linux\n" "normally goes into the kernel itself---which is not only a robustness issue,\n" @@ -4963,11 +6198,11 @@ msgid "" "user-space processes." msgstr "" -#: gnu/packages/linux.scm:1324 +#: gnu/packages/linux.scm:1398 msgid "User-space union file system" msgstr "" -#: gnu/packages/linux.scm:1326 +#: gnu/packages/linux.scm:1400 msgid "" "UnionFS-FUSE is a flexible union file system implementation in user\n" "space, using the FUSE library. Mounting a union file system allows you to\n" @@ -4975,15 +6210,15 @@ msgid "" "UnionFS-FUSE additionally supports copy-on-write." msgstr "" -#: gnu/packages/linux.scm:1351 +#: gnu/packages/linux.scm:1425 msgid "User-space union file system (statically linked)" msgstr "" -#: gnu/packages/linux.scm:1396 +#: gnu/packages/linux.scm:1468 msgid "Mount remote file systems over SSH" msgstr "" -#: gnu/packages/linux.scm:1398 +#: gnu/packages/linux.scm:1470 msgid "" "This is a file system client based on the SSH File Transfer Protocol.\n" "Since most SSH servers already support this protocol it is very easy to set\n" @@ -4991,11 +6226,11 @@ msgid "" "file system is as easy as logging into the server with an SSH client." msgstr "" -#: gnu/packages/linux.scm:1427 +#: gnu/packages/linux.scm:1499 msgid "Tools for non-uniform memory access (NUMA) machines" msgstr "" -#: gnu/packages/linux.scm:1429 +#: gnu/packages/linux.scm:1501 msgid "" "NUMA stands for Non-Uniform Memory Access, in other words a system whose\n" "memory is not all in one place. The numactl program allows you to run your\n" @@ -5008,32 +6243,32 @@ msgid "" "system." msgstr "" -#: gnu/packages/linux.scm:1492 +#: gnu/packages/linux.scm:1563 msgid "Linux keyboard utilities and keyboard maps" msgstr "" -#: gnu/packages/linux.scm:1494 +#: gnu/packages/linux.scm:1565 msgid "" "This package contains keytable files and keyboard utilities compatible\n" "for systems using the Linux kernel. This includes commands such as\n" "'loadkeys', 'setfont', 'kbdinfo', and 'chvt'." msgstr "" -#: gnu/packages/linux.scm:1513 +#: gnu/packages/linux.scm:1584 msgid "Monitor file accesses" msgstr "" -#: gnu/packages/linux.scm:1515 +#: gnu/packages/linux.scm:1586 msgid "" "The inotify-tools packages provides a C library and command-line tools\n" "to use Linux' inotify mechanism, which allows file accesses to be monitored." msgstr "" -#: gnu/packages/linux.scm:1553 +#: gnu/packages/linux.scm:1624 msgid "Kernel module tools" msgstr "" -#: gnu/packages/linux.scm:1554 +#: gnu/packages/linux.scm:1625 msgid "" "Kmod is a set of tools to handle common tasks with Linux\n" "kernel modules like insert, remove, list, check properties, resolve\n" @@ -5044,33 +6279,37 @@ msgid "" "from the module-init-tools project." msgstr "" -#: gnu/packages/linux.scm:1586 +#: gnu/packages/linux.scm:1660 msgid "Userspace device management" msgstr "" -#: gnu/packages/linux.scm:1587 +#: gnu/packages/linux.scm:1661 msgid "" "Udev is a daemon which dynamically creates and removes\n" "device nodes from /dev/, handles hotplug events and loads drivers at boot\n" "time." msgstr "" -#: gnu/packages/linux.scm:1659 +#: gnu/packages/linux.scm:1733 msgid "Logical volume management for Linux" msgstr "" -#: gnu/packages/linux.scm:1661 +#: gnu/packages/linux.scm:1735 msgid "" "LVM2 is the logical volume management tool set for Linux-based systems.\n" "This package includes the user-space libraries and tools, including the device\n" "mapper. Kernel components are part of Linux-libre." msgstr "" -#: gnu/packages/linux.scm:1697 +#: gnu/packages/linux.scm:1757 +msgid "Logical volume management for Linux (statically linked)" +msgstr "" + +#: gnu/packages/linux.scm:1787 msgid "Tools for manipulating Linux Wireless Extensions" msgstr "" -#: gnu/packages/linux.scm:1698 +#: gnu/packages/linux.scm:1788 msgid "" "Wireless Tools are used to manipulate the now-deprecated\n" "Linux Wireless Extensions; consider using 'iw' instead. The Wireless\n" @@ -5079,44 +6318,44 @@ msgid "" "interface." msgstr "" -#: gnu/packages/linux.scm:1770 +#: gnu/packages/linux.scm:1860 msgid "Central regulatory domain agent (CRDA) for WiFi" msgstr "" -#: gnu/packages/linux.scm:1772 +#: gnu/packages/linux.scm:1862 msgid "" "The Central Regulatory Domain Agent (CRDA) acts as the udev helper for\n" "communication between the kernel Linux and user space for regulatory\n" "compliance." msgstr "" -#: gnu/packages/linux.scm:1818 +#: gnu/packages/linux.scm:1908 msgid "Wireless regulatory database" msgstr "" -#: gnu/packages/linux.scm:1820 +#: gnu/packages/linux.scm:1910 msgid "" "This package contains the wireless regulatory database Central\n" "Regulatory Database Agent (CRDA) daemon. The database contains information on\n" "country-specific regulations for the wireless spectrum." msgstr "" -#: gnu/packages/linux.scm:1891 +#: gnu/packages/linux.scm:1982 msgid "Utilities to read temperature/voltage/fan sensors" msgstr "" -#: gnu/packages/linux.scm:1893 +#: gnu/packages/linux.scm:1984 msgid "" "Lm-sensors is a hardware health monitoring package for Linux. It allows\n" "you to access information from temperature, voltage, and fan speed sensors.\n" "It works with most newer systems." msgstr "" -#: gnu/packages/linux.scm:1920 +#: gnu/packages/linux.scm:2011 msgid "I2C tools for Linux" msgstr "I2C-værktøjer for Linux" -#: gnu/packages/linux.scm:1922 +#: gnu/packages/linux.scm:2013 msgid "" "The i2c-tools package contains a heterogeneous set of I2C tools for\n" "Linux: a bus probing tool, a chip dumper, register-level SMBus access helpers,\n" @@ -5124,22 +6363,22 @@ msgid "" "SMBus access." msgstr "" -#: gnu/packages/linux.scm:1958 +#: gnu/packages/linux.scm:2049 msgid "Hardware health information viewer" msgstr "" -#: gnu/packages/linux.scm:1960 +#: gnu/packages/linux.scm:2051 msgid "" "Xsensors reads data from the libsensors library regarding hardware\n" "health such as temperature, voltage and fan speed and displays the information\n" "in a digital read-out." msgstr "" -#: gnu/packages/linux.scm:2008 +#: gnu/packages/linux.scm:2099 msgid "Linux profiling with performance counters" msgstr "" -#: gnu/packages/linux.scm:2010 +#: gnu/packages/linux.scm:2101 msgid "" "perf is a tool suite for profiling using hardware performance counters,\n" "with support in the Linux kernel. perf can instrument CPU performance\n" @@ -5148,11 +6387,11 @@ msgid "" "particular the 'perf' command." msgstr "" -#: gnu/packages/linux.scm:2033 +#: gnu/packages/linux.scm:2124 msgid "Simple tool for creating Linux namespace containers" msgstr "Simpelt værktøj til oprettelse af naverumscontainere under Linux" -#: gnu/packages/linux.scm:2034 +#: gnu/packages/linux.scm:2125 msgid "" "pflask is a simple tool for creating Linux namespace\n" "containers. It can be used for running a command or even booting an OS inside\n" @@ -5161,32 +6400,44 @@ msgid "" "thanks to the use of namespaces." msgstr "" -#: gnu/packages/linux.scm:2061 +#: gnu/packages/linux.scm:2152 msgid "Tune hard disk parameters for high performance" msgstr "Finjuster harddiskparametre for høj ydelse" -#: gnu/packages/linux.scm:2063 +#: gnu/packages/linux.scm:2154 msgid "" "Get/set device parameters for Linux SATA/IDE drives. It's primary use\n" "is for enabling irq-unmasking and IDE multiple-mode." msgstr "" -#: gnu/packages/linux.scm:2086 +#: gnu/packages/linux.scm:2177 msgid "Tool for enabling and disabling wireless devices" msgstr "Værktøj til aktivering og deaktivering af trådløse enheder" -#: gnu/packages/linux.scm:2088 +#: gnu/packages/linux.scm:2179 msgid "" "rfkill is a simple tool for accessing the rfkill device interface,\n" "which is used to enable and disable wireless networking devices, typically\n" "WLAN, Bluetooth and mobile broadband." msgstr "" -#: gnu/packages/linux.scm:2107 +#: gnu/packages/linux.scm:2198 +msgid "Display information on ACPI devices" +msgstr "" + +#: gnu/packages/linux.scm:2199 +msgid "" +"@code{acpi} attempts to replicate the functionality of the\n" +"\"old\" @code{apm} command on ACPI systems, including battery and thermal\n" +"information. It does not support ACPI suspending, only displays information\n" +"about ACPI devices." +msgstr "" + +#: gnu/packages/linux.scm:2218 msgid "Daemon for delivering ACPI events to user-space programs" msgstr "" -#: gnu/packages/linux.scm:2109 +#: gnu/packages/linux.scm:2220 msgid "" "acpid is designed to notify user-space programs of Advanced\n" "Configuration and Power Interface (ACPI) events. acpid should be started\n" @@ -5195,37 +6446,37 @@ msgid "" "specified in /etc/acpi/events and execute the rules that match the event." msgstr "" -#: gnu/packages/linux.scm:2131 +#: gnu/packages/linux.scm:2242 msgid "System utilities based on Linux sysfs" msgstr "" -#: gnu/packages/linux.scm:2133 +#: gnu/packages/linux.scm:2244 msgid "" -"These are a set of utilities built upon sysfs, a virtual filesystem in\n" +"These are a set of utilities built upon sysfs, a virtual file system in\n" "Linux kernel versions 2.5+ that exposes a system's device tree. The package\n" "also contains the libsysfs library." msgstr "" -#: gnu/packages/linux.scm:2162 +#: gnu/packages/linux.scm:2273 msgid "System utilities based on Linux sysfs (version 1.x)" msgstr "" -#: gnu/packages/linux.scm:2185 +#: gnu/packages/linux.scm:2296 msgid "Utilities to get and set CPU frequency on Linux" msgstr "" -#: gnu/packages/linux.scm:2187 +#: gnu/packages/linux.scm:2298 msgid "" "The cpufrequtils suite contains utilities to retrieve CPU frequency\n" "information, and set the CPU frequency if supported, using the cpufreq\n" "capabilities of the Linux kernel." msgstr "" -#: gnu/packages/linux.scm:2206 +#: gnu/packages/linux.scm:2317 msgid "Interface library for the Linux IEEE1394 drivers" msgstr "" -#: gnu/packages/linux.scm:2208 +#: gnu/packages/linux.scm:2319 msgid "" "Libraw1394 is the only supported interface to the kernel side raw1394 of\n" "the Linux IEEE-1394 subsystem, which provides direct access to the connected\n" @@ -5234,90 +6485,292 @@ msgid "" "protocol in question." msgstr "" -#: gnu/packages/linux.scm:2232 +#: gnu/packages/linux.scm:2343 msgid "AV/C protocol library for IEEE 1394" msgstr "" -#: gnu/packages/linux.scm:2234 +#: gnu/packages/linux.scm:2345 msgid "" "Libavc1394 is a programming interface to the AV/C specification from\n" "the 1394 Trade Association. AV/C stands for Audio/Video Control." msgstr "" -#: gnu/packages/linux.scm:2256 +#: gnu/packages/linux.scm:2367 msgid "Isochronous streaming media library for IEEE 1394" msgstr "" -#: gnu/packages/linux.scm:2258 +#: gnu/packages/linux.scm:2369 msgid "" "The libiec61883 library provides a higher level API for streaming DV,\n" "MPEG-2 and audio over Linux IEEE 1394." msgstr "" -#: gnu/packages/linux.scm:2298 +#: gnu/packages/linux.scm:2416 msgid "Tool for managing Linux Software RAID arrays" msgstr "" -#: gnu/packages/linux.scm:2300 +#: gnu/packages/linux.scm:2418 msgid "" "mdadm is a tool for managing Linux Software RAID arrays. It can create,\n" "assemble, report on, and monitor arrays. It can also move spares between raid\n" "arrays when needed." msgstr "" -#: gnu/packages/linux.scm:2327 +#: gnu/packages/linux.scm:2450 +msgid "Statically-linked 'mdadm' command for use in an initrd" +msgstr "" + +#: gnu/packages/linux.scm:2474 msgid "Linux-native asynchronous I/O access library" msgstr "" -#: gnu/packages/linux.scm:2329 +#: gnu/packages/linux.scm:2476 msgid "" "This library enables userspace to use Linux kernel asynchronous I/O\n" "system calls, important for the performance of databases and other advanced\n" "applications." msgstr "" -#: gnu/packages/linux.scm:2365 +#: gnu/packages/linux.scm:2498 +msgid "Bluetooth subband audio codec" +msgstr "Bluetooth subband-lydkodning" + +#: gnu/packages/linux.scm:2500 +msgid "" +"The SBC is a digital audio encoder and decoder used to transfer data to\n" +"Bluetooth audio output devices like headphones or loudspeakers." +msgstr "" + +#: gnu/packages/linux.scm:2558 msgid "Linux Bluetooth protocol stack" msgstr "" -#: gnu/packages/linux.scm:2367 +#: gnu/packages/linux.scm:2560 msgid "" "BlueZ provides support for the core Bluetooth layers and protocols. It\n" "is flexible, efficient and uses a modular implementation." msgstr "" -#: gnu/packages/linux.scm:2423 +#: gnu/packages/linux.scm:2582 msgid "Mount exFAT file systems" msgstr "" -#: gnu/packages/linux.scm:2425 +#: gnu/packages/linux.scm:2584 msgid "" "This package provides a FUSE-based file system that provides read and\n" "write access to exFAT devices." msgstr "" -#: gnu/packages/linux.scm:2465 +#: gnu/packages/linux.scm:2624 msgid "Mouse support for the Linux console" msgstr "Museunderstøttelse for Linuxkonsollen" -#: gnu/packages/linux.scm:2467 +#: gnu/packages/linux.scm:2626 msgid "" "The GPM (general-purpose mouse) daemon is a mouse server for\n" "applications running on the Linux console. It allows users to select items\n" "and copy/paste text in the console and in xterm." msgstr "" -#: gnu/packages/linux.scm:2501 +#: gnu/packages/linux.scm:2676 msgid "Create and manage btrfs copy-on-write file systems" msgstr "" -#: gnu/packages/linux.scm:2502 +#: gnu/packages/linux.scm:2677 msgid "" -"Btrfs is a copy-on-write (CoW) filesystem for Linux aimed at\n" +"Btrfs is a copy-on-write (CoW) file system for Linux aimed at\n" "implementing advanced features while focusing on fault tolerance, repair and\n" "easy administration." msgstr "" +#: gnu/packages/linux.scm:2706 +msgid "Free-fall protection for spinning laptop hard drives" +msgstr "" + +#: gnu/packages/linux.scm:2708 +msgid "" +"Prevents shock damage to the internal spinning hard drive(s) of some\n" +"HP and Dell laptops. When sudden movement is detected, all input/output\n" +"operations on the drive are suspended and its heads are parked on the ramp,\n" +"where they are less likely to cause damage to the spinning disc. Requires a\n" +"drive that supports the ATA/ATAPI-7 IDLE IMMEDIATE command with unload\n" +"feature, and a laptop with an accelerometer. It has no effect on SSDs." +msgstr "" + +#: gnu/packages/linux.scm:2762 +msgid "Simple fan control program" +msgstr "Simpelt kontrolprogram til blæseren" + +#: gnu/packages/linux.scm:2764 +msgid "" +"Thinkfan is a simple fan control program. It reads temperatures,\n" +"checks them against configured limits and switches to appropriate (also\n" +"pre-configured) fan level. It requires a working @code{thinkpad_acpi} or any\n" +"other @code{hwmon} driver that enables temperature reading and fan control\n" +"from userspace." +msgstr "" + +#: gnu/packages/linux.scm:2799 +msgid "Read-write access to NTFS file systems" +msgstr "Læs/skriv adgang til NTFS-filsystemer" + +#: gnu/packages/linux.scm:2801 +msgid "" +"NTFS-3G provides read-write access to NTFS file systems, which are\n" +"commonly found on Microsoft Windows. It is implemented as a FUSE file system.\n" +"The package provides additional NTFS tools." +msgstr "" + +#: gnu/packages/linux.scm:2819 +msgid "Random number generator daemon" +msgstr "" + +#: gnu/packages/linux.scm:2821 +msgid "" +"Monitor a hardware random number generator, and supply entropy\n" +"from that to the system kernel's @file{/dev/random} machinery." +msgstr "" + +#: gnu/packages/linux.scm:2859 +msgid "CPU frequency and voltage scaling tools for Linux" +msgstr "" + +#: gnu/packages/linux.scm:2861 +msgid "" +"cpupower is a set of user-space tools that use the cpufreq feature of the\n" +"Linux kernel to retrieve and control processor features related to power saving,\n" +"such as frequency and voltage scaling." +msgstr "" + +#: gnu/packages/linux.scm:2880 +msgid "Entropy source for the Linux random number generator" +msgstr "" + +#: gnu/packages/linux.scm:2882 +msgid "" +"haveged generates an unpredictable stream of random numbers for use by\n" +"Linux's @file{/dev/random} and @file{/dev/urandom} devices. The kernel's\n" +"standard mechanisms for filling the entropy pool may not be sufficient for\n" +"systems with high needs or limited user interaction, such as headless servers.\n" +"@command{haveged} runs as a privileged daemon, harvesting randomness from the\n" +"indirect effects of hardware events on hidden processor state using the HArdware\n" +"Volatile Entropy Gathering and Expansion (HAVEGE) algorithm. It tunes itself to\n" +"its environment and provides the same built-in test suite for the output stream\n" +"as used on certified hardware security devices." +msgstr "" + +#: gnu/packages/linux.scm:2921 +msgid "eCryptfs cryptographic file system utilities" +msgstr "" + +#: gnu/packages/linux.scm:2923 +msgid "" +"eCryptfs is a POSIX-compliant stacked cryptographic file system for Linux.\n" +"Each file's cryptographic meta-data is stored inside the file itself, along\n" +"with the encrypted contents. This allows individual encrypted files to be\n" +"copied between hosts and still be decrypted with the proper key. eCryptfs is a\n" +"native Linux file system, and has been part of the Linux kernel since version\n" +"2.6.19. This package contains the userland utilities to manage it." +msgstr "" + +#: gnu/packages/linux.scm:2954 +msgid "NFSv4 support library for name/ID mapping" +msgstr "" + +#: gnu/packages/linux.scm:2955 +msgid "" +"Libnfsidmap is a library holding mulitiple methods of\n" +"mapping names to ids and visa versa, mainly for NFSv4. It provides an\n" +"extensible array of mapping functions, currently consisting of two choices:\n" +"the default @code{nsswitch} and the experimental @code{umich_ldap}." +msgstr "" + +#: gnu/packages/linux.scm:2988 +msgid "Tools for loading and managing Linux kernel modules" +msgstr "Værktøjer til at indlæse og håndtere Linuxkernemoduler" + +#: gnu/packages/linux.scm:2990 +msgid "" +"Tools for loading and managing Linux kernel modules, such as `modprobe',\n" +"`insmod', `lsmod', and more." +msgstr "" + +#: gnu/packages/linux.scm:3024 +msgid "Machine check monitor for x86 Linux systems" +msgstr "" + +#: gnu/packages/linux.scm:3026 +msgid "" +"The mcelog daemon is required by the Linux kernel to log memory, I/O, CPU,\n" +"and other hardware errors on x86 systems. It can also perform user-defined\n" +"tasks, such as bringing bad pages off-line, when configurable error thresholds\n" +"are exceeded." +msgstr "" + +#: gnu/packages/linux.scm:3055 +msgid "MTD Flash Storage Utilities" +msgstr "Lagerredskaber for MTD-flash" + +#: gnu/packages/linux.scm:3056 +msgid "" +"This package provides utilities for testing, partitioning, etc\n" +"of flash storage." +msgstr "" +"Denne pakke tilbyder redskaber til test, partitionering, etc.\n" +"for flashlager." + +#: gnu/packages/linux.scm:3079 +msgid "Interface to Linux's seccomp syscall filtering mechanism" +msgstr "" + +#: gnu/packages/linux.scm:3080 +msgid "" +"The libseccomp library provides an easy to use, platform\n" +"independent, interface to the Linux Kernel's syscall filtering mechanism. The\n" +"libseccomp API is designed to abstract away the underlying BPF based syscall\n" +"filter language and present a more conventional function-call based filtering\n" +"interface that should be familiar to, and easily adopted by, application\n" +"developers." +msgstr "" + +#: gnu/packages/linux.scm:3121 +msgid "Usage monitor for AMD Radeon graphics" +msgstr "" + +#: gnu/packages/linux.scm:3122 +msgid "" +"RadeonTop monitors resource consumption on supported AMD\n" +"Radeon Graphics Processing Units (GPUs), either in real time as bar graphs on\n" +"a terminal or saved to a file for further processing. It measures both the\n" +"activity of the GPU as a whole, which is also accurate during OpenCL\n" +"computations, as well as separate component statistics that are only meaningful\n" +"under OpenGL graphics workloads." +msgstr "" + +#: gnu/packages/linux.scm:3157 +msgid "Tool and library to manipulate EFI variables" +msgstr "Værktøj og bibliotek til at manipulere EFI-variabler" + +#: gnu/packages/linux.scm:3158 +msgid "" +"This package provides a library and a command line\n" +"interface to the variable facility of UEFI boot firmware." +msgstr "" +"Denne pakke tilbyder et bibliotek og en kommandolinje-\n" +"grænseflade til variabelfaciliteten for UEFI-opstartsfirmware." + +#: gnu/packages/linux.scm:3199 +msgid "Modify the Extensible Firmware Interface (EFI) boot manager" +msgstr "" + +#: gnu/packages/linux.scm:3201 +msgid "" +"@code{efibootmgr} is a user-space application to modify the Intel\n" +"Extensible Firmware Interface (EFI) Boot Manager. This application can\n" +"create and destroy boot entries, change the boot order, change the next\n" +"running boot option, and more." +msgstr "" + #: gnu/packages/lout.scm:109 msgid "Document layout system" msgstr "" @@ -5341,11 +6794,11 @@ msgid "" "beginning." msgstr "" -#: gnu/packages/messaging.scm:77 +#: gnu/packages/messaging.scm:97 msgid "Off-the-Record (OTR) Messaging Library and Toolkit" msgstr "" -#: gnu/packages/messaging.scm:79 +#: gnu/packages/messaging.scm:99 msgid "" "OTR allows you to have private conversations over instant messaging by\n" "providing: (1) Encryption: No one else can read your instant messages. (2)\n" @@ -5358,11 +6811,11 @@ msgid "" "keys, no previous conversation is compromised." msgstr "" -#: gnu/packages/messaging.scm:134 +#: gnu/packages/messaging.scm:165 msgid "IRC to instant messaging gateway" msgstr "" -#: gnu/packages/messaging.scm:135 +#: gnu/packages/messaging.scm:166 msgid "" "BitlBee brings IM (instant messaging) to IRC clients, for\n" "people who have an IRC client running all the time and don't want to run an\n" @@ -5372,45 +6825,45 @@ msgid "" "identi.ca and status.net)." msgstr "" -#: gnu/packages/messaging.scm:168 +#: gnu/packages/messaging.scm:202 msgid "Graphical IRC Client" msgstr "" -#: gnu/packages/messaging.scm:170 +#: gnu/packages/messaging.scm:204 msgid "" -"HexChat lets you connect to multiple IRC networks at once. The main window\n" -"shows the list of currently connected networks and their channels, the current\n" -"conversation and the list of users. It uses colors to differentiate between\n" -"users and to highlight messages. It checks spelling using available\n" +"HexChat lets you connect to multiple IRC networks at once. The main\n" +"window shows the list of currently connected networks and their channels, the\n" +"current conversation and the list of users. It uses colors to differentiate\n" +"between users and to highlight messages. It checks spelling using available\n" "dictionaries. HexChat can be extended with multiple addons." msgstr "" -#: gnu/packages/messaging.scm:236 +#: gnu/packages/messaging.scm:271 msgid "Lightweight Internet Relay Chat server for small networks" msgstr "" -#: gnu/packages/messaging.scm:238 +#: gnu/packages/messaging.scm:273 msgid "" "ngIRCd is a lightweight Internet Relay Chat server for small or private\n" "networks. It is easy to configure, can cope with dynamic IP addresses, and\n" "supports IPv6, SSL-protected connections as well as PAM for authentication." msgstr "" -#: gnu/packages/messaging.scm:309 +#: gnu/packages/messaging.scm:344 msgid "Graphical multi-protocol instant messaging client" msgstr "" -#: gnu/packages/messaging.scm:311 +#: gnu/packages/messaging.scm:346 msgid "" "Pidgin is a modular instant messaging client that supports many popular\n" "chat protocols." msgstr "" -#: gnu/packages/messaging.scm:349 +#: gnu/packages/messaging.scm:384 msgid "Off-the-Record Messaging plugin for Pidgin" msgstr "" -#: gnu/packages/messaging.scm:351 +#: gnu/packages/messaging.scm:386 msgid "" "Pidgin-OTR is a plugin that adds support for OTR to the Pidgin instant\n" "messaging client. OTR (Off-the-Record) Messaging allows you to have private\n" @@ -5425,11 +6878,11 @@ msgid "" "compromised." msgstr "" -#: gnu/packages/messaging.scm:391 +#: gnu/packages/messaging.scm:426 msgid "IRC network bouncer" msgstr "" -#: gnu/packages/messaging.scm:392 +#: gnu/packages/messaging.scm:427 msgid "" "ZNC is an IRC network bouncer or BNC. It can detach the\n" "client from the actual IRC server, and also from selected channels. Multiple\n" @@ -5437,22 +6890,22 @@ msgid "" "simultaneously and therefore appear under the same nickname on IRC." msgstr "" -#: gnu/packages/messaging.scm:414 +#: gnu/packages/messaging.scm:449 msgid "Non-blocking Jabber/XMPP module" msgstr "" -#: gnu/packages/messaging.scm:416 +#: gnu/packages/messaging.scm:451 msgid "" "The goal of this python library is to provide a way for Python\n" "applications to use Jabber/XMPP networks in a non-blocking way. This library\n" "was initially a fork of xmpppy, but is using non-blocking sockets." msgstr "" -#: gnu/packages/messaging.scm:473 +#: gnu/packages/messaging.scm:501 msgid "Jabber (XMPP) client" msgstr "" -#: gnu/packages/messaging.scm:474 +#: gnu/packages/messaging.scm:502 msgid "" "Gajim is a feature-rich and easy to use Jabber/XMPP client.\n" "Among its features are: a tabbed chat window and single window modes; support\n" @@ -5461,21 +6914,133 @@ msgid "" "end-to-end encryption support; XML console." msgstr "" -#: gnu/packages/mpd.scm:64 +#: gnu/packages/messaging.scm:576 +msgid "Jabber (XMPP) server" +msgstr "" + +#: gnu/packages/messaging.scm:577 +msgid "" +"Prosody is a modern XMPP communication server. It aims to\n" +"be easy to set up and configure, and efficient with system resources.\n" +"Additionally, for developers it aims to be easy to extend and give a flexible\n" +"system on which to rapidly develop added functionality, or prototype new\n" +"protocols." +msgstr "" + +#: gnu/packages/messaging.scm:619 +msgid "Library for the Tox encrypted messenger protocol" +msgstr "" + +#: gnu/packages/messaging.scm:621 +msgid "C library implementation of the Tox encrypted messenger protocol." +msgstr "C-biblioteksimplementering for den Tox-krypterede messengerprotokol." + +#: gnu/packages/messaging.scm:662 +msgid "Lightweight Tox client" +msgstr "Simpel Tox-klient" + +#: gnu/packages/messaging.scm:663 +msgid "" +"A lightweight Tox client. Tox is a distributed and secure\n" +"instant messenger with audio and video chat capabilities." +msgstr "" + +#: gnu/packages/messaging.scm:714 +msgid "Tox chat client using Qt" +msgstr "" + +#: gnu/packages/messaging.scm:715 +msgid "" +"qTox is a Tox client that follows the Tox design\n" +"guidelines. It provides an easy to use application that allows you to\n" +"connect with friends and family without anyone else listening in." +msgstr "" + +#: gnu/packages/messaging.scm:812 +msgid "" +"Distributed and trustless peer-to-peer communications protocol\n" +"for sending encrypted messages to one person or many subscribers." +msgstr "" + +#: gnu/packages/messaging.scm:814 +msgid "Distributed peer-to-peer communication" +msgstr "" + +#: gnu/packages/messaging.scm:833 +msgid "Multi-user chat program" +msgstr "" + +#: gnu/packages/messaging.scm:834 +msgid "" +"Ytalk is a replacement for the BSD talk program. Its main\n" +"advantage is the ability to communicate with any arbitrary number of users at\n" +"once. It supports both talk protocols (\"talk\" and \"ntalk\") and can communicate\n" +"with several different talk daemons at the same time." +msgstr "" + +#: gnu/packages/messaging.scm:859 +msgid "Portable high-level Jabber/XMPP library for C++" +msgstr "" + +#: gnu/packages/messaging.scm:861 +msgid "" +"gloox is a full-featured Jabber/XMPP client library,\n" +"written in ANSI C++. It makes writing spec-compliant clients easy\n" +"and allows for hassle-free integration of Jabber/XMPP functionality\n" +"into existing applications." +msgstr "" + +#: gnu/packages/messaging.scm:934 +msgid "" +"@code{Net::PSYC} with support for TCP, UDP, Event.pm, @code{IO::Select} and\n" +"Gtk2 event loops. This package includes 12 applications and additional scripts:\n" +"psycion (a @uref{http://about.psyc.eu,PSYC} chat client), remotor (a control console\n" +"for @uref{https://torproject.org,tor} router) and many more." +msgstr "" + +#: gnu/packages/messaging.scm:938 +msgid "Perl implementation of PSYC protocol" +msgstr "Perlimplementering af PSYC-protokollen" + +#: gnu/packages/messaging.scm:977 +msgid "" +"@code{libpsyc} is a PSYC library in C which implements\n" +"core aspects of PSYC, useful for all kinds of clients and servers\n" +"including psyced." +msgstr "" + +#: gnu/packages/messaging.scm:980 +msgid "PSYC library in C" +msgstr "" + +#: gnu/packages/messaging.scm:1047 +msgid "psycLPC is a multi-user network server programming language" +msgstr "" + +#: gnu/packages/messaging.scm:1049 +msgid "" +"LPC is a bytecode language, invented to specifically implement\n" +"multi user virtual environments on the internet. This technology is used for\n" +"MUDs and also the psyced implementation of the Protocol for SYnchronous\n" +"Conferencing (PSYC). psycLPC is a fork of LDMud with some new features and\n" +"many bug fixes." +msgstr "" + +#: gnu/packages/mpd.scm:68 msgid "Music Player Daemon client library" msgstr "" -#: gnu/packages/mpd.scm:65 +#: gnu/packages/mpd.scm:69 msgid "" "A stable, documented, asynchronous API library for\n" "interfacing MPD in the C, C++ & Objective C languages." msgstr "" -#: gnu/packages/mpd.scm:125 +#: gnu/packages/mpd.scm:129 msgid "Music Player Daemon" msgstr "" -#: gnu/packages/mpd.scm:126 +#: gnu/packages/mpd.scm:130 msgid "" "Music Player Daemon (MPD) is a flexible, powerful,\n" "server-side application for playing music. Through plugins and libraries it\n" @@ -5483,11 +7048,11 @@ msgid "" "protocol." msgstr "" -#: gnu/packages/mpd.scm:149 +#: gnu/packages/mpd.scm:153 msgid "Music Player Daemon client" msgstr "Music Player - dæmonklient" -#: gnu/packages/mpd.scm:150 +#: gnu/packages/mpd.scm:154 msgid "" "MPC is a minimalist command line interface to MPD, the music\n" "player daemon." @@ -5495,43 +7060,64 @@ msgstr "" "MPC er en minimalistisk kommandolinjegrænseflade til MPD,\n" "musikafspillerdæmonen." -#: gnu/packages/mpd.scm:173 +#: gnu/packages/mpd.scm:177 msgid "Curses Music Player Daemon client" msgstr "" -#: gnu/packages/mpd.scm:174 +#: gnu/packages/mpd.scm:178 msgid "" "ncmpc is a fully featured MPD client, which runs in a\n" "terminal using ncurses." msgstr "" -#: gnu/packages/mpd.scm:212 +#: gnu/packages/mpd.scm:207 msgid "Featureful ncurses based MPD client inspired by ncmpc" msgstr "" -#: gnu/packages/mpd.scm:213 +#: gnu/packages/mpd.scm:208 msgid "" "Ncmpcpp is an mpd client with a UI very similar to ncmpc,\n" "but it provides new useful features such as support for regular expressions\n" "for library searches, extended song format, items filtering, the ability to\n" -"sort playlists, and a local filesystem browser." +"sort playlists, and a local file system browser." msgstr "" -#: gnu/packages/mpd.scm:236 +#: gnu/packages/mpd.scm:231 msgid "MPD client for track scrobbling" msgstr "" -#: gnu/packages/mpd.scm:237 +#: gnu/packages/mpd.scm:232 msgid "" "mpdscribble is a Music Player Daemon client which submits\n" "information about tracks being played to a scrobbler, such as Libre.FM." msgstr "" -#: gnu/packages/netpbm.scm:146 +#: gnu/packages/mpd.scm:257 +msgid "Python MPD client library" +msgstr "" + +#: gnu/packages/mpd.scm:258 +msgid "" +"Python-mpd2 is a Python library which provides a client\n" +"interface for the Music Player Daemon." +msgstr "" + +#: gnu/packages/mpd.scm:307 +msgid "Elegant client for the Music Player Daemon" +msgstr "" + +#: gnu/packages/mpd.scm:308 +msgid "" +"Sonata is an elegant graphical client for the Music Player\n" +"Daemon (MPD). It supports playlists, multiple profiles (connecting to different\n" +"MPD servers, search and multimedia key support." +msgstr "" + +#: gnu/packages/netpbm.scm:167 msgid "Toolkit for manipulation of images" msgstr "" -#: gnu/packages/netpbm.scm:148 +#: gnu/packages/netpbm.scm:169 msgid "" "Netpbm is a toolkit for the manipulation of graphic images, including\n" "the conversion of images between a variety of different formats.\n" @@ -5551,22 +7137,34 @@ msgid "" "themselves." msgstr "" -#: gnu/packages/networking.scm:52 +#: gnu/packages/networking.scm:77 +msgid "Viewing and manipulating MAC addresses of network interfaces" +msgstr "" + +#: gnu/packages/networking.scm:78 +msgid "" +"GNU MAC Changer is a utility for viewing and changing MAC\n" +"addresses of networking devices. New addresses may be set explicitly or\n" +"randomly. They can include MAC addresses of the same or other hardware vendors\n" +"or, more generally, MAC addresses of the same category of hardware." +msgstr "" + +#: gnu/packages/networking.scm:106 msgid "Teredo IPv6 tunneling software" msgstr "" -#: gnu/packages/networking.scm:54 +#: gnu/packages/networking.scm:108 msgid "" "Miredo is an implementation (client, relay, server) of the Teredo\n" "specification, which provides IPv6 Internet connectivity to IPv6 enabled hosts\n" "residing in IPv4-only networks, even when they are behind a NAT device." msgstr "" -#: gnu/packages/networking.scm:76 +#: gnu/packages/networking.scm:130 msgid "Open bidirectional communication channels from the command line" msgstr "" -#: gnu/packages/networking.scm:78 +#: gnu/packages/networking.scm:132 msgid "" "socat is a relay for bidirectional data transfer between two independent\n" "data channels---files, pipes, devices, sockets, etc. It can create\n" @@ -5579,11 +7177,22 @@ msgid "" "or server shell scripts with network connections." msgstr "" -#: gnu/packages/networking.scm:102 +#: gnu/packages/networking.scm:213 +msgid "Monitor and filter incoming requests for network services" +msgstr "" + +#: gnu/packages/networking.scm:214 +msgid "" +"With this package you can monitor and filter incoming requests for\n" +"network services. It includes a library which may be used by daemons to\n" +"transparently check connection attempts against an access control list." +msgstr "" + +#: gnu/packages/networking.scm:234 msgid "Library for message-based applications" msgstr "" -#: gnu/packages/networking.scm:104 +#: gnu/packages/networking.scm:236 msgid "" "The 0MQ lightweight messaging kernel is a library which extends the\n" "standard socket interfaces with features traditionally provided by specialized\n" @@ -5593,33 +7202,43 @@ msgid "" "more." msgstr "" -#: gnu/packages/networking.scm:125 +#: gnu/packages/networking.scm:275 +msgid "Apache Kafka C/C++ client library" +msgstr "" + +#: gnu/packages/networking.scm:277 +msgid "" +"librdkafka is a C library implementation of the Apache Kafka protocol,\n" +"containing both Producer and Consumer support." +msgstr "" + +#: gnu/packages/networking.scm:294 msgid "Library for Neighbor Discovery Protocol" msgstr "" -#: gnu/packages/networking.scm:127 +#: gnu/packages/networking.scm:296 msgid "" "libndp contains a library which provides a wrapper for IPv6 Neighbor\n" "Discovery Protocol. It also provides a tool named ndptool for sending and\n" "receiving NDP messages." msgstr "" -#: gnu/packages/networking.scm:145 +#: gnu/packages/networking.scm:314 msgid "Display or change Ethernet device settings" msgstr "" -#: gnu/packages/networking.scm:147 +#: gnu/packages/networking.scm:316 msgid "" "ethtool can be used to query and change settings such as speed,\n" "auto-negotiation and checksum offload on many network devices, especially\n" "Ethernet devices." msgstr "" -#: gnu/packages/networking.scm:183 +#: gnu/packages/networking.scm:353 msgid "Text based network interface status monitor" msgstr "" -#: gnu/packages/networking.scm:185 +#: gnu/packages/networking.scm:355 msgid "" "IFStatus is a simple, easy-to-use program for displaying commonly\n" "needed/wanted real-time traffic statistics of multiple network\n" @@ -5627,92 +7246,329 @@ msgid "" "intended as a substitute for the PPPStatus and EthStatus projects." msgstr "" -#: gnu/packages/pdf.scm:101 -msgid "PDF rendering library" +#: gnu/packages/networking.scm:375 +msgid "Realtime console network usage monitor" msgstr "" -#: gnu/packages/pdf.scm:103 -msgid "Poppler is a PDF rendering library based on the xpdf-3.0 code base." +#: gnu/packages/networking.scm:377 +msgid "" +"Nload is a console application which monitors network traffic and\n" +"bandwidth usage in real time. It visualizes the in- and outgoing traffic using\n" +"two graphs and provides additional info like total amount of transfered data\n" +"and min/max network usage." msgstr "" -#: gnu/packages/pdf.scm:112 -msgid "Qt4 frontend for the Poppler PDF rendering library" +#: gnu/packages/networking.scm:420 +msgid "Tunnel IPv4 data through a DNS server" msgstr "" -#: gnu/packages/pdf.scm:145 -msgid "Python bindings for Poppler-Qt4" +#: gnu/packages/networking.scm:421 +msgid "" +"Iodine tunnels IPv4 data through a DNS server. This\n" +"can be useful in different situations where internet access is firewalled, but\n" +"DNS queries are allowed. The bandwidth is asymmetrical, with limited upstream\n" +"and up to 1 Mbit/s downstream." msgstr "" -#: gnu/packages/pdf.scm:147 +#: gnu/packages/networking.scm:459 +msgid "Improved whois client" +msgstr "" + +#: gnu/packages/networking.scm:460 +msgid "" +"This whois client is intelligent and can\n" +"automatically select the appropriate whois server for most queries.\n" +"Because of historical reasons this also includes a tool called mkpasswd\n" +"which can be used to encrypt a password with @code{crypt(3)}." +msgstr "" + +#: gnu/packages/networking.scm:471 +msgid "Network traffic analyzer" +msgstr "" + +#: gnu/packages/networking.scm:512 +msgid "" +"Wireshark is a network protocol analyzer, or @dfn{packet\n" +"sniffer}, that lets you capture and interactively browse the contents of\n" +"network frames." +msgstr "" + +#: gnu/packages/networking.scm:543 +msgid "Web server latency and throughput monitor" +msgstr "" + +#: gnu/packages/networking.scm:545 +msgid "" +"httping measures how long it takes to connect to a web server, send an\n" +"HTTP(S) request, and receive the reply headers. It is somewhat similar to\n" +"@command{ping}, but can be used even in cases where ICMP traffic is blocked\n" +"by firewalls or when you want to monitor the response time of the actual web\n" +"application stack itself." +msgstr "" + +#: gnu/packages/networking.scm:566 +msgid "Console based live network and disk I/O bandwidth monitor" +msgstr "" + +#: gnu/packages/networking.scm:567 +msgid "" +"Bandwidth Monitor NG is a small and simple console based\n" +"live network and disk I/O bandwidth monitor." +msgstr "" + +#: gnu/packages/networking.scm:616 +msgid "Assess WiFi network security" +msgstr "" + +#: gnu/packages/networking.scm:618 +msgid "" +"Aircrack-ng is a complete suite of tools to assess WiFi network\n" +"security. It focuses on different areas of WiFi security: monitoring,\n" +"attacking, testing, and cracking. All tools are command-line driven, which\n" +"allows for heavy scripting." +msgstr "" + +#: gnu/packages/networking.scm:643 +msgid "Perl Interface to the Domain Name System" +msgstr "" + +#: gnu/packages/networking.scm:644 +msgid "Net::DNS is the Perl Interface to the Domain Name System." +msgstr "" + +#: gnu/packages/networking.scm:675 +msgid "IPv6 related part of the C socket.h defines and structure manipulators for Perl" +msgstr "" + +#: gnu/packages/networking.scm:676 +msgid "" +"Socket6 binds the IPv6 related part of the C socket header\n" +"definitions and structure manipulators for Perl." +msgstr "" + +#: gnu/packages/networking.scm:703 +msgid "Programmable DNS resolver class for offline emulation of DNS" +msgstr "" + +#: gnu/packages/networking.scm:704 +msgid "" +"Net::DNS::Resolver::Programmable is a programmable DNS resolver for\n" +"offline emulation of DNS." +msgstr "" + +#: gnu/packages/networking.scm:737 +msgid "Manages IPv4 and IPv6 addresses and subnets" +msgstr "" + +#: gnu/packages/networking.scm:738 +msgid "NetAddr::IP manages IPv4 and IPv6 addresses and subsets." +msgstr "" + +#: gnu/packages/networking.scm:762 +msgid "Patricia Trie Perl module for fast IP address lookups" +msgstr "" + +#: gnu/packages/networking.scm:764 +msgid "Net::Patricia does IP address lookups quickly in Perl." +msgstr "" + +#: gnu/packages/networking.scm:787 +msgid "Perl extension for merging IPv4 or IPv6 CIDR addresses" +msgstr "" + +#: gnu/packages/networking.scm:788 +msgid "Net::CIDR::Lite merges IPv4 or IPv6 CIDR addresses." +msgstr "" + +#: gnu/packages/networking.scm:810 +msgid "Look up location and network information by IP Address in Perl" +msgstr "" + +#: gnu/packages/networking.scm:811 +msgid "" +"The Perl module 'Geo::IP'. It looks up location and network\n" +"information by IP Address." +msgstr "" + +#: gnu/packages/networking.scm:840 +msgid "Perl object interface for AF_INET/AF_INET6 domain sockets" +msgstr "" + +#: gnu/packages/networking.scm:841 +msgid "" +"IO::Socket::INET6 is an interface for AF_INET/AF_INET6 domain\n" +"sockets in Perl." +msgstr "" + +#: gnu/packages/networking.scm:872 +msgid "Redirect any TCP connection through a proxy or proxy chain" +msgstr "" + +#: gnu/packages/networking.scm:873 +msgid "" +"Proxychains-ng is a preloader which hooks calls to sockets\n" +"in dynamically linked programs and redirects them through one or more SOCKS or\n" +"HTTP proxies." +msgstr "" + +#: gnu/packages/networking.scm:894 +msgid "Network communication layer on top of UDP" +msgstr "" + +#: gnu/packages/networking.scm:896 +msgid "" +"ENet's purpose is to provide a relatively thin, simple and robust network\n" +"communication layer on top of UDP. The primary feature it provides is optional\n" +"reliable, in-order delivery of packets. ENet omits certain higher level\n" +"networking features such as authentication, server discovery, encryption, or\n" +"other similar tasks that are particularly application specific so that the\n" +"library remains flexible, portable, and easily embeddable." +msgstr "" + +#: gnu/packages/networking.scm:959 +msgid "Applicative network protocol demultiplexer" +msgstr "" + +#: gnu/packages/networking.scm:961 +msgid "" +"sslh is a network protocol demultiplexer. It acts like a switchboard,\n" +"accepting connections from clients on one port and forwarding them to different\n" +"servers based on the contents of the first received data packet. Detection of\n" +"common protocols like HTTP(S), SSL, SSH, OpenVPN, tinc, and XMPP is already\n" +"implemented, but any other protocol that matches a regular expression can be\n" +"added. sslh's name comes from its original application of serving both SSH and\n" +"HTTPS on port 443, allowing SSH connections from inside corporate firewalls\n" +"that block port 22." +msgstr "" + +#: gnu/packages/networking.scm:984 +msgid "TCP, UDP and SCTP bandwidth measurement tool" +msgstr "" + +#: gnu/packages/networking.scm:986 +msgid "" +"iPerf is a tool to measure achievable bandwidth on IP networks. It\n" +"supports tuning of various parameters related to timing, buffers and\n" +"protocols (TCP, UDP, SCTP with IPv4 and IPv6). For each test it reports\n" +"the bandwidth, loss, and other parameters." +msgstr "" + +#: gnu/packages/networking.scm:1019 +msgid "Per-process bandwidth monitor" +msgstr "" + +#: gnu/packages/networking.scm:1020 +msgid "" +"NetHogs is a small 'net top' tool for Linux. Instead of\n" +"breaking the traffic down per protocol or per subnet, like most tools do, it\n" +"groups bandwidth by process.\n" +"\n" +"NetHogs does not rely on a special kernel module to be loaded. If there's\n" +"suddenly a lot of network traffic, you can fire up NetHogs and immediately see\n" +"which PID is causing this. This makes it easy to identify programs that have\n" +"gone wild and are suddenly taking up your bandwidth." +msgstr "" + +#: gnu/packages/pdf.scm:121 +msgid "PDF rendering library" +msgstr "PDF-optegningsbibliotek" + +#: gnu/packages/pdf.scm:123 +msgid "Poppler is a PDF rendering library based on the xpdf-3.0 code base." +msgstr "Poppler er et PDF-optegningsbibliotek baseret på xpdf-3.0-kodebasen." + +#: gnu/packages/pdf.scm:132 +msgid "Qt4 frontend for the Poppler PDF rendering library" +msgstr "Qt4-brugeflade for Poppler PDF-optegningsbiblioteket" + +#: gnu/packages/pdf.scm:143 +msgid "Qt5 frontend for the Poppler PDF rendering library" +msgstr "Qt5-brugeflade for Poppler PDF-optegningsbiblioteket" + +#: gnu/packages/pdf.scm:176 +msgid "Python bindings for Poppler-Qt4" +msgstr "Pythonbindinger for Poppler-Qt4" + +#: gnu/packages/pdf.scm:178 msgid "" "This package provides Python bindings for the Qt4 interface of the\n" "Poppler PDF rendering library." msgstr "" -#: gnu/packages/pdf.scm:194 +#: gnu/packages/pdf.scm:215 +msgid "Library for generating PDF files" +msgstr "Bibliotek til at oprette PDF-filer" + +#: gnu/packages/pdf.scm:217 +msgid "" +"libHaru is a library for generating PDF files. libHaru does not support\n" +"reading and editing of existing PDF files." +msgstr "" + +#: gnu/packages/pdf.scm:264 msgid "Viewer for PDF files based on the Motif toolkit" msgstr "" -#: gnu/packages/pdf.scm:196 +#: gnu/packages/pdf.scm:266 msgid "Xpdf is a viewer for Portable Document Format (PDF) files." msgstr "Xpdf er en fremviser for Portable Document Format-filer (PDF)." -#: gnu/packages/pdf.scm:226 +#: gnu/packages/pdf.scm:296 msgid "Comic book support for zathura (libarchive backend)" msgstr "Understøttelse af tegneserier i zathura (libarchive-motor)" -#: gnu/packages/pdf.scm:227 +#: gnu/packages/pdf.scm:297 msgid "" "The zathura-cb plugin adds comic book support to zathura\n" "using libarchive." msgstr "" -#: gnu/packages/pdf.scm:257 +#: gnu/packages/pdf.scm:327 msgid "PS support for zathura (libspectre backend)" msgstr "" -#: gnu/packages/pdf.scm:258 +#: gnu/packages/pdf.scm:328 msgid "" "The zathura-ps plugin adds PS support to zathura\n" "using libspectre." msgstr "" -#: gnu/packages/pdf.scm:289 +#: gnu/packages/pdf.scm:359 msgid "DjVu support for zathura (DjVuLibre backend)" msgstr "" -#: gnu/packages/pdf.scm:290 +#: gnu/packages/pdf.scm:360 msgid "" "The zathura-djvu plugin adds DjVu support to zathura\n" "using the DjVuLibre library." msgstr "" -#: gnu/packages/pdf.scm:322 +#: gnu/packages/pdf.scm:392 msgid "PDF support for zathura (poppler backend)" msgstr "" -#: gnu/packages/pdf.scm:323 +#: gnu/packages/pdf.scm:393 msgid "" "The zathura-pdf-poppler plugin adds PDF support to zathura\n" "by using the poppler rendering engine." msgstr "" -#: gnu/packages/pdf.scm:361 +#: gnu/packages/pdf.scm:430 msgid "Lightweight keyboard-driven PDF viewer" msgstr "" -#: gnu/packages/pdf.scm:362 +#: gnu/packages/pdf.scm:431 msgid "" "Zathura is a customizable document viewer. It provides a\n" "minimalistic interface and an interface that mainly focuses on keyboard\n" "interaction." msgstr "" -#: gnu/packages/pdf.scm:401 +#: gnu/packages/pdf.scm:470 msgid "Tools to work with the PDF file format" msgstr "" -#: gnu/packages/pdf.scm:403 +#: gnu/packages/pdf.scm:472 msgid "" "PoDoFo is a C++ library and set of command-line tools to work with the\n" "PDF file format. It can parse PDF files and load them into memory, and makes\n" @@ -5721,11 +7577,11 @@ msgid "" "extracting content or merging files." msgstr "" -#: gnu/packages/pdf.scm:464 +#: gnu/packages/pdf.scm:528 msgid "Lightweight PDF viewer and toolkit" msgstr "" -#: gnu/packages/pdf.scm:466 +#: gnu/packages/pdf.scm:530 msgid "" "MuPDF is a C library that implements a PDF and XPS parsing and\n" "rendering engine. It is used primarily to render pages into bitmaps,\n" @@ -5737,11 +7593,11 @@ msgid "" "and examining the file structure (pdfshow)." msgstr "" -#: gnu/packages/pdf.scm:506 +#: gnu/packages/pdf.scm:582 msgid "Command-line tools and library for transforming PDF files" msgstr "" -#: gnu/packages/pdf.scm:508 +#: gnu/packages/pdf.scm:584 msgid "" "QPDF is a command-line program that does structural, content-preserving\n" "transformations on PDF files. It could have been called something like\n" @@ -5750,16 +7606,108 @@ msgid "" "program capable of converting PDF into other formats." msgstr "" -#: gnu/packages/pdf.scm:538 +#: gnu/packages/pdf.scm:614 msgid "Notetaking using a stylus" msgstr "" -#: gnu/packages/pdf.scm:540 +#: gnu/packages/pdf.scm:616 msgid "" "Xournal is an application for notetaking, sketching, keeping a journal\n" "using a stylus." msgstr "" +#: gnu/packages/pdf.scm:634 +msgid "Python library for generating PDFs and graphics" +msgstr "Pythonbibliotek til at oprette PDF-filer og grafik" + +#: gnu/packages/pdf.scm:635 +msgid "" +"This is the ReportLab PDF Toolkit. It allows rapid creation\n" +"of rich PDF documents, and also creation of charts in a variety of bitmap and\n" +"vector formats." +msgstr "" + +#: gnu/packages/pdf.scm:688 +msgid "PDF presentation tool with visual effects" +msgstr "PDF-præsentationsværktøj med visuelle effekter" + +#: gnu/packages/pdf.scm:690 +msgid "" +"Impressive is a tool to display PDF files that provides visual effects\n" +"such as smooth alpha-blended slide transitions. It provides additional tools\n" +"such as zooming, highlighting an area of the screen, and a tool to navigate\n" +"the PDF pages." +msgstr "" + +#: gnu/packages/pdf.scm:737 +msgid "Framebuffer and drm-based image viewer" +msgstr "Framebuffer og drm-baseret billedfremviser" + +#: gnu/packages/pdf.scm:739 +msgid "" +"fbida contains a few applications for viewing and editing images on\n" +"the framebuffer." +msgstr "" + +#: gnu/packages/pdf.scm:764 +msgid "PDF to SVG converter" +msgstr "PDF- til SVG-konverteringsprogram" + +#: gnu/packages/pdf.scm:765 +msgid "" +"@command{pdf2svg} is a simple command-line PDF to SVG\n" +"converter using the Poppler and Cairo libraries." +msgstr "" + +#: gnu/packages/pdf.scm:796 gnu/packages/pdf.scm:833 +msgid "Pure Python PDF toolkit" +msgstr "Pure Python PDF-værktøjssæt" + +#: gnu/packages/pdf.scm:797 +msgid "" +"PyPDF2 is a pure Python PDF library capable of:\n" +"\n" +"@enumerate\n" +"@item extracting document information (title, author, …)\n" +"@item splitting documents page by page\n" +"@item merging documents page by page\n" +"@item cropping pages\n" +"@item merging multiple pages into a single page\n" +"@item encrypting and decrypting PDF files\n" +"@end enumerate\n" +"\n" +"By being pure Python, it should run on any Python platform without any\n" +"dependencies on external libraries. It can also work entirely on\n" +"@code{StringIO} objects rather than file streams, allowing for PDF\n" +"manipulation in memory. It is therefore a useful tool for websites that\n" +"manage or manipulate PDFs." +msgstr "" + +#: gnu/packages/pdf.scm:834 +msgid "" +"PyPDF2 is a pure Python PDF toolkit.\n" +"\n" +"Note: This module isn't maintained anymore. For new projects please use\n" +"python-pypdf2 instead." +msgstr "" + +#: gnu/packages/pdf.scm:858 +msgid "Scale and tile PDF images/pages to print on multiple pages" +msgstr "" + +#: gnu/packages/pdf.scm:859 +msgid "" +"@command{pdfposter} can be used to create a large poster by\n" +"building it from multple pages and/or printing it on large media. It expects\n" +"as input a PDF file, normally printing on a single page. The output is again\n" +"a PDF file, maybe containing multiple pages together building the poster. The\n" +"input page will be scaled to obtain the desired size.\n" +"\n" +"This is much like @command{poster} does for Postscript files, but working with\n" +"PDF. Since sometimes @command{poster} does not like your files converted from\n" +"PDF. Indeed @command{pdfposter} was inspired by @command{poster}." +msgstr "" + #: gnu/packages/pem.scm:41 msgid "Personal expenses manager" msgstr "" @@ -5773,31 +7721,31 @@ msgid "" "feature." msgstr "" -#: gnu/packages/perl.scm:111 +#: gnu/packages/perl.scm:138 msgid "Implementation of the Perl programming language" msgstr "" -#: gnu/packages/perl.scm:113 +#: gnu/packages/perl.scm:140 msgid "" "Perl 5 is a highly capable, feature-rich programming language with over\n" "24 years of development." msgstr "" -#: gnu/packages/perl.scm:154 +#: gnu/packages/perl.scm:159 msgid "Module for merging hierarchies using the C3 algorithm" msgstr "" -#: gnu/packages/perl.scm:155 +#: gnu/packages/perl.scm:160 msgid "" "This module implements the C3 algorithm, which aims to\n" "provide a sane method resolution order under multiple inheritance." msgstr "" -#: gnu/packages/perl.scm:173 +#: gnu/packages/perl.scm:178 msgid "Compute differences between two files or lists" msgstr "" -#: gnu/packages/perl.scm:174 +#: gnu/packages/perl.scm:179 msgid "" "This is a module for computing the difference between two\n" "files, two strings, or any other two lists of things. It uses an intelligent\n" @@ -5806,11 +7754,11 @@ msgid "" "differences." msgstr "" -#: gnu/packages/perl.scm:196 +#: gnu/packages/perl.scm:201 msgid "Use shorter versions of class names" msgstr "" -#: gnu/packages/perl.scm:197 +#: gnu/packages/perl.scm:202 msgid "" "The alias module loads the class you specify and exports\n" "into your namespace a subroutine that returns the class name. You can\n" @@ -5818,31 +7766,59 @@ msgid "" "implicitly." msgstr "" -#: gnu/packages/perl.scm:219 +#: gnu/packages/perl.scm:224 msgid "Configuration files and command line parsing" msgstr "" -#: gnu/packages/perl.scm:220 +#: gnu/packages/perl.scm:225 msgid "" "AppConfig is a bundle of Perl5 modules for reading\n" "configuration files and parsing command line arguments." msgstr "" -#: gnu/packages/perl.scm:238 +#: gnu/packages/perl.scm:243 msgid "Perl API to zip files" msgstr "" -#: gnu/packages/perl.scm:239 gnu/packages/zip.scm:170 +#: gnu/packages/perl.scm:244 gnu/packages/zip.scm:171 msgid "" "The Archive::Zip module allows a Perl program to create,\n" "manipulate, read, and write Zip archive files." msgstr "" -#: gnu/packages/perl.scm:258 gnu/packages/perl.scm:4133 +#: gnu/packages/perl.scm:265 +msgid "Small utils for array manipulation" +msgstr "" + +#: gnu/packages/perl.scm:266 +msgid "" +"@code{Array::Utils} is a small pure-perl module containing\n" +"list manipulation routines." +msgstr "" + +#: gnu/packages/perl.scm:284 +msgid "Lexically disable autovivification" +msgstr "" + +#: gnu/packages/perl.scm:285 +msgid "" +"When an undefined variable is dereferenced, it gets silently\n" +"upgraded to an array or hash reference (depending of the type of the\n" +"dereferencing). This behaviour is called autovivification and usually does\n" +"what you mean but it may be unnatural or surprising because your variables get\n" +"populated behind your back. This is especially true when several levels of\n" +"dereferencing are involved, in which case all levels are vivified up to the\n" +"last, or when it happens in intuitively read-only constructs like\n" +"@code{exists}. The pragma provided by this package lets you disable\n" +"autovivification for some constructs and optionally throws a warning or an\n" +"error when it would have happened." +msgstr "" + +#: gnu/packages/perl.scm:311 gnu/packages/perl.scm:5077 msgid "Establish an ISA relationship with base classes at compile time" msgstr "" -#: gnu/packages/perl.scm:259 +#: gnu/packages/perl.scm:312 msgid "" "Allows you to both load one or more modules, while setting\n" "up inheritance from those modules at the same time. Unless you are using the\n" @@ -5850,21 +7826,21 @@ msgid "" "parent." msgstr "" -#: gnu/packages/perl.scm:284 +#: gnu/packages/perl.scm:337 msgid "Execute code after a scope finished compilation" msgstr "" -#: gnu/packages/perl.scm:285 +#: gnu/packages/perl.scm:338 msgid "" "This module allows you to execute code when perl finished\n" "compiling the surrounding scope." msgstr "" -#: gnu/packages/perl.scm:303 +#: gnu/packages/perl.scm:356 msgid "Benchmarking with statistical confidence" msgstr "" -#: gnu/packages/perl.scm:305 +#: gnu/packages/perl.scm:358 msgid "" "The Benchmark::Timer class allows you to time portions of code\n" "conveniently, as well as benchmark code by allowing timings of repeated\n" @@ -5873,11 +7849,11 @@ msgid "" "but don't want to go all out and profile your code." msgstr "" -#: gnu/packages/perl.scm:330 +#: gnu/packages/perl.scm:383 msgid "Bit vector library" msgstr "" -#: gnu/packages/perl.scm:331 +#: gnu/packages/perl.scm:384 msgid "" "Bit::Vector is an efficient C library which allows you to\n" "handle bit vectors, sets (of integers), \"big integer arithmetic\" and boolean\n" @@ -5887,21 +7863,62 @@ msgid "" "library can nevertheless be used stand-alone, without Perl." msgstr "" -#: gnu/packages/perl.scm:353 +#: gnu/packages/perl.scm:406 msgid "Boolean support for Perl" msgstr "" -#: gnu/packages/perl.scm:354 +#: gnu/packages/perl.scm:407 msgid "" "This module provides basic Boolean support, by defining two\n" "special objects: true and false." msgstr "" -#: gnu/packages/perl.scm:375 +#: gnu/packages/perl.scm:425 +msgid "Data files for Business::ISBN" +msgstr "" + +#: gnu/packages/perl.scm:426 +msgid "" +"This package provides a data pack for @code{Business::ISBN}.\n" +"These data are generated from the RangeMessage.xml file provided by the ISBN\n" +"Agency." +msgstr "" + +#: gnu/packages/perl.scm:448 +msgid "Work with International Standard Book Numbers" +msgstr "" + +#: gnu/packages/perl.scm:449 +msgid "" +"This modules provides tools to deal with International\n" +"Standard Book Numbers, including ISBN-10 and ISBN-13." +msgstr "" + +#: gnu/packages/perl.scm:467 +msgid "Work with International Standard Serial Numbers" +msgstr "" + +#: gnu/packages/perl.scm:468 +msgid "" +"This modules provides tools to deal with International\n" +"Standard Serial Numbers." +msgstr "" + +#: gnu/packages/perl.scm:488 +msgid "Work with International Standard Music Numbers" +msgstr "" + +#: gnu/packages/perl.scm:489 +msgid "" +"This modules provides tools to deal with International\n" +"Standard Music Numbers." +msgstr "" + +#: gnu/packages/perl.scm:510 msgid "Cache interface for Perl" msgstr "" -#: gnu/packages/perl.scm:376 +#: gnu/packages/perl.scm:511 msgid "" "The Cache modules are designed to assist a developer in\n" "persisting data for a specified period of time. Often these modules are used\n" @@ -5909,14 +7926,14 @@ msgid "" "expensive calls to remote machines or databases. People have also been known\n" "to use Cache::Cache for its straightforward interface in sharing data between\n" "runs of an application or invocations of a CGI-style script or simply as an\n" -"easy to use abstraction of the filesystem or shared memory." +"easy to use abstraction of the file system or shared memory." msgstr "" -#: gnu/packages/perl.scm:399 +#: gnu/packages/perl.scm:534 msgid "Shared memory interprocess cache via mmap" msgstr "" -#: gnu/packages/perl.scm:400 +#: gnu/packages/perl.scm:535 msgid "" "A shared memory cache through an mmap'ed file. It's core is\n" "written in C for performance. It uses fcntl locking to ensure multiple\n" @@ -5924,11 +7941,11 @@ msgid "" "algorithm to keep the most used entries in the cache." msgstr "" -#: gnu/packages/perl.scm:421 +#: gnu/packages/perl.scm:556 msgid "Capture STDOUT and STDERR from Perl, XS or external programs" msgstr "" -#: gnu/packages/perl.scm:423 +#: gnu/packages/perl.scm:558 msgid "" "Capture::Tiny provides a simple, portable way to capture almost anything\n" "sent to STDOUT or STDERR, regardless of whether it comes from Perl, from XS\n" @@ -5936,31 +7953,31 @@ msgid "" "is captured while being passed through to the original file handles." msgstr "" -#: gnu/packages/perl.scm:443 +#: gnu/packages/perl.scm:578 msgid "Executable comments for Perl" msgstr "" -#: gnu/packages/perl.scm:444 +#: gnu/packages/perl.scm:579 msgid "" "Carp::Assert is intended for a purpose like the ANSI C\n" "library assert.h." msgstr "" -#: gnu/packages/perl.scm:466 +#: gnu/packages/perl.scm:601 msgid "Convenience wrappers around Carp::Assert" msgstr "" -#: gnu/packages/perl.scm:467 +#: gnu/packages/perl.scm:602 msgid "" "Carp::Assert::More is a set of handy assertion functions for\n" "Perl." msgstr "" -#: gnu/packages/perl.scm:487 +#: gnu/packages/perl.scm:622 msgid "Report errors from a \"clan\" of modules" msgstr "" -#: gnu/packages/perl.scm:488 +#: gnu/packages/perl.scm:623 msgid "" "This module allows errors from a clan (or family) of modules\n" "to appear to originate from the caller of the clan. This is necessary in\n" @@ -5968,21 +7985,21 @@ msgid "" "the Carp.pm module doesn't help." msgstr "" -#: gnu/packages/perl.scm:512 +#: gnu/packages/perl.scm:647 msgid "Automated accessor generation" msgstr "" -#: gnu/packages/perl.scm:513 +#: gnu/packages/perl.scm:648 msgid "" "This module automagically generates accessors/mutators for\n" "your class." msgstr "" -#: gnu/packages/perl.scm:535 +#: gnu/packages/perl.scm:670 msgid "Faster, but less expandable, chained accessors" msgstr "" -#: gnu/packages/perl.scm:536 +#: gnu/packages/perl.scm:671 msgid "" "A chained accessor is one that always returns the object\n" "when called with parameters (to set), and the value of the field when called\n" @@ -5990,52 +8007,52 @@ msgid "" "the same mk_accessors interface." msgstr "" -#: gnu/packages/perl.scm:562 +#: gnu/packages/perl.scm:697 msgid "Build groups of accessors" msgstr "" -#: gnu/packages/perl.scm:563 +#: gnu/packages/perl.scm:698 msgid "" "This class lets you build groups of accessors that will call\n" "different getters and setters." msgstr "" -#: gnu/packages/perl.scm:583 +#: gnu/packages/perl.scm:718 msgid "Pragma to use the C3 method resolution order algorithm" msgstr "" -#: gnu/packages/perl.scm:584 +#: gnu/packages/perl.scm:719 msgid "" "This is pragma to change Perl 5's standard method resolution\n" "order from depth-first left-to-right (a.k.a - pre-order) to the more\n" "sophisticated C3 method resolution order." msgstr "" -#: gnu/packages/perl.scm:608 +#: gnu/packages/perl.scm:743 msgid "Drop-in replacement for NEXT" msgstr "" -#: gnu/packages/perl.scm:609 +#: gnu/packages/perl.scm:744 msgid "" "This module is intended as a drop-in replacement for NEXT,\n" "supporting the same interface, but using Class::C3 to do the hard work." msgstr "" -#: gnu/packages/perl.scm:633 +#: gnu/packages/perl.scm:768 msgid "Load mix-ins or components to your C3-based class" msgstr "" -#: gnu/packages/perl.scm:634 +#: gnu/packages/perl.scm:769 msgid "" "This module will inject base classes to your module using\n" "the Class::C3 method resolution order." msgstr "" -#: gnu/packages/perl.scm:652 +#: gnu/packages/perl.scm:787 msgid "Inheritable, overridable class data" msgstr "" -#: gnu/packages/perl.scm:653 +#: gnu/packages/perl.scm:788 msgid "" "Class::Data::Inheritable is for creating accessor/mutators\n" "to class data. That is, if you want to store something about your class as a\n" @@ -6043,70 +8060,82 @@ msgid "" "subclasses and can be overridden." msgstr "" -#: gnu/packages/perl.scm:674 +#: gnu/packages/perl.scm:809 msgid "Class for easy date and time manipulation" msgstr "" -#: gnu/packages/perl.scm:675 +#: gnu/packages/perl.scm:810 msgid "" "This module provides a general-purpose date and datetime\n" "type for perl." msgstr "" -#: gnu/packages/perl.scm:694 +#: gnu/packages/perl.scm:827 +msgid "Base class for error handling" +msgstr "" + +#: gnu/packages/perl.scm:829 +msgid "" +"@code{Class::ErrorHandler} provides an error-handling mechanism that is generic\n" +"enough to be used as the base class for a variety of OO classes. Subclasses inherit\n" +"its two error-handling methods, error and errstr, to communicate error messages back\n" +"to the calling program." +msgstr "" + +#: gnu/packages/perl.scm:850 msgid "Utility methods for factory classes" msgstr "" -#: gnu/packages/perl.scm:695 +#: gnu/packages/perl.scm:851 msgid "This module exports methods useful for factory classes." msgstr "" -#: gnu/packages/perl.scm:712 +#: gnu/packages/perl.scm:868 msgid "Get information about a class and its structure" msgstr "" -#: gnu/packages/perl.scm:713 +#: gnu/packages/perl.scm:869 msgid "" "Class::Inspector allows you to get information about a\n" "loaded class." msgstr "" -#: gnu/packages/perl.scm:741 +#: gnu/packages/perl.scm:897 msgid "Working (require \"Class::Name\") and more" msgstr "" -#: gnu/packages/perl.scm:742 +#: gnu/packages/perl.scm:898 msgid "" "\"require EXPR\" only accepts Class/Name.pm style module\n" "names, not Class::Name. For that, this module provides \"load_class\n" "'Class::Name'\"." msgstr "" -#: gnu/packages/perl.scm:765 +#: gnu/packages/perl.scm:921 msgid "XS implementation of parts of Class::Load" msgstr "" -#: gnu/packages/perl.scm:766 +#: gnu/packages/perl.scm:922 msgid "" "This module provides an XS implementation for portions of\n" "Class::Load." msgstr "" -#: gnu/packages/perl.scm:785 +#: gnu/packages/perl.scm:941 msgid "Create generic methods for OO Perl" msgstr "" -#: gnu/packages/perl.scm:786 +#: gnu/packages/perl.scm:942 msgid "" "This module solves the problem of having to continually\n" "write accessor methods for your objects that perform standard tasks." msgstr "" -#: gnu/packages/perl.scm:807 +#: gnu/packages/perl.scm:963 msgid "Moose-like method modifiers" msgstr "" -#: gnu/packages/perl.scm:808 +#: gnu/packages/perl.scm:964 msgid "" "Class::Method::Modifiers provides three modifiers: 'before',\n" "'around', and 'after'. 'before' and 'after' are run just before and after the\n" @@ -6115,42 +8144,42 @@ msgid "" "original method." msgstr "" -#: gnu/packages/perl.scm:829 +#: gnu/packages/perl.scm:985 msgid "Implementation of a singleton class for Perl" msgstr "" -#: gnu/packages/perl.scm:830 +#: gnu/packages/perl.scm:986 msgid "" "This module implements a Singleton class from which other\n" "classes can be derived. By itself, the Class::Singleton module does very\n" "little other than manage the instantiation of a single object." msgstr "" -#: gnu/packages/perl.scm:849 +#: gnu/packages/perl.scm:1005 msgid "Minimalist class construction" msgstr "" -#: gnu/packages/perl.scm:850 +#: gnu/packages/perl.scm:1006 msgid "" "This module offers a minimalist class construction kit. It\n" "uses no non-core modules for any recent Perl." msgstr "" -#: gnu/packages/perl.scm:870 +#: gnu/packages/perl.scm:1026 msgid "Unload a class" msgstr "" -#: gnu/packages/perl.scm:871 +#: gnu/packages/perl.scm:1027 msgid "" "Class:Unload unloads a given class by clearing out its\n" "symbol table and removing it from %INC." msgstr "" -#: gnu/packages/perl.scm:889 +#: gnu/packages/perl.scm:1045 msgid "Generate fast XS accessors without runtime compilation" msgstr "" -#: gnu/packages/perl.scm:890 +#: gnu/packages/perl.scm:1046 msgid "" "Class::XSAccessor implements fast read, write, and\n" "read/write accessors in XS. Additionally, it can provide predicates such as\n" @@ -6160,53 +8189,53 @@ msgid "" "arrays for their internal representation." msgstr "" -#: gnu/packages/perl.scm:910 +#: gnu/packages/perl.scm:1066 msgid "Recursively copy Perl datatypes" msgstr "" -#: gnu/packages/perl.scm:912 +#: gnu/packages/perl.scm:1068 msgid "" "This module provides a clone() method which makes recursive copies of\n" "nested hash, array, scalar and reference types, including tied variables and\n" "objects." msgstr "" -#: gnu/packages/perl.scm:933 +#: gnu/packages/perl.scm:1089 msgid "Sane defaults for Perl programs" msgstr "" -#: gnu/packages/perl.scm:934 +#: gnu/packages/perl.scm:1090 msgid "" "This module implements some sane defaults for Perl programs,\n" "as defined by two typical specimens of Perl coders." msgstr "" -#: gnu/packages/perl.scm:954 +#: gnu/packages/perl.scm:1110 msgid "Load configuration from different file formats" msgstr "" -#: gnu/packages/perl.scm:955 +#: gnu/packages/perl.scm:1111 msgid "" "Config::Any provides a facility for Perl applications and\n" "libraries to load configuration data from multiple different file formats. It\n" "supports XML, YAML, JSON, Apache-style configuration, and Perl code." msgstr "" -#: gnu/packages/perl.scm:976 +#: gnu/packages/perl.scm:1132 msgid "Module to implement some AutoConf macros in Perl" msgstr "" -#: gnu/packages/perl.scm:977 +#: gnu/packages/perl.scm:1133 msgid "" "Config::AutoConf is intended to provide the same\n" "opportunities to Perl developers as GNU Autoconf does for Shell developers." msgstr "" -#: gnu/packages/perl.scm:995 +#: gnu/packages/perl.scm:1151 msgid "Generic Config Module" msgstr "" -#: gnu/packages/perl.scm:996 +#: gnu/packages/perl.scm:1152 msgid "" "This module opens a config file and parses its contents for\n" "you. The format of config files supported by Config::General is inspired by\n" @@ -6217,42 +8246,52 @@ msgid "" "options." msgstr "" -#: gnu/packages/perl.scm:1022 +#: gnu/packages/perl.scm:1179 +msgid "Simple .ini-file format reader and writer" +msgstr "" + +#: gnu/packages/perl.scm:1180 +msgid "" +"@code{Config::INI} is a module that facilates the reading\n" +"and writing of @code{.ini}-style configuration files." +msgstr "" + +#: gnu/packages/perl.scm:1201 msgid "Preserve context during subroutine call" msgstr "" -#: gnu/packages/perl.scm:1023 +#: gnu/packages/perl.scm:1202 msgid "" "This module runs code after a subroutine call, preserving\n" "the context the subroutine would have seen if it were the last statement in\n" "the caller." msgstr "" -#: gnu/packages/perl.scm:1044 +#: gnu/packages/perl.scm:1223 msgid "Verify requirements in a CPAN::Meta object" msgstr "" -#: gnu/packages/perl.scm:1045 +#: gnu/packages/perl.scm:1224 msgid "" "This module verifies if requirements described in a\n" "CPAN::Meta object are present." msgstr "" -#: gnu/packages/perl.scm:1065 +#: gnu/packages/perl.scm:1244 msgid "JSON::XS for Cpanel" msgstr "" -#: gnu/packages/perl.scm:1066 gnu/packages/perl.scm:2841 +#: gnu/packages/perl.scm:1245 gnu/packages/perl.scm:3537 msgid "" "This module converts Perl data structures to JSON and vice\n" "versa." msgstr "" -#: gnu/packages/perl.scm:1084 +#: gnu/packages/perl.scm:1263 msgid "Random password generator" msgstr "" -#: gnu/packages/perl.scm:1085 +#: gnu/packages/perl.scm:1264 msgid "" "Crypt::RandPasswd provides three functions that can be used\n" "to generate random passwords, constructed from words, letters, or characters.\n" @@ -6263,51 +8302,72 @@ msgid "" "Password Generator\"." msgstr "" -#: gnu/packages/perl.scm:1128 +#: gnu/packages/perl.scm:1307 msgid "Library for genomic analysis" msgstr "" -#: gnu/packages/perl.scm:1129 +#: gnu/packages/perl.scm:1308 msgid "" "Chaolin Zhang's Perl Library (czplib) contains assorted\n" "functions and data structures for processing and analysing genomic and\n" "bioinformatics data." msgstr "" -#: gnu/packages/perl.scm:1148 +#: gnu/packages/perl.scm:1329 +msgid "Compare Perl data structures" +msgstr "Sammenlign Perldatastrukturer" + +#: gnu/packages/perl.scm:1330 +msgid "" +"This module compares arbitrary data structures to see if\n" +"they are copies of each other." +msgstr "" + +#: gnu/packages/perl.scm:1348 +msgid "Perl extension for generating unique identifiers" +msgstr "" + +#: gnu/packages/perl.scm:1349 +msgid "" +"@code{Data::Uniqid} provides three simple routines for\n" +"generating unique ids. These ids are coded with a Base62 systen to make them\n" +"short and handy (e.g. to use it as part of a URL)." +msgstr "" + +#: gnu/packages/perl.scm:1368 msgid "Pretty printing of data structures" msgstr "" -#: gnu/packages/perl.scm:1149 +#: gnu/packages/perl.scm:1369 msgid "" "This module provide functions that takes a list of values as\n" "their argument and produces a string as its result. The string contains Perl\n" "code that, when \"eval\"ed, produces a deep copy of the original arguments." msgstr "" -#: gnu/packages/perl.scm:1168 +#: gnu/packages/perl.scm:1388 msgid "Concise data dumper" msgstr "" -#: gnu/packages/perl.scm:1169 +#: gnu/packages/perl.scm:1389 msgid "" "Data::Dumper::Concise provides a dumper with Less\n" "indentation and newlines plus sub deparsing." msgstr "" -#: gnu/packages/perl.scm:1191 +#: gnu/packages/perl.scm:1411 msgid "Parse and validate simple name/value option pairs" msgstr "" -#: gnu/packages/perl.scm:1193 +#: gnu/packages/perl.scm:1413 msgid "Data::OptList provides a simple syntax for name/value option pairs." msgstr "" -#: gnu/packages/perl.scm:1215 +#: gnu/packages/perl.scm:1435 msgid "Help when paging through sets of results" msgstr "" -#: gnu/packages/perl.scm:1216 +#: gnu/packages/perl.scm:1436 msgid "" "When searching through large amounts of data, it is often\n" "the case that a result set is returned that is larger than we want to display\n" @@ -6315,11 +8375,11 @@ msgid "" "The maths behind this is unfortunately fiddly, hence this module." msgstr "" -#: gnu/packages/perl.scm:1238 +#: gnu/packages/perl.scm:1458 msgid "Structured tags datastructures" msgstr "" -#: gnu/packages/perl.scm:1240 +#: gnu/packages/perl.scm:1460 msgid "" "This module is for manipulating data as hierarchical tag/value\n" "pairs (Structured TAGs or Simple Tree AGgregates). These datastructures can\n" @@ -6327,11 +8387,11 @@ msgid "" "Perl." msgstr "" -#: gnu/packages/perl.scm:1267 +#: gnu/packages/perl.scm:1487 msgid "N at a time iteration API" msgstr "" -#: gnu/packages/perl.scm:1268 +#: gnu/packages/perl.scm:1488 msgid "" "This module tries to find middle ground between one at a\n" "time and all at once processing of data sets. The purpose of this module is\n" @@ -6340,21 +8400,21 @@ msgid "" "necessary later on." msgstr "" -#: gnu/packages/perl.scm:1293 +#: gnu/packages/perl.scm:1513 msgid "Dynamic generation of nested combinations of variants" msgstr "" -#: gnu/packages/perl.scm:1294 +#: gnu/packages/perl.scm:1514 msgid "" "Data::Tumbler - Dynamic generation of nested combinations of\n" "variants." msgstr "" -#: gnu/packages/perl.scm:1320 +#: gnu/packages/perl.scm:1540 msgid "Visitor style traversal of Perl data structures" msgstr "" -#: gnu/packages/perl.scm:1321 +#: gnu/packages/perl.scm:1541 msgid "" "This module is a simple visitor implementation for Perl\n" "values. It has a main dispatcher method, visit, which takes a single perl\n" @@ -6364,11 +8424,11 @@ msgid "" "structures, and all ref types (hashes, arrays, scalars, code, globs)." msgstr "" -#: gnu/packages/perl.scm:1346 +#: gnu/packages/perl.scm:1566 msgid "Gregorian calendar date calculations" msgstr "" -#: gnu/packages/perl.scm:1347 +#: gnu/packages/perl.scm:1567 msgid "" "This package consists of a Perl module for date calculations\n" "based on the Gregorian calendar, thereby complying with all relevant norms and\n" @@ -6376,43 +8436,67 @@ msgid "" "applicable)." msgstr "" -#: gnu/packages/perl.scm:1371 +#: gnu/packages/perl.scm:1591 msgid "XS wrapper for Date::Calc" msgstr "" -#: gnu/packages/perl.scm:1372 +#: gnu/packages/perl.scm:1592 msgid "" "Date::Calc::XS is an XS wrapper and C library plug-in for\n" "Date::Calc." msgstr "" -#: gnu/packages/perl.scm:1396 +#: gnu/packages/perl.scm:1616 msgid "Date manipulation routines" msgstr "" -#: gnu/packages/perl.scm:1397 +#: gnu/packages/perl.scm:1617 msgid "" "Date::Manip is a series of modules for common date/time\n" "operations, such as comparing two times, determining a date a given amount of\n" "time from another, or parsing international times." msgstr "" -#: gnu/packages/perl.scm:1425 +#: gnu/packages/perl.scm:1636 +msgid "Simple date handling" +msgstr "" + +#: gnu/packages/perl.scm:1637 +msgid "" +"Dates are complex enough without times and timezones. This\n" +"module may be used to create simple date objects. It handles validation,\n" +"interval arithmetic, and day-of-week calculation. It does not deal with\n" +"hours, minutes, seconds, and time zones." +msgstr "" + +#: gnu/packages/perl.scm:1667 msgid "Date and time object for Perl" msgstr "" -#: gnu/packages/perl.scm:1426 +#: gnu/packages/perl.scm:1668 msgid "" "DateTime is a class for the representation of date/time\n" "combinations. It represents the Gregorian calendar, extended backwards in\n" "time before its creation (in 1582)." msgstr "" -#: gnu/packages/perl.scm:1451 +#: gnu/packages/perl.scm:1690 +msgid "Dates in the Julian calendar" +msgstr "" + +#: gnu/packages/perl.scm:1691 +msgid "" +"This package is a companion module to @code{DateTime.pm}.\n" +"It implements the Julian calendar. It supports everything that\n" +"@code{DateTime.pm} supports and more: about one day per century more, to be\n" +"precise." +msgstr "" + +#: gnu/packages/perl.scm:1717 msgid "DateTime set objects" msgstr "" -#: gnu/packages/perl.scm:1452 +#: gnu/packages/perl.scm:1718 msgid "" "The DateTime::Set module provides a date/time sets\n" "implementation. It allows, for example, the generation of groups of dates,\n" @@ -6420,21 +8504,21 @@ msgid "" "within a time range." msgstr "" -#: gnu/packages/perl.scm:1475 +#: gnu/packages/perl.scm:1741 msgid "DateTime rfc2445 recurrences" msgstr "" -#: gnu/packages/perl.scm:1476 +#: gnu/packages/perl.scm:1742 msgid "" "This module provides convenience methods that let you easily\n" "create DateTime::Set objects for RFC 2445 style recurrences." msgstr "" -#: gnu/packages/perl.scm:1497 +#: gnu/packages/perl.scm:1763 msgid "DateTime::Set extension for basic recurrences" msgstr "" -#: gnu/packages/perl.scm:1498 +#: gnu/packages/perl.scm:1764 msgid "" "This module provides convenience methods that let you easily\n" "create DateTime::Set objects for various recurrences, such as \"once a month\"\n" @@ -6442,11 +8526,11 @@ msgid "" "\"every Monday, Wednesday and Thursday at 10:00 AM and 2:00 PM\"." msgstr "" -#: gnu/packages/perl.scm:1523 +#: gnu/packages/perl.scm:1789 msgid "Create DateTime parser classes and objects" msgstr "" -#: gnu/packages/perl.scm:1524 +#: gnu/packages/perl.scm:1790 msgid "" "DateTime::Format::Builder creates DateTime parsers. Many\n" "string formats of dates and times are simple and just require a basic regular\n" @@ -6454,43 +8538,43 @@ msgid "" "to do this without writing reams of structural code." msgstr "" -#: gnu/packages/perl.scm:1551 +#: gnu/packages/perl.scm:1817 msgid "Parse data/time strings" msgstr "" -#: gnu/packages/perl.scm:1552 +#: gnu/packages/perl.scm:1818 msgid "" "DateTime::Format::Flexible attempts to take any string you\n" "give it and parse it into a DateTime object." msgstr "" -#: gnu/packages/perl.scm:1578 +#: gnu/packages/perl.scm:1844 msgid "Parse and format iCal datetime and duration strings" msgstr "" -#: gnu/packages/perl.scm:1579 +#: gnu/packages/perl.scm:1845 msgid "" "This module understands the ICal date/time and duration\n" "formats, as defined in RFC 2445. It can be used to parse these formats in\n" "order to create the appropriate objects." msgstr "" -#: gnu/packages/perl.scm:1611 +#: gnu/packages/perl.scm:1877 msgid "Machine-readable date/time with natural parsing" msgstr "" -#: gnu/packages/perl.scm:1612 +#: gnu/packages/perl.scm:1878 msgid "" "DateTime::Format::Natural takes a string with a human\n" "readable date/time and creates a machine readable one by applying natural\n" "parsing logic." msgstr "" -#: gnu/packages/perl.scm:1636 +#: gnu/packages/perl.scm:1902 msgid "Parse and format strp and strf time patterns" msgstr "" -#: gnu/packages/perl.scm:1637 +#: gnu/packages/perl.scm:1903 msgid "" "This module implements most of `strptime(3)`, the POSIX\n" "function that is the reverse of `strftime(3)`, for `DateTime`. While\n" @@ -6498,21 +8582,21 @@ msgid "" "takes a string and a pattern and returns the `DateTime` object associated." msgstr "" -#: gnu/packages/perl.scm:1662 +#: gnu/packages/perl.scm:1928 msgid "Localization support for DateTime.pm" msgstr "" -#: gnu/packages/perl.scm:1663 +#: gnu/packages/perl.scm:1929 msgid "" "The DateTime::Locale modules provide localization data for\n" "the DateTime.pm class." msgstr "" -#: gnu/packages/perl.scm:1690 +#: gnu/packages/perl.scm:1956 msgid "Time zone object for Perl" msgstr "" -#: gnu/packages/perl.scm:1691 +#: gnu/packages/perl.scm:1957 msgid "" "This class is the base class for all time zone objects. A\n" "time zone is represented internally as a set of observances, each of which\n" @@ -6522,81 +8606,103 @@ msgid "" "DateTime::TimeZone methods." msgstr "" -#: gnu/packages/perl.scm:1721 +#: gnu/packages/perl.scm:1987 msgid "Parse date/time strings" msgstr "" -#: gnu/packages/perl.scm:1722 +#: gnu/packages/perl.scm:1988 msgid "" "DateTimeX::Easy uses a variety of DateTime::Format packages\n" "to create DateTime objects, with some custom tweaks to smooth out the rough\n" "edges (mainly concerning timezone detection and selection)." msgstr "" -#: gnu/packages/perl.scm:1743 +#: gnu/packages/perl.scm:2009 +msgid "Convert between DateTime and RFC2822/822 formats" +msgstr "" + +#: gnu/packages/perl.scm:2010 +msgid "" +"RFCs 2822 and 822 specify date formats to be used by email.\n" +"This module parses and emits such dates." +msgstr "" + +#: gnu/packages/perl.scm:2032 +msgid "Parse and format W3CDTF datetime strings" +msgstr "" + +#: gnu/packages/perl.scm:2034 +msgid "" +"This module understands the W3CDTF date/time format, an ISO 8601 profile,\n" +"defined at https://www.w3.org/TR/NOTE-datetime. This format is the native date\n" +"format of RSS 1.0. It can be used to parse these formats in order to create\n" +"the appropriate objects." +msgstr "" + +#: gnu/packages/perl.scm:2056 msgid "Meatier version of caller" msgstr "" -#: gnu/packages/perl.scm:1744 +#: gnu/packages/perl.scm:2057 msgid "Devel::Caller provides meatier version of caller." msgstr "" -#: gnu/packages/perl.scm:1762 +#: gnu/packages/perl.scm:2075 msgid "Check that a command is available" msgstr "" -#: gnu/packages/perl.scm:1763 +#: gnu/packages/perl.scm:2076 msgid "" "Devel::CheckBin is a perl module that checks whether a\n" "particular command is available." msgstr "" -#: gnu/packages/perl.scm:1783 +#: gnu/packages/perl.scm:2096 msgid "Provides equivalent of ${^GLOBAL_PHASE} eq 'DESTRUCT' for older perls" msgstr "" -#: gnu/packages/perl.scm:1784 +#: gnu/packages/perl.scm:2097 msgid "" "Devel::GlobalDestruction provides a function returning the\n" "equivalent of \"$@{^GLOBAL_PHASE@} eq 'DESTRUCT'\" for older perls." msgstr "" -#: gnu/packages/perl.scm:1804 +#: gnu/packages/perl.scm:2117 msgid "Alias lexical variables" msgstr "" -#: gnu/packages/perl.scm:1805 +#: gnu/packages/perl.scm:2118 msgid "" "Devel::LexAlias provides the ability to alias a lexical\n" "variable in a subroutines scope to one of your choosing." msgstr "" -#: gnu/packages/perl.scm:1827 +#: gnu/packages/perl.scm:2140 msgid "Introspect overloaded operators" msgstr "" -#: gnu/packages/perl.scm:1828 +#: gnu/packages/perl.scm:2141 msgid "" "Devel::OverloadInfo returns information about overloaded\n" "operators for a given class (or object), including where in the inheritance\n" "hierarchy the overloads are declared and where the code implementing it is." msgstr "" -#: gnu/packages/perl.scm:1855 +#: gnu/packages/perl.scm:2168 msgid "Partial dumping of data structures" msgstr "" -#: gnu/packages/perl.scm:1856 +#: gnu/packages/perl.scm:2169 msgid "" "This module is a data dumper optimized for logging of\n" "arbitrary parameters." msgstr "" -#: gnu/packages/perl.scm:1874 +#: gnu/packages/perl.scm:2187 msgid "Object representing a stack trace" msgstr "" -#: gnu/packages/perl.scm:1875 +#: gnu/packages/perl.scm:2188 msgid "" "The Devel::StackTrace module contains two classes,\n" "Devel::StackTrace and Devel::StackTrace::Frame. These objects encapsulate the\n" @@ -6604,11 +8710,11 @@ msgid "" "providing a simple interface to this data." msgstr "" -#: gnu/packages/perl.scm:1897 +#: gnu/packages/perl.scm:2210 msgid "Displays stack trace in HTML" msgstr "" -#: gnu/packages/perl.scm:1898 +#: gnu/packages/perl.scm:2211 msgid "" "Devel::StackTrace::AsHTML adds as_html method to\n" "Devel::StackTrace which displays the stack trace in beautiful HTML, with code\n" @@ -6617,49 +8723,117 @@ msgid "" "each stack frame." msgstr "" -#: gnu/packages/perl.scm:1919 +#: gnu/packages/perl.scm:2232 msgid "Dump symbol names or the symbol table" msgstr "" -#: gnu/packages/perl.scm:1920 +#: gnu/packages/perl.scm:2233 msgid "Devel::Symdump provides access to the perl symbol table." msgstr "" -#: gnu/packages/perl.scm:1937 +#: gnu/packages/perl.scm:2250 msgid "Keyed-Hashing for Message Authentication" msgstr "" -#: gnu/packages/perl.scm:1938 +#: gnu/packages/perl.scm:2251 msgid "" "The Digest::HMAC module follows the common Digest::\n" "interface for the RFC 2104 HMAC mechanism." msgstr "" -#: gnu/packages/perl.scm:1954 +#: gnu/packages/perl.scm:2276 +msgid "Perl interface to the MD-5 algorithm" +msgstr "Perlgrænseflade til MD-5-algoritmen" + +#: gnu/packages/perl.scm:2278 +msgid "" +"The @code{Digest::MD5} module allows you to use the MD5 Message Digest\n" +"algorithm from within Perl programs. The algorithm takes as\n" +"input a message of arbitrary length and produces as output a\n" +"128-bit \"fingerprint\" or \"message digest\" of the input." +msgstr "" + +#: gnu/packages/perl.scm:2296 msgid "Perl implementation of the SHA-1 message digest algorithm" msgstr "" -#: gnu/packages/perl.scm:1956 +#: gnu/packages/perl.scm:2298 msgid "" "This package provides 'Digest::SHA1', an implementation of the NIST\n" "SHA-1 message digest algorithm for use by Perl programs." msgstr "" -#: gnu/packages/perl.scm:1978 +#: gnu/packages/perl.scm:2320 msgid "Declare version conflicts for your dist" msgstr "" -#: gnu/packages/perl.scm:1979 +#: gnu/packages/perl.scm:2321 msgid "" "This module allows you to specify conflicting versions of\n" "modules separately and deal with them after the module is done installing." msgstr "" -#: gnu/packages/perl.scm:1997 +#: gnu/packages/perl.scm:2341 +msgid "Detect the encoding of data" +msgstr "" + +#: gnu/packages/perl.scm:2342 +msgid "" +"This package provides a class @code{Encode::Detect} to detect\n" +"the encoding of data." +msgstr "" + +#: gnu/packages/perl.scm:2360 +msgid "ASCII mapping for eucJP encoding" +msgstr "ASCII-oversættelse for eucJP-kodning" + +#: gnu/packages/perl.scm:2361 +msgid "" +"This package provides an ASCII mapping for the eucJP\n" +"encoding." +msgstr "" +"Denne pakke tilbyder en ASCII-oversættelse for eucJP-\n" +"kodningen." + +#: gnu/packages/perl.scm:2379 +msgid "JIS X 0212 (aka JIS 2000) encodings" +msgstr "JIS X 0212-kodninger (aka JIS 2000)" + +#: gnu/packages/perl.scm:2380 +msgid "" +"This package provides encodings for JIS X 0212, which is\n" +"also known as JIS 2000." +msgstr "" + +#: gnu/packages/perl.scm:2398 +msgid "Additional Chinese encodings" +msgstr "Yderligere kinesiske kodninger" + +#: gnu/packages/perl.scm:2399 +msgid "" +"This Perl module provides Chinese encodings that are not\n" +"part of Perl by default, including \"BIG5-1984\", \"BIG5-2003\", \"BIG5PLUS\",\n" +"\"BIG5EXT\", \"CCCII\", \"EUC-TW\", \"CNS11643-*\", \"GB18030\", and\n" +"\"UNISYS\"." +msgstr "" + +#: gnu/packages/perl.scm:2421 +msgid "Advanced operations on path variables" +msgstr "" + +#: gnu/packages/perl.scm:2422 +msgid "" +"@code{Env::Path} presents an object-oriented interface to\n" +"path variables, defined as that subclass of environment variables which name\n" +"an ordered list of file system elements separated by a platform-standard\n" +"separator." +msgstr "" + +#: gnu/packages/perl.scm:2442 msgid "OO-ish Error/Exception handling for Perl" msgstr "" -#: gnu/packages/perl.scm:1998 +#: gnu/packages/perl.scm:2443 msgid "" "The Error package provides two interfaces. Firstly Error\n" "provides a procedural interface to exception handling. Secondly Error is a\n" @@ -6667,11 +8841,11 @@ msgid "" "catch, or can simply be recorded." msgstr "" -#: gnu/packages/perl.scm:2023 +#: gnu/packages/perl.scm:2468 msgid "Safely and cleanly create closures via string eval" msgstr "" -#: gnu/packages/perl.scm:2024 +#: gnu/packages/perl.scm:2469 msgid "" "String eval is often used for dynamic code generation. For\n" "instance, Moose uses it heavily, to generate inlined versions of accessors and\n" @@ -6685,32 +8859,32 @@ msgid "" "errors are rethrown automatically." msgstr "" -#: gnu/packages/perl.scm:2053 +#: gnu/packages/perl.scm:2498 msgid "Allows you to declare real exception classes in Perl" msgstr "" -#: gnu/packages/perl.scm:2054 +#: gnu/packages/perl.scm:2499 msgid "" "Exception::Class allows you to declare exception hierarchies\n" "in your modules in a \"Java-esque\" manner." msgstr "" -#: gnu/packages/perl.scm:2070 +#: gnu/packages/perl.scm:2515 msgid "Lightweight exporting of functions and variables" msgstr "" -#: gnu/packages/perl.scm:2072 +#: gnu/packages/perl.scm:2517 msgid "" "Exporter::Lite is an alternative to Exporter, intended to provide a\n" "lightweight subset of the most commonly-used functionality. It supports\n" "import(), @@EXPORT and @@EXPORT_OK and not a whole lot else." msgstr "" -#: gnu/packages/perl.scm:2093 +#: gnu/packages/perl.scm:2537 msgid "Exporter with the features of Sub::Exporter but only core dependencies" msgstr "" -#: gnu/packages/perl.scm:2094 +#: gnu/packages/perl.scm:2538 msgid "" "Exporter::Tiny supports many of Sub::Exporter's\n" "external-facing features including renaming imported functions with the `-as`,\n" @@ -6719,85 +8893,109 @@ msgid "" "only about 40% as many lines of code and with zero non-core dependencies." msgstr "" -#: gnu/packages/perl.scm:2117 +#: gnu/packages/perl.scm:2561 msgid "Build.PL install path logic made easy" msgstr "" -#: gnu/packages/perl.scm:2118 +#: gnu/packages/perl.scm:2562 msgid "" "This module tries to make install path resolution as easy as\n" "possible." msgstr "" -#: gnu/packages/perl.scm:2136 +#: gnu/packages/perl.scm:2580 msgid "Wrapper for perl's configuration" msgstr "" -#: gnu/packages/perl.scm:2137 +#: gnu/packages/perl.scm:2581 msgid "" "ExtUtils::Config is an abstraction around the %Config hash.\n" "By itself it is not a particularly interesting module by any measure, however\n" "it ties together a family of modern toolchain modules." msgstr "" -#: gnu/packages/perl.scm:2156 +#: gnu/packages/perl.scm:2600 msgid "Various portability utilities for module builders" msgstr "" -#: gnu/packages/perl.scm:2157 +#: gnu/packages/perl.scm:2601 msgid "" "This module provides various portable helper functions for\n" "module building modules." msgstr "" -#: gnu/packages/perl.scm:2187 +#: gnu/packages/perl.scm:2621 +msgid "Tool to build C libraries" +msgstr "" + +#: gnu/packages/perl.scm:2622 +msgid "" +"Some Perl modules need to ship C libraries together with\n" +"their Perl code. Although there are mechanisms to compile and link (or glue)\n" +"C code in your Perl programs, there isn't a clear method to compile standard,\n" +"self-contained C libraries. This module main goal is to help in that task." +msgstr "" + +#: gnu/packages/perl.scm:2654 msgid "Watch for changes to files" msgstr "" -#: gnu/packages/perl.scm:2188 +#: gnu/packages/perl.scm:2655 msgid "" "This module provides a class to monitor a directory for\n" "changes made to any file." msgstr "" -#: gnu/packages/perl.scm:2206 +#: gnu/packages/perl.scm:2673 msgid "Recursively copy files and directories" msgstr "" -#: gnu/packages/perl.scm:2207 +#: gnu/packages/perl.scm:2674 msgid "" "This module has 3 functions: one to copy files only, one to\n" "copy directories only, and one to do either depending on the argument's\n" "type." msgstr "" -#: gnu/packages/perl.scm:2229 +#: gnu/packages/perl.scm:2696 msgid "Alternative interface to File::Find" msgstr "" -#: gnu/packages/perl.scm:2230 +#: gnu/packages/perl.scm:2697 msgid "" "File::Find::Rule is a friendlier interface to File::Find.\n" "It allows you to build rules which specify the desired files and\n" "directories." msgstr "" -#: gnu/packages/perl.scm:2253 +#: gnu/packages/perl.scm:2720 msgid "Common rules for searching for Perl things" msgstr "" -#: gnu/packages/perl.scm:2254 +#: gnu/packages/perl.scm:2721 msgid "" "File::Find::Rule::Perl provides methods for finding various\n" "types Perl-related files, or replicating search queries run on a distribution\n" "in various parts of the CPAN ecosystem." msgstr "" -#: gnu/packages/perl.scm:2277 +#: gnu/packages/perl.scm:2742 +msgid "Matches patterns in a series of files" +msgstr "" + +#: gnu/packages/perl.scm:2743 +msgid "" +"@code{File::Grep} provides similar functionality as perl's\n" +"builtin @code{grep}, @code{map}, and @code{foreach} commands, but iterating\n" +"over a passed filelist instead of arrays. While trivial, this module can\n" +"provide a quick dropin when such functionality is needed." +msgstr "" + +#: gnu/packages/perl.scm:2767 msgid "Find your home and other directories on any platform" msgstr "" -#: gnu/packages/perl.scm:2278 +#: gnu/packages/perl.scm:2768 msgid "" "File::HomeDir is a module for locating the directories that\n" "are \"owned\" by a user (typically your user) and to solve the various issues\n" @@ -6805,24 +9003,35 @@ msgid "" "platforms." msgstr "" -#: gnu/packages/perl.scm:2305 +#: gnu/packages/perl.scm:2790 +msgid "Create or remove directory trees" +msgstr "" + +#: gnu/packages/perl.scm:2791 +msgid "" +"This module provide a convenient way to create directories\n" +"of arbitrary depth and to delete an entire directory subtree from the\n" +"file system." +msgstr "" + +#: gnu/packages/perl.scm:2817 msgid "" "Perl extension for crawling directory trees and compiling\n" "lists of files" msgstr "" -#: gnu/packages/perl.scm:2308 +#: gnu/packages/perl.scm:2820 msgid "" "The File::List module crawls the directory tree starting at the\n" "provided base directory and can return files (and/or directories if desired)\n" "matching a regular expression." msgstr "" -#: gnu/packages/perl.scm:2327 +#: gnu/packages/perl.scm:2839 msgid "Remove files and directories in Perl" msgstr "" -#: gnu/packages/perl.scm:2328 +#: gnu/packages/perl.scm:2840 msgid "" "File::Remove::remove removes files and directories. It acts\n" "like /bin/rm, for the most part. Although \"unlink\" can be given a list of\n" @@ -6830,11 +9039,11 @@ msgid "" "accepts wildcards, * and ?, as arguments for file names." msgstr "" -#: gnu/packages/perl.scm:2352 +#: gnu/packages/perl.scm:2864 msgid "Locate per-dist and per-module shared files" msgstr "" -#: gnu/packages/perl.scm:2353 +#: gnu/packages/perl.scm:2865 msgid "" "The intent of File::ShareDir is to provide a companion to\n" "Class::Inspector and File::HomeDir. Quite often you want or need your Perl\n" @@ -6844,62 +9053,101 @@ msgid "" "the installation." msgstr "" -#: gnu/packages/perl.scm:2375 +#: gnu/packages/perl.scm:2887 msgid "Install shared files" msgstr "" -#: gnu/packages/perl.scm:2376 +#: gnu/packages/perl.scm:2888 msgid "" "File::ShareDir::Install allows you to install read-only data\n" "files from a distribution. It is a companion module to File::ShareDir, which\n" "allows you to locate these files after installation." msgstr "" -#: gnu/packages/perl.scm:2395 +#: gnu/packages/perl.scm:2907 msgid "Reading/Writing/Modifying of complete files" msgstr "" -#: gnu/packages/perl.scm:2396 +#: gnu/packages/perl.scm:2908 msgid "" "File::Slurp provides subroutines to read or write entire\n" "files with a simple call. It also has a subroutine for reading the list of\n" "file names in a directory." msgstr "" -#: gnu/packages/perl.scm:2414 +#: gnu/packages/perl.scm:2931 +msgid "Simple, sane and efficient module to slurp a file" +msgstr "" + +#: gnu/packages/perl.scm:2932 +msgid "" +"This module provides functions for fast and correct file\n" +"slurping and spewing. All functions are optionally exported." +msgstr "" + +#: gnu/packages/perl.scm:2949 msgid "Simple file reader and writer" msgstr "" -#: gnu/packages/perl.scm:2416 +#: gnu/packages/perl.scm:2951 msgid "This module provides functions for fast reading and writing of files." msgstr "" -#: gnu/packages/perl.scm:2435 +#: gnu/packages/perl.scm:2970 msgid "Return name and handle of a temporary file safely" msgstr "" -#: gnu/packages/perl.scm:2436 +#: gnu/packages/perl.scm:2971 msgid "" "File::Temp can be used to create and open temporary files in\n" "a safe way." msgstr "" -#: gnu/packages/perl.scm:2453 +#: gnu/packages/perl.scm:2988 msgid "Portable implementation of the `which' utility" msgstr "" -#: gnu/packages/perl.scm:2455 +#: gnu/packages/perl.scm:2990 msgid "" "File::Which was created to be able to get the paths to executable\n" "programs on systems under which the `which' program wasn't implemented in the\n" "shell." msgstr "" -#: gnu/packages/perl.scm:2482 +#: gnu/packages/perl.scm:3011 +msgid "Extended Unix style glob functionality" +msgstr "" + +#: gnu/packages/perl.scm:3012 +msgid "" +"@code{File::Zglob} provides a traditional Unix @code{glob}\n" +"functionality; it returns a list of file names that match the given pattern.\n" +"For instance, it supports the @code{**/*.pm} form." +msgstr "" + +#: gnu/packages/perl.scm:3031 +msgid "Module to handle parsing command line options" +msgstr "" + +#: gnu/packages/perl.scm:3032 +msgid "" +"The @code{Getopt::Long} module implements an extended getopt\n" +"function called @code{GetOptions()}. It parses the command line from\n" +"@code{ARGV}, recognizing and removing specified options and their possible\n" +"values.\n" +"\n" +"This function adheres to the POSIX syntax for command line options, with GNU\n" +"extensions. In general, this means that options have long names instead of\n" +"single letters, and are introduced with a double dash \"--\". Support for\n" +"bundling of command line options, as was the case with the more traditional\n" +"single-letter approach, is provided but not enabled by default." +msgstr "" + +#: gnu/packages/perl.scm:3065 msgid "Getopt::Long, but simpler and more powerful" msgstr "" -#: gnu/packages/perl.scm:2483 +#: gnu/packages/perl.scm:3066 msgid "" "Getopt::Long::Descriptive is yet another Getopt library.\n" "It's built atop Getopt::Long, and gets a lot of its features, but tries to\n" @@ -6907,21 +9155,46 @@ msgid "" "usage (help) messages, data validation, and a few other useful features." msgstr "" -#: gnu/packages/perl.scm:2501 +#: gnu/packages/perl.scm:3084 msgid "Table-driven argument parsing for Perl" msgstr "" -#: gnu/packages/perl.scm:2503 +#: gnu/packages/perl.scm:3086 msgid "" "Getopt::Tabular is a Perl 5 module for table-driven argument parsing,\n" "vaguely inspired by John Ousterhout's Tk_ParseArgv." msgstr "" -#: gnu/packages/perl.scm:2523 +#: gnu/packages/perl.scm:3108 +msgid "Graph data structures and algorithms" +msgstr "" + +#: gnu/packages/perl.scm:3109 +msgid "" +"This is @code{Graph}, a Perl module for dealing with graphs,\n" +"the abstract data structures." +msgstr "" + +#: gnu/packages/perl.scm:3126 +msgid "Safe cleanup blocks implemented as guards" +msgstr "" + +#: gnu/packages/perl.scm:3127 +msgid "" +"@code{Guard} implements so-called @dfn{guards}. A guard is\n" +"something (usually an object) that \"guards\" a resource, ensuring that it is\n" +"cleaned up when expected.\n" +"\n" +"Specifically, this module supports two different types of guards: guard\n" +"objects, which execute a given code block when destroyed, and scoped guards,\n" +"which are tied to the scope exit." +msgstr "" + +#: gnu/packages/perl.scm:3150 msgid "Merge arbitrarily deep hashes into a single hash" msgstr "" -#: gnu/packages/perl.scm:2524 +#: gnu/packages/perl.scm:3151 msgid "" "Hash::Merge merges two arbitrarily deep hashes into a single\n" "hash. That is, at any level, it will add non-conflicting key-value pairs from\n" @@ -6931,21 +9204,21 @@ msgid "" "merged." msgstr "" -#: gnu/packages/perl.scm:2546 +#: gnu/packages/perl.scm:3173 msgid "Store multiple values per key" msgstr "" -#: gnu/packages/perl.scm:2547 +#: gnu/packages/perl.scm:3174 msgid "" "Hash::MultiValue is an object (and a plain hash reference)\n" "that may contain multiple values per key, inspired by MultiDict of WebOb." msgstr "" -#: gnu/packages/perl.scm:2567 +#: gnu/packages/perl.scm:3194 msgid "Import packages into other packages" msgstr "" -#: gnu/packages/perl.scm:2568 +#: gnu/packages/perl.scm:3195 msgid "" "Writing exporters is a pain. Some use Exporter, some use\n" "Sub::Exporter, some use Moose::Exporter, some use Exporter::Declare ... and\n" @@ -6955,64 +9228,89 @@ msgid "" "compilation. Import::Into provides global methods to make this painless." msgstr "" -#: gnu/packages/perl.scm:2590 +#: gnu/packages/perl.scm:3217 msgid "Use modules in inc/ if newer than installed" msgstr "" -#: gnu/packages/perl.scm:2591 +#: gnu/packages/perl.scm:3218 msgid "" "The inc::latest module helps bootstrap configure-time\n" "dependencies for CPAN distributions. These dependencies get bundled into the\n" "inc directory within a distribution and are used by Makefile.PL or Build.PL." msgstr "" -#: gnu/packages/perl.scm:2610 +#: gnu/packages/perl.scm:3239 +msgid "Capture STDOUT and STDERR from Perl code, subprocesses or XS" +msgstr "" + +#: gnu/packages/perl.scm:3240 +msgid "" +"@code{IO::CaptureOutput} provides routines for capturing\n" +"@code{STDOUT} and @code{STDERR} from perl subroutines, forked system\n" +"calls (e.g. @code{system()}, @code{fork()}) and from XS or C modules.\n" +"\n" +"This module is no longer recommended by its maintainer. Users are advised to\n" +"try @code{Capture::Tiny} instead." +msgstr "" + +#: gnu/packages/perl.scm:3262 msgid "Utilities for interactive I/O" msgstr "" -#: gnu/packages/perl.scm:2611 +#: gnu/packages/perl.scm:3263 msgid "" "This module provides three utility subroutines that make it\n" "easier to develop interactive applications: is_interactive(), interactive(),\n" "and busy()." msgstr "" -#: gnu/packages/perl.scm:2630 +#: gnu/packages/perl.scm:3282 msgid "Emulate file interface for in-core strings" msgstr "" -#: gnu/packages/perl.scm:2631 +#: gnu/packages/perl.scm:3283 msgid "" "IO::String is an IO::File (and IO::Handle) compatible class\n" "that reads or writes data from in-core strings." msgstr "" -#: gnu/packages/perl.scm:2649 +#: gnu/packages/perl.scm:3301 msgid "IO:: interface for reading/writing an array of lines" msgstr "" -#: gnu/packages/perl.scm:2650 +#: gnu/packages/perl.scm:3302 msgid "" "This toolkit primarily provides modules for performing both\n" "traditional and object-oriented i/o) on things *other* than normal\n" "filehandles; in particular, IO::Scalar, IO::ScalarArray, and IO::Lines." msgstr "" -#: gnu/packages/perl.scm:2668 +#: gnu/packages/perl.scm:3320 msgid "Perl interface to pseudo ttys" msgstr "" -#: gnu/packages/perl.scm:2670 +#: gnu/packages/perl.scm:3322 msgid "" "This package provides the 'IO::Pty' and 'IO::Tty' Perl interfaces to\n" "pseudo ttys." msgstr "" -#: gnu/packages/perl.scm:2698 +#: gnu/packages/perl.scm:3340 +msgid "Run interactive command-line programs" +msgstr "" + +#: gnu/packages/perl.scm:3341 +msgid "" +"@code{IPC::Cmd} allows for the searching and execution of\n" +"any binary on your system. It adheres to verbosity settings and is able to\n" +"run interactively. It also has an option to capture output/error buffers." +msgstr "" + +#: gnu/packages/perl.scm:3370 msgid "Run system() and background procs w/ piping, redirs, ptys" msgstr "" -#: gnu/packages/perl.scm:2699 +#: gnu/packages/perl.scm:3371 msgid "" "IPC::Run allows you run and interact with child processes\n" "using files, pipes, and pseudo-ttys. Both system()-style and scripted usages\n" @@ -7020,11 +9318,11 @@ msgid "" "both supported and may be mixed." msgstr "" -#: gnu/packages/perl.scm:2717 +#: gnu/packages/perl.scm:3389 msgid "Run a subprocess with input/output redirection" msgstr "" -#: gnu/packages/perl.scm:2719 +#: gnu/packages/perl.scm:3391 msgid "" "The IPC::Run3 module allows you to run a subprocess and redirect stdin,\n" "stdout, and/or stderr to files and perl data structures. It aims to satisfy\n" @@ -7032,31 +9330,46 @@ msgid "" "Perlish API and none of the bloat and rarely used features of IPC::Run." msgstr "" -#: gnu/packages/perl.scm:2743 +#: gnu/packages/perl.scm:3415 msgid "Lightweight interface to shared memory" msgstr "" -#: gnu/packages/perl.scm:2744 +#: gnu/packages/perl.scm:3416 msgid "" "IPC::ShareLite provides a simple interface to shared memory,\n" "allowing data to be efficiently communicated between processes." msgstr "" -#: gnu/packages/perl.scm:2764 +#: gnu/packages/perl.scm:3434 +msgid "Run commands simply, with detailed diagnostics" +msgstr "" + +#: gnu/packages/perl.scm:3435 +msgid "" +"Calling Perl's in-built @code{system} function is easy,\n" +"determining if it was successful is hard. Let's face it, @code{$?} isn't the\n" +"nicest variable in the world to play with, and even if you do check it,\n" +"producing a well-formatted error string takes a lot of work.\n" +"\n" +"@code{IPC::System::Simple} takes the hard work out of calling external\n" +"commands." +msgstr "" + +#: gnu/packages/perl.scm:3460 msgid "JSON encoder/decoder for Perl" msgstr "" -#: gnu/packages/perl.scm:2765 +#: gnu/packages/perl.scm:3461 msgid "" "This module converts Perl data structures to JSON and vice\n" "versa using either JSON::XS or JSON::PP." msgstr "" -#: gnu/packages/perl.scm:2790 +#: gnu/packages/perl.scm:3486 msgid "Wrapper for Perl JSON classes" msgstr "" -#: gnu/packages/perl.scm:2792 +#: gnu/packages/perl.scm:3488 msgid "" "This module tries to provide a coherent API to bring together the\n" "various JSON modules currently on CPAN. This module will allow you to code to\n" @@ -7064,11 +9377,11 @@ msgid "" "installed." msgstr "" -#: gnu/packages/perl.scm:2816 +#: gnu/packages/perl.scm:3512 msgid "Cpanel::JSON::XS with fallback" msgstr "" -#: gnu/packages/perl.scm:2817 +#: gnu/packages/perl.scm:3513 msgid "" "This module first checks to see if either Cpanel::JSON::XS\n" "or JSON::XS is already loaded, in which case it uses that module. Otherwise\n" @@ -7076,15 +9389,58 @@ msgid "" "either uses the first module it finds or throws an error." msgstr "" -#: gnu/packages/perl.scm:2840 +#: gnu/packages/perl.scm:3536 msgid "JSON serialising/deserialising for Perl" msgstr "" -#: gnu/packages/perl.scm:2860 +#: gnu/packages/perl.scm:3555 +msgid "Bringing loggers and listeners together" +msgstr "" + +#: gnu/packages/perl.scm:3556 +msgid "" +"@code{Log::Any} provides a standard log production API for\n" +"modules. @code{Log::Any::Adapter} allows applications to choose the mechanism\n" +"for log consumption, whether screen, file or another logging mechanism like\n" +"@code{Log::Dispatch} or @code{Log::Log4perl}.\n" +"\n" +"A CPAN module uses @code{Log::Any} to get a log producer object. An\n" +"application, in turn, may choose one or more logging mechanisms via\n" +"@code{Log::Any::Adapter}, or none at all.\n" +"\n" +"@code{Log::Any} has a very tiny footprint and no dependencies beyond Perl\n" +"itself, which makes it appropriate for even small CPAN modules to use. It\n" +"defaults to 'null' logging activity, so a module can safely log without\n" +"worrying about whether the application has chosen (or will ever choose) a\n" +"logging mechanism." +msgstr "" + +#: gnu/packages/perl.scm:3592 +msgid "Log::Any adapter for Log::Log4perl" +msgstr "" + +#: gnu/packages/perl.scm:3593 +msgid "" +"@code{Log::Any::Adapter::Log4perl} provides a\n" +"@code{Log::Any} adapter using @code{Log::Log4perl} for logging." +msgstr "" + +#: gnu/packages/perl.scm:3614 +msgid "Log4j implementation for Perl" +msgstr "" + +#: gnu/packages/perl.scm:3615 +msgid "" +"@code{Log::Log4perl} lets you remote-control and fine-tune\n" +"the logging behaviour of your system from the outside. It implements the\n" +"widely popular (Java-based) Log4j logging package in pure Perl." +msgstr "" + +#: gnu/packages/perl.scm:3635 msgid "Log::Report in the lightest form" msgstr "" -#: gnu/packages/perl.scm:2862 +#: gnu/packages/perl.scm:3637 msgid "" "This module allows libraries to have a dependency to a small module\n" "instead of the full Log-Report distribution. The full power of\n" @@ -7094,73 +9450,130 @@ msgid "" "version." msgstr "" -#: gnu/packages/perl.scm:2887 +#: gnu/packages/perl.scm:3662 msgid "Get messages to users and logs" msgstr "" -#: gnu/packages/perl.scm:2889 +#: gnu/packages/perl.scm:3664 msgid "" "@code{Log::Report} combines three tasks which are closely related in\n" "one: logging, exceptions, and translations." msgstr "" -#: gnu/packages/perl.scm:2912 +#: gnu/packages/perl.scm:3682 +msgid "Transliterate text between writing systems" +msgstr "" + +#: gnu/packages/perl.scm:3683 +msgid "" +"@code{Lingua::Translit} can be used to convert text from one\n" +"writing system to another, based on national or international transliteration\n" +"tables. Where possible a reverse transliteration is supported." +msgstr "" + +#: gnu/packages/perl.scm:3707 msgid "Combination of List::Util and List::MoreUtils" msgstr "" -#: gnu/packages/perl.scm:2913 +#: gnu/packages/perl.scm:3708 msgid "" "This module exports all of the functions that either\n" "List::Util or List::MoreUtils defines, with preference to List::Util." msgstr "" -#: gnu/packages/perl.scm:2937 +#: gnu/packages/perl.scm:3730 +msgid "Compare elements of two or more lists" +msgstr "" + +#: gnu/packages/perl.scm:3731 +msgid "" +"@code{List::Compare} provides a module to perform\n" +"comparative operations on two or more lists. Provided operations include\n" +"intersections, unions, unique elements, complements and many more." +msgstr "" + +#: gnu/packages/perl.scm:3756 gnu/packages/perl.scm:3783 msgid "Provide the stuff missing in List::Util" msgstr "" -#: gnu/packages/perl.scm:2938 +#: gnu/packages/perl.scm:3757 msgid "" "List::MoreUtils provides some trivial but commonly needed\n" "functionality on lists which is not going to go into List::Util." msgstr "" -#: gnu/packages/perl.scm:2956 +#: gnu/packages/perl.scm:3784 +msgid "" +"@code{List::SomeUtils} provides some trivial but commonly\n" +"needed functionality on lists which is not going to go into @code{List::Util}.\n" +"\n" +"All of the below functions are implementable in only a couple of lines of Perl\n" +"code. Using the functions from this module however should give slightly\n" +"better performance as everything is implemented in C. The pure-Perl\n" +"implementation of these functions only serves as a fallback in case the C\n" +"portions of this module couldn't be compiled on this machine." +msgstr "" + +#: gnu/packages/perl.scm:3808 msgid "Expiry plug-in for Memoize that adds LRU cache expiration" msgstr "" -#: gnu/packages/perl.scm:2957 +#: gnu/packages/perl.scm:3809 msgid "" "This module implements an expiry policy for Memoize that\n" "follows LRU semantics, that is, the last n results, where n is specified as\n" "the argument to the CACHESIZE parameter, will be cached." msgstr "" -#: gnu/packages/perl.scm:2975 +#: gnu/packages/perl.scm:3827 msgid "Charset information for MIME messages" msgstr "" -#: gnu/packages/perl.scm:2977 +#: gnu/packages/perl.scm:3829 msgid "" "@code{MIME::Charset} provides information about character sets used for\n" "MIME messages on Internet." msgstr "" -#: gnu/packages/perl.scm:2995 +#: gnu/packages/perl.scm:3847 msgid "Definition of MIME types" msgstr "" -#: gnu/packages/perl.scm:2996 +#: gnu/packages/perl.scm:3848 msgid "" "This module provides a list of known mime-types, combined\n" "from various sources. For instance, it contains all IANA types and the\n" "knowledge of Apache." msgstr "" -#: gnu/packages/perl.scm:3025 +#: gnu/packages/perl.scm:3870 +msgid "Write your linewise code for handles; this does the rest" +msgstr "" + +#: gnu/packages/perl.scm:3871 +msgid "" +"It's boring to deal with opening files for IO, converting\n" +"strings to handle-like objects, and all that. With\n" +"@code{Mixin::Linewise::Readers} and @code{Mixin::Linewise::Writers}, you can\n" +"just write a method to handle handles, and methods for handling strings and\n" +"file names are added for you." +msgstr "" + +#: gnu/packages/perl.scm:3898 +msgid "Enable all of the features of Modern Perl with one import" +msgstr "" + +#: gnu/packages/perl.scm:3899 +msgid "" +"@code{Modern::Perl} provides a simple way to enable\n" +"multiple, by now, standard libraries in a Perl program." +msgstr "" + +#: gnu/packages/perl.scm:3927 msgid "Tiny replacement for Module::Build" msgstr "" -#: gnu/packages/perl.scm:3026 +#: gnu/packages/perl.scm:3928 msgid "" "Many Perl distributions use a Build.PL file instead of a\n" "Makefile.PL file to drive distribution configuration, build, test and\n" @@ -7170,11 +9583,11 @@ msgid "" "has less than 120, yet supports the features needed by most distributions." msgstr "" -#: gnu/packages/perl.scm:3048 +#: gnu/packages/perl.scm:3950 msgid "Find and use installed modules in a (sub)category" msgstr "" -#: gnu/packages/perl.scm:3049 +#: gnu/packages/perl.scm:3951 msgid "" "Module::Find lets you find and use modules in categories.\n" "This can be useful for auto-detecting driver or plugin modules. You can\n" @@ -7182,11 +9595,11 @@ msgid "" "subcategories." msgstr "" -#: gnu/packages/perl.scm:3075 +#: gnu/packages/perl.scm:3977 msgid "Loads alternate underlying implementations for a module" msgstr "" -#: gnu/packages/perl.scm:3076 +#: gnu/packages/perl.scm:3978 msgid "" "This module abstracts out the process of choosing one of\n" "several underlying implementations for a module. This can be used to provide\n" @@ -7195,11 +9608,11 @@ msgid "" "implementations." msgstr "" -#: gnu/packages/perl.scm:3114 +#: gnu/packages/perl.scm:4016 msgid "Standalone, extensible Perl module installer" msgstr "" -#: gnu/packages/perl.scm:3115 +#: gnu/packages/perl.scm:4017 msgid "" "Module::Install is a package for writing installers for\n" "CPAN (or CPAN-like) distributions that are clean, simple, minimalist, act in a\n" @@ -7207,52 +9620,52 @@ msgid "" "installation version 5.005 or newer." msgstr "" -#: gnu/packages/perl.scm:3136 +#: gnu/packages/perl.scm:4038 msgid "Give your Perl module the ability to have plugins" msgstr "" -#: gnu/packages/perl.scm:3137 +#: gnu/packages/perl.scm:4039 msgid "" "This module provides a simple but extensible way of having\n" "'plugins' for your Perl module." msgstr "" -#: gnu/packages/perl.scm:3156 +#: gnu/packages/perl.scm:4058 msgid "Perl runtime module handling" msgstr "" -#: gnu/packages/perl.scm:3157 +#: gnu/packages/perl.scm:4059 msgid "" "The functions exported by this module deal with runtime\n" "handling of Perl modules, which are normally handled at compile time." msgstr "" -#: gnu/packages/perl.scm:3180 +#: gnu/packages/perl.scm:4082 msgid "Provide information on conflicts for Module::Runtime" msgstr "" -#: gnu/packages/perl.scm:3181 +#: gnu/packages/perl.scm:4083 msgid "" "This module provides conflicts checking for Module::Runtime,\n" "which had a recent release that broke some versions of Moose. It is called\n" "from Moose::Conflicts and moose-outdated." msgstr "" -#: gnu/packages/perl.scm:3202 +#: gnu/packages/perl.scm:4104 msgid "Recursively scan Perl code for dependencies" msgstr "" -#: gnu/packages/perl.scm:3203 +#: gnu/packages/perl.scm:4105 msgid "" "Module::ScanDeps is a module to recursively scan Perl\n" "programs for dependencies." msgstr "" -#: gnu/packages/perl.scm:3223 +#: gnu/packages/perl.scm:4125 msgid "Module name tools and transformations" msgstr "" -#: gnu/packages/perl.scm:3224 +#: gnu/packages/perl.scm:4126 msgid "" "This module provides a few useful functions for manipulating\n" "module names. Its main aim is to centralise some of the functions commonly\n" @@ -7260,11 +9673,11 @@ msgid "" "module names to relative paths." msgstr "" -#: gnu/packages/perl.scm:3254 +#: gnu/packages/perl.scm:4156 msgid "Minimalist Object Orientation (with Moose compatibility)" msgstr "" -#: gnu/packages/perl.scm:3255 +#: gnu/packages/perl.scm:4157 msgid "" "Moo is an extremely light-weight Object Orientation system.\n" "It allows one to concisely define objects and roles with a convenient syntax\n" @@ -7272,11 +9685,11 @@ msgid "" "Moose and is optimised for rapid startup." msgstr "" -#: gnu/packages/perl.scm:3331 +#: gnu/packages/perl.scm:4233 msgid "Postmodern object system for Perl 5" msgstr "" -#: gnu/packages/perl.scm:3333 +#: gnu/packages/perl.scm:4235 msgid "" "Moose is a complete object system for Perl 5. It provides keywords for\n" "attribute declaration, object construction, inheritance, and maybe more. With\n" @@ -7287,11 +9700,11 @@ msgid "" "sentences." msgstr "" -#: gnu/packages/perl.scm:3361 +#: gnu/packages/perl.scm:4263 msgid "Emulate Class::Accessor::Fast behavior using Moose attributes" msgstr "" -#: gnu/packages/perl.scm:3362 +#: gnu/packages/perl.scm:4264 msgid "" "This module attempts to emulate the behavior of\n" "Class::Accessor::Fast as accurately as possible using the Moose attribute\n" @@ -7299,21 +9712,21 @@ msgid "" "private methods are not." msgstr "" -#: gnu/packages/perl.scm:3394 +#: gnu/packages/perl.scm:4296 msgid "Moose role for processing command line options" msgstr "" -#: gnu/packages/perl.scm:3395 +#: gnu/packages/perl.scm:4297 msgid "" "This is a Moose role which provides an alternate constructor\n" "for creating objects using parameters passed in from the command line." msgstr "" -#: gnu/packages/perl.scm:3416 +#: gnu/packages/perl.scm:4318 msgid "Mark overload code symbols as methods" msgstr "" -#: gnu/packages/perl.scm:3417 +#: gnu/packages/perl.scm:4319 msgid "" "MooseX::MarkAsMethods allows one to easily mark certain\n" "functions as Moose methods. This will allow other packages such as\n" @@ -7323,21 +9736,21 @@ msgid "" "overloads will \"just work\"." msgstr "" -#: gnu/packages/perl.scm:3447 +#: gnu/packages/perl.scm:4349 msgid "Code attribute introspection" msgstr "" -#: gnu/packages/perl.scm:3448 +#: gnu/packages/perl.scm:4350 msgid "" "This module allows code attributes of methods to be\n" "introspected using Moose meta method objects." msgstr "" -#: gnu/packages/perl.scm:3474 +#: gnu/packages/perl.scm:4376 msgid "Subclassing of non-Moose classes" msgstr "" -#: gnu/packages/perl.scm:3475 +#: gnu/packages/perl.scm:4377 msgid "" "MooseX::NonMoose allows for easily subclassing non-Moose\n" "classes with Moose, taking care of the details connected with doing this, such\n" @@ -7346,31 +9759,31 @@ msgid "" "BUILD methods are called. It tries to be as non-intrusive as possible." msgstr "" -#: gnu/packages/perl.scm:3504 +#: gnu/packages/perl.scm:4406 msgid "Extension of Params::Validate using Moose's types" msgstr "" -#: gnu/packages/perl.scm:3505 +#: gnu/packages/perl.scm:4407 msgid "" "This module fills a gap in Moose by adding method parameter\n" "validation to Moose." msgstr "" -#: gnu/packages/perl.scm:3526 +#: gnu/packages/perl.scm:4428 msgid "Apply roles to a related Perl class" msgstr "" -#: gnu/packages/perl.scm:3527 +#: gnu/packages/perl.scm:4429 msgid "" "This module applies roles to make a subclass instead of\n" "manually setting up a subclass." msgstr "" -#: gnu/packages/perl.scm:3554 +#: gnu/packages/perl.scm:4456 msgid "Moose roles with composition parameters" msgstr "" -#: gnu/packages/perl.scm:3555 +#: gnu/packages/perl.scm:4457 msgid "" "Because Moose roles serve many different masters, they\n" "usually provide only the least common denominator of functionality. To\n" @@ -7380,11 +9793,11 @@ msgid "" "Parameterized roles offer a solution to these (and other) kinds of problems." msgstr "" -#: gnu/packages/perl.scm:3581 +#: gnu/packages/perl.scm:4483 msgid "Roles which support overloading" msgstr "" -#: gnu/packages/perl.scm:3582 +#: gnu/packages/perl.scm:4484 msgid "" "MooseX::Role::WithOverloading allows you to write a\n" "Moose::Role which defines overloaded operators and allows those overload\n" @@ -7392,11 +9805,11 @@ msgid "" "where plain Moose::Roles would lose the overloading." msgstr "" -#: gnu/packages/perl.scm:3604 +#: gnu/packages/perl.scm:4506 msgid "Name your accessors foo() and set_foo()" msgstr "" -#: gnu/packages/perl.scm:3605 +#: gnu/packages/perl.scm:4507 msgid "" "This module does not provide any methods. Simply loading it\n" "changes the default naming policy for the loading class so that accessors are\n" @@ -7404,85 +9817,96 @@ msgid "" "accessor, while set methods are prefixed with \"_set_\"." msgstr "" -#: gnu/packages/perl.scm:3631 +#: gnu/packages/perl.scm:4533 msgid "Strict object constructors for Moose" msgstr "" -#: gnu/packages/perl.scm:3632 +#: gnu/packages/perl.scm:4534 msgid "" "Simply loading this module makes your constructors\n" "\"strict\". If your constructor is called with an attribute init argument\n" "that your class does not declare, then it calls Moose->throw_error()." msgstr "" -#: gnu/packages/perl.scm:3660 +#: gnu/packages/perl.scm:4562 msgid "Trait loading and resolution for Moose" msgstr "" -#: gnu/packages/perl.scm:3661 +#: gnu/packages/perl.scm:4563 msgid "" "Adds support on top of MooseX::Traits for class precedence\n" "search for traits and some extra attributes." msgstr "" -#: gnu/packages/perl.scm:3687 +#: gnu/packages/perl.scm:4589 msgid "Organise your Moose types in libraries" msgstr "" -#: gnu/packages/perl.scm:3688 +#: gnu/packages/perl.scm:4590 msgid "" "This package lets you declare types using short names, but\n" "behind the scenes it namespaces all your type declarations, effectively\n" "prevent name clashes between packages." msgstr "" -#: gnu/packages/perl.scm:3719 +#: gnu/packages/perl.scm:4621 msgid "DateTime related constraints and coercions for Moose" msgstr "" -#: gnu/packages/perl.scm:3720 +#: gnu/packages/perl.scm:4622 msgid "" "This module packages several Moose::Util::TypeConstraints\n" "with coercions, designed to work with the DateTime suite of objects." msgstr "" -#: gnu/packages/perl.scm:3752 +#: gnu/packages/perl.scm:4654 msgid "Extensions to MooseX::Types::DateTime" msgstr "" -#: gnu/packages/perl.scm:3753 +#: gnu/packages/perl.scm:4655 msgid "" "This module builds on MooseX::Types::DateTime to add\n" "additional custom types and coercions. Since it builds on an existing type,\n" "all coercions and constraints are inherited." msgstr "" -#: gnu/packages/perl.scm:3782 +#: gnu/packages/perl.scm:4684 msgid "ClassName type constraints for Moose" msgstr "" -#: gnu/packages/perl.scm:3783 +#: gnu/packages/perl.scm:4685 msgid "" "MooseX::Types::LoadableClass provides a ClassName type\n" "constraint with coercion to load the class." msgstr "" -#: gnu/packages/perl.scm:3807 +#: gnu/packages/perl.scm:4709 msgid "Moosish types and type builder" msgstr "" -#: gnu/packages/perl.scm:3808 +#: gnu/packages/perl.scm:4710 msgid "" "MooX::Types::MooseLike provides a possibility to build your\n" "own set of Moose-like types. These custom types can then be used to describe\n" "fields in Moo-based classes." msgstr "" -#: gnu/packages/perl.scm:3827 +#: gnu/packages/perl.scm:4729 +msgid "Mozilla's CA cert bundle in PEM format" +msgstr "" + +#: gnu/packages/perl.scm:4730 +msgid "" +"@code{Mozilla::CA} provides a copy of Mozilla's bundle of\n" +"Certificate Authority certificates in a form that can be consumed by modules\n" +"and libraries based on OpenSSL." +msgstr "" + +#: gnu/packages/perl.scm:4749 msgid "MRO interface compatibility for Perls < 5.9.5" msgstr "" -#: gnu/packages/perl.scm:3828 +#: gnu/packages/perl.scm:4750 msgid "" "The \"mro\" namespace provides several utilities for dealing\n" "with method resolution order and method caching in general in Perl 5.9.5 and\n" @@ -7490,11 +9914,11 @@ msgid "" "Perl (back to 5.6.0)." msgstr "" -#: gnu/packages/perl.scm:3855 +#: gnu/packages/perl.scm:4777 msgid "Keep imports out of your namespace" msgstr "" -#: gnu/packages/perl.scm:3856 +#: gnu/packages/perl.scm:4778 msgid "" "The namespace::autoclean pragma will remove all imported\n" "symbols at the end of the current package's compile cycle. Functions called\n" @@ -7505,11 +9929,11 @@ msgid "" "anything that looks like a method." msgstr "" -#: gnu/packages/perl.scm:3882 +#: gnu/packages/perl.scm:4804 msgid "Keep imports and functions out of your namespace" msgstr "" -#: gnu/packages/perl.scm:3883 +#: gnu/packages/perl.scm:4805 msgid "" "The namespace::clean pragma will remove all previously\n" "declared or imported symbols at the end of the current package's compile\n" @@ -7517,64 +9941,76 @@ msgid "" "name, but they won't show up as methods on your class or instances." msgstr "" -#: gnu/packages/perl.scm:3903 -msgid "Numeric comparisons" +#: gnu/packages/perl.scm:4828 +msgid "Perl client for Etsy's statsd daemon" +msgstr "Perlklient for Etsy's statsd-dæmonen" + +#: gnu/packages/perl.scm:4829 +msgid "" +"This module implement a UDP client for the statsd statistics\n" +"collector daemon in use at Etsy.com." msgstr "" +"Dette modul implementerer en UDP-klient for statsd-statistik\n" +"indsamlingsdæmonen i brug på Etsy.com." + +#: gnu/packages/perl.scm:4847 +msgid "Numeric comparisons" +msgstr "Numeriske sammenligninger" -#: gnu/packages/perl.scm:3904 +#: gnu/packages/perl.scm:4848 msgid "" "Number::Compare compiles a simple comparison to an anonymous\n" "subroutine, which you can call with a value to be tested against." msgstr "" -#: gnu/packages/perl.scm:3922 +#: gnu/packages/perl.scm:4866 msgid "Generate cryptographic signatures for objects" -msgstr "" +msgstr "Opret kryptografiske underskrifter for objekter" -#: gnu/packages/perl.scm:3923 +#: gnu/packages/perl.scm:4867 msgid "" "Object::Signature is an abstract base class that you can\n" "inherit from in order to allow your objects to generate unique cryptographic\n" "signatures." msgstr "" -#: gnu/packages/perl.scm:3945 +#: gnu/packages/perl.scm:4889 msgid "Anonymous packages" -msgstr "" +msgstr "Anonyme pakker" -#: gnu/packages/perl.scm:3946 +#: gnu/packages/perl.scm:4890 msgid "" "This module allows for anonymous packages that are\n" "independent of the main namespace and only available through an object\n" "instance, not by name." msgstr "" -#: gnu/packages/perl.scm:3974 +#: gnu/packages/perl.scm:4918 msgid "Manage deprecation warnings for your distribution" -msgstr "" +msgstr "Håndter forældelsesadvarseler for din distribution" -#: gnu/packages/perl.scm:3975 +#: gnu/packages/perl.scm:4919 msgid "" "This module allows you to manage a set of deprecations for\n" "one or more modules." msgstr "" -#: gnu/packages/perl.scm:4002 +#: gnu/packages/perl.scm:4946 msgid "Routines for manipulating stashes" msgstr "" -#: gnu/packages/perl.scm:4003 +#: gnu/packages/perl.scm:4947 msgid "" "Manipulating stashes (Perl's symbol tables) is occasionally\n" "necessary, but incredibly messy, and easy to get wrong. This module hides all\n" "of that behind a simple API." msgstr "" -#: gnu/packages/perl.scm:4026 +#: gnu/packages/perl.scm:4970 msgid "Faster implementation of the Package::Stash API" msgstr "" -#: gnu/packages/perl.scm:4027 +#: gnu/packages/perl.scm:4971 msgid "" "This is a backend for Package::Stash, which provides the\n" "functionality in a way that's less buggy and much faster. It will be used by\n" @@ -7582,11 +10018,11 @@ msgid "" "compiler." msgstr "" -#: gnu/packages/perl.scm:4047 +#: gnu/packages/perl.scm:4991 msgid "Play with other peoples' lexical variables" msgstr "" -#: gnu/packages/perl.scm:4048 +#: gnu/packages/perl.scm:4992 msgid "" "PadWalker is a module which allows you to inspect (and even\n" "change) lexical variables in any subroutine which called you. It will only\n" @@ -7594,78 +10030,101 @@ msgid "" "is particularly useful for debugging." msgstr "" -#: gnu/packages/perl.scm:4069 +#: gnu/packages/perl.scm:5013 msgid "Simple, compact and correct param-checking functions" msgstr "" -#: gnu/packages/perl.scm:4071 +#: gnu/packages/perl.scm:5015 msgid "" "Params::Util provides a basic set of importable functions that makes\n" "checking parameters easier." msgstr "" -#: gnu/packages/perl.scm:4095 +#: gnu/packages/perl.scm:5039 msgid "Validate method/function parameters" msgstr "" -#: gnu/packages/perl.scm:4096 +#: gnu/packages/perl.scm:5040 msgid "" "The Params::Validate module allows you to validate method or\n" "function call parameters to an arbitrary level of specificity." msgstr "" -#: gnu/packages/perl.scm:4114 +#: gnu/packages/perl.scm:5058 msgid "Create and manipulate PAR distributions" -msgstr "" +msgstr "Opret og manipuler PAR-distributioner" -#: gnu/packages/perl.scm:4115 +#: gnu/packages/perl.scm:5059 msgid "" "PAR::Dist is a toolkit to create and manipulate PAR\n" "distributions." msgstr "" +"PAR::Dist er et værktøjssæt til at oprette og manipulere PAR-\n" +"distributioner." -#: gnu/packages/perl.scm:4134 +#: gnu/packages/perl.scm:5078 msgid "" "Allows you to both load one or more modules, while setting\n" "up inheritance from those modules at the same time." msgstr "" -#: gnu/packages/perl.scm:4153 +#: gnu/packages/perl.scm:5097 msgid "Path specification manipulation" msgstr "" -#: gnu/packages/perl.scm:4154 +#: gnu/packages/perl.scm:5098 msgid "" "Path::Class is a module for manipulation of file and\n" "directory specifications in a cross-platform manner." msgstr "" -#: gnu/packages/perl.scm:4174 +#: gnu/packages/perl.scm:5122 +msgid "File path utility" +msgstr "" + +#: gnu/packages/perl.scm:5123 +msgid "" +"This module provides a small, fast utility for working\n" +"with file paths." +msgstr "" + +#: gnu/packages/perl.scm:5144 +msgid "Fast and correct UTF-8 IO" +msgstr "" + +#: gnu/packages/perl.scm:5145 +msgid "" +"@code{PerlIO::utf8_strict} provides a fast and correct UTF-8\n" +"PerlIO layer. Unlike Perl's default @code{:utf8} layer it checks the input\n" +"for correctness." +msgstr "" + +#: gnu/packages/perl.scm:5166 msgid "Check for comprehensive documentation of a module" msgstr "" -#: gnu/packages/perl.scm:4175 +#: gnu/packages/perl.scm:5167 msgid "" "This module provides a mechanism for determining if the pod\n" "for a given module is comprehensive." msgstr "" -#: gnu/packages/perl.scm:4192 +#: gnu/packages/perl.scm:5184 msgid "Parsing library for text in Pod format" msgstr "" -#: gnu/packages/perl.scm:4193 +#: gnu/packages/perl.scm:5185 msgid "" "Pod::Simple is a Perl library for parsing text in\n" "the Pod (plain old documentation) markup language that is typically\n" "used for writing documentation for Perl and for Perl modules." msgstr "" -#: gnu/packages/perl.scm:4214 +#: gnu/packages/perl.scm:5206 msgid "GNU C library compatible strftime for loggers and servers" msgstr "" -#: gnu/packages/perl.scm:4215 +#: gnu/packages/perl.scm:5207 msgid "" "POSIX::strftime::Compiler provides GNU C library compatible\n" "strftime(3). But this module is not affected by the system locale. This\n" @@ -7673,22 +10132,22 @@ msgid "" "applications." msgstr "" -#: gnu/packages/perl.scm:4233 +#: gnu/packages/perl.scm:5225 msgid "Information about the currently running perl" msgstr "" -#: gnu/packages/perl.scm:4235 +#: gnu/packages/perl.scm:5227 msgid "" "Probe::Perl provides methods for obtaining information about the\n" "currently running perl interpreter. It originally began life as code in the\n" "Module::Build project, but has been externalized here for general use." msgstr "" -#: gnu/packages/perl.scm:4257 +#: gnu/packages/perl.scm:5249 msgid "Create read-only scalars, arrays, hashes" msgstr "" -#: gnu/packages/perl.scm:4258 +#: gnu/packages/perl.scm:5250 msgid "" "This module provides a facility for creating non-modifiable\n" "variables in Perl. This is useful for configuration files, headers, etc. It\n" @@ -7696,11 +10155,11 @@ msgid "" "variables that should not be changed." msgstr "" -#: gnu/packages/perl.scm:4276 +#: gnu/packages/perl.scm:5268 msgid "Provide commonly requested regular expressions" msgstr "" -#: gnu/packages/perl.scm:4278 +#: gnu/packages/perl.scm:5270 msgid "" "This module exports a single hash (`%RE') that stores or generates\n" "commonly needed regular expressions. Patterns currently provided include:\n" @@ -7710,29 +10169,29 @@ msgid "" "codes." msgstr "" -#: gnu/packages/perl.scm:4308 +#: gnu/packages/perl.scm:5300 msgid "Roles, as a slice of Moose" msgstr "" -#: gnu/packages/perl.scm:4309 +#: gnu/packages/perl.scm:5301 msgid "Role::Tiny is a minimalist role composition tool." msgstr "" -#: gnu/packages/perl.scm:4326 +#: gnu/packages/perl.scm:5318 msgid "Call isa, can, does, and DOES safely" msgstr "" -#: gnu/packages/perl.scm:4327 +#: gnu/packages/perl.scm:5319 msgid "" "This module allows you to call isa, can, does, and DOES\n" "safely on things that may not be objects." msgstr "" -#: gnu/packages/perl.scm:4345 +#: gnu/packages/perl.scm:5337 msgid "Lexically-scoped resource management" msgstr "" -#: gnu/packages/perl.scm:4346 +#: gnu/packages/perl.scm:5338 msgid "" "This module provides a convenient way to perform cleanup or\n" "other forms of resource management at the end of a scope. It is particularly\n" @@ -7743,29 +10202,29 @@ msgid "" "collector." msgstr "" -#: gnu/packages/perl.scm:4369 +#: gnu/packages/perl.scm:5361 msgid "Infinite sets" msgstr "" -#: gnu/packages/perl.scm:4370 +#: gnu/packages/perl.scm:5362 msgid "Set::Infinite is a set theory module for infinite sets." msgstr "" -#: gnu/packages/perl.scm:4390 +#: gnu/packages/perl.scm:5382 msgid "Unordered collections of Perl Objects" msgstr "" -#: gnu/packages/perl.scm:4391 +#: gnu/packages/perl.scm:5383 msgid "" "Set::Object provides efficient sets, unordered collections\n" "of Perl objects without duplicates for scalars and references." msgstr "" -#: gnu/packages/perl.scm:4409 +#: gnu/packages/perl.scm:5401 msgid "Set operations for Perl" msgstr "" -#: gnu/packages/perl.scm:4410 +#: gnu/packages/perl.scm:5402 msgid "" "The first priority of Set::Scalar is to be a convenient\n" "interface to sets (as in: unordered collections of Perl scalars). While not\n" @@ -7773,11 +10232,21 @@ msgid "" "compact." msgstr "" -#: gnu/packages/perl.scm:4430 +#: gnu/packages/perl.scm:5422 +msgid "Sort arrays by one or multiple calculated keys" +msgstr "" + +#: gnu/packages/perl.scm:5423 +msgid "" +"This Perl module provides various functions to quickly sort\n" +"arrays by one or multiple calculated keys." +msgstr "" + +#: gnu/packages/perl.scm:5441 msgid "Spiffy Perl Interface Framework For You" msgstr "" -#: gnu/packages/perl.scm:4431 +#: gnu/packages/perl.scm:5442 msgid "" "Spiffy is a framework and methodology for doing object\n" "oriented (OO) programming in Perl. Spiffy combines the best parts of\n" @@ -7787,11 +10256,11 @@ msgid "" "other OO languages like Python, Ruby, Java and Perl 6." msgstr "" -#: gnu/packages/perl.scm:4453 +#: gnu/packages/perl.scm:5464 msgid "Temporary buffer to save bytes" msgstr "" -#: gnu/packages/perl.scm:4454 +#: gnu/packages/perl.scm:5465 msgid "" "Stream::Buffered is a buffer class to store arbitrary length\n" "of byte strings and then get a seekable filehandle once everything is\n" @@ -7799,62 +10268,62 @@ msgid "" "on the length of the size." msgstr "" -#: gnu/packages/perl.scm:4474 +#: gnu/packages/perl.scm:5485 msgid "Turn on strict and make all warnings fatal" msgstr "" -#: gnu/packages/perl.scm:4475 +#: gnu/packages/perl.scm:5486 msgid "" "Strictures turns on strict and make all warnings fatal when\n" "run from within a source-controlled directory." msgstr "" -#: gnu/packages/perl.scm:4493 +#: gnu/packages/perl.scm:5504 msgid "Camelcase and de-camelcase" msgstr "" -#: gnu/packages/perl.scm:4494 +#: gnu/packages/perl.scm:5505 msgid "" "This module may be used to convert from under_score text to\n" "CamelCase and back again." msgstr "" -#: gnu/packages/perl.scm:4514 +#: gnu/packages/perl.scm:5525 msgid "Rewrite strings based on a set of known prefixes" msgstr "" -#: gnu/packages/perl.scm:4515 +#: gnu/packages/perl.scm:5526 msgid "" "This module allows you to rewrite strings based on a set of\n" "known prefixes." msgstr "" -#: gnu/packages/perl.scm:4534 +#: gnu/packages/perl.scm:5545 msgid "String printing alternatives to printf" msgstr "" -#: gnu/packages/perl.scm:4536 +#: gnu/packages/perl.scm:5547 msgid "" "This module inserts values into (translated) strings. It provides\n" "@code{printf} and @code{sprintf} alternatives via both an object-oriented and\n" "a functional interface." msgstr "" -#: gnu/packages/perl.scm:4559 +#: gnu/packages/perl.scm:5570 msgid "Sophisticated exporter for custom-built routines" msgstr "" -#: gnu/packages/perl.scm:4561 +#: gnu/packages/perl.scm:5572 msgid "" "Sub::Exporter provides a sophisticated alternative to Exporter.pm for\n" "custom-built routines." msgstr "" -#: gnu/packages/perl.scm:4580 +#: gnu/packages/perl.scm:5591 msgid "Only use Sub::Exporter if you need it" msgstr "" -#: gnu/packages/perl.scm:4581 +#: gnu/packages/perl.scm:5592 msgid "" "Sub::Exporter is an incredibly powerful module, but with\n" "that power comes great responsibility, as well as some runtime penalties.\n" @@ -7864,54 +10333,54 @@ msgid "" "renaming exports, if they try to use them." msgstr "" -#: gnu/packages/perl.scm:4603 +#: gnu/packages/perl.scm:5614 msgid "Retrieve names of code references" msgstr "" -#: gnu/packages/perl.scm:4604 +#: gnu/packages/perl.scm:5615 msgid "" "Sub::Identify allows you to retrieve the real name of code\n" "references." msgstr "" -#: gnu/packages/perl.scm:4623 +#: gnu/packages/perl.scm:5634 msgid "Install subroutines into packages easily" msgstr "" -#: gnu/packages/perl.scm:4625 +#: gnu/packages/perl.scm:5636 msgid "" "Sub::Install makes it easy to install subroutines into packages without\n" "the unsightly mess of C<no strict> or typeglobs lying about where just anyone\n" "can see them." msgstr "" -#: gnu/packages/perl.scm:4646 +#: gnu/packages/perl.scm:5657 msgid "(Re)name a sub" msgstr "" -#: gnu/packages/perl.scm:4647 +#: gnu/packages/perl.scm:5658 msgid "" "Assigns a new name to referenced sub. If package\n" "specification is omitted in the name, then the current package is used. The\n" "return value is the sub." msgstr "" -#: gnu/packages/perl.scm:4666 +#: gnu/packages/perl.scm:5677 msgid "Apparently run a function in a higher stack frame" msgstr "" -#: gnu/packages/perl.scm:4667 +#: gnu/packages/perl.scm:5678 msgid "" "Like Tcl's uplevel() function, but not quite so dangerous.\n" "The idea is just to fool caller(). All the really naughty bits of Tcl's\n" "uplevel() are avoided." msgstr "" -#: gnu/packages/perl.scm:4686 +#: gnu/packages/perl.scm:5697 msgid "Perl extension for generating SVG documents" msgstr "" -#: gnu/packages/perl.scm:4687 +#: gnu/packages/perl.scm:5698 msgid "" "SVG is a Perl module which generates a nested data structure\n" "containing the DOM representation of an SVG (Scalable Vector Graphics) image.\n" @@ -7920,32 +10389,32 @@ msgid "" "animation content." msgstr "" -#: gnu/packages/perl.scm:4706 +#: gnu/packages/perl.scm:5717 msgid "Perl extension for getting CPU information" msgstr "" -#: gnu/packages/perl.scm:4708 +#: gnu/packages/perl.scm:5719 msgid "" "In responce to a post on perlmonks.org, a module for counting the number\n" "of CPU's on a system. Support has now also been added for type of CPU and\n" "clock speed." msgstr "" -#: gnu/packages/perl.scm:4730 +#: gnu/packages/perl.scm:5741 msgid "Get full hostname in Perl" msgstr "" -#: gnu/packages/perl.scm:4731 +#: gnu/packages/perl.scm:5742 msgid "" "Sys::Hostname::Long tries very hard to get the full hostname\n" "of a system." msgstr "" -#: gnu/packages/perl.scm:4749 +#: gnu/packages/perl.scm:5760 msgid "Ensure that a platform has weaken support" msgstr "" -#: gnu/packages/perl.scm:4750 +#: gnu/packages/perl.scm:5761 msgid "" "One recurring problem in modules that use Scalar::Util's\n" "weaken function is that it is not present in the pure-perl variant. If\n" @@ -7955,11 +10424,11 @@ msgid "" "error encouraging the user to seek support." msgstr "" -#: gnu/packages/perl.scm:4775 +#: gnu/packages/perl.scm:5786 msgid "Template processing system for Perl" msgstr "" -#: gnu/packages/perl.scm:4776 +#: gnu/packages/perl.scm:5787 msgid "" "The Template Toolkit is a collection of modules which\n" "implement an extensible template processing system. It was originally\n" @@ -7968,42 +10437,42 @@ msgid "" "documents: HTML, XML, POD, PostScript, LaTeX, and so on." msgstr "" -#: gnu/packages/perl.scm:4799 +#: gnu/packages/perl.scm:5810 msgid "Profiling for Template Toolkit" msgstr "" -#: gnu/packages/perl.scm:4800 +#: gnu/packages/perl.scm:5811 msgid "" "Template::Timer provides inline profiling of the template\n" "processing in Perl code." msgstr "" -#: gnu/packages/perl.scm:4818 +#: gnu/packages/perl.scm:5829 msgid "Detect encoding of the current terminal" msgstr "" -#: gnu/packages/perl.scm:4819 +#: gnu/packages/perl.scm:5830 msgid "" "Term::Encoding is a simple module to detect the encoding of\n" "the current terminal expects in various ways." msgstr "" -#: gnu/packages/perl.scm:4843 +#: gnu/packages/perl.scm:5854 msgid "Progress meter on a standard terminal" msgstr "" -#: gnu/packages/perl.scm:4844 +#: gnu/packages/perl.scm:5855 msgid "" "Term::ProgressBar provides a simple progress bar on the\n" "terminal, to let the user know that something is happening, roughly how much\n" "stuff has been done, and maybe an estimate at how long remains." msgstr "" -#: gnu/packages/perl.scm:4867 +#: gnu/packages/perl.scm:5878 msgid "Progress meter if run interactively" msgstr "" -#: gnu/packages/perl.scm:4868 +#: gnu/packages/perl.scm:5879 msgid "" "Term::ProgressBar is a wonderful module for showing progress\n" "bars on the terminal. This module acts very much like that module when it is\n" @@ -8011,21 +10480,21 @@ msgid "" "a cron job) then it does not show the progress bar." msgstr "" -#: gnu/packages/perl.scm:4890 +#: gnu/packages/perl.scm:5901 msgid "Simple progress bars" msgstr "" -#: gnu/packages/perl.scm:4891 +#: gnu/packages/perl.scm:5902 msgid "" "Term::ProgressBar::Simple tells you how much work has been\n" "done, how much is left to do, and estimate how long it will take." msgstr "" -#: gnu/packages/perl.scm:4909 +#: gnu/packages/perl.scm:5920 msgid "Simple terminal control" msgstr "Simpel terminalkontrol" -#: gnu/packages/perl.scm:4910 +#: gnu/packages/perl.scm:5921 msgid "" "This module, ReadKey, provides ioctl control for terminals\n" "so the input modes can be changed (thus allowing reads of a single character\n" @@ -8034,22 +10503,46 @@ msgid "" "screen size, and retrieval/modification of the control characters." msgstr "" -#: gnu/packages/perl.scm:4937 +#: gnu/packages/perl.scm:5948 msgid "Data-driven testing framework for Perl" msgstr "" -#: gnu/packages/perl.scm:4938 +#: gnu/packages/perl.scm:5949 msgid "" "Test::Base gives a way to trivially write your own test\n" "framework base class. It concentrates on offering reusable data driven\n" "patterns, so that you can write tests with a minimum of code." msgstr "" -#: gnu/packages/perl.scm:4969 +#: gnu/packages/perl.scm:5976 +msgid "Easily create test classes in an xUnit/JUnit style" +msgstr "" + +#: gnu/packages/perl.scm:5977 +msgid "" +"@code{Test::Class} provides a simple way of creating classes\n" +"and objects to test your code in an xUnit style.\n" +"\n" +"Built using @code{Test::Builder}, it was designed to work with other\n" +"@code{Test::Builder} based modules (@code{Test::More},\n" +"@code{Test::Differences}, @code{Test::Exception}, etc.)." +msgstr "" + +#: gnu/packages/perl.scm:6009 +msgid "Test classes the easy way" +msgstr "" + +#: gnu/packages/perl.scm:6010 +msgid "" +"@code{Test::Class::Most} provides some more convenience when\n" +"using @code{Test::Class}." +msgstr "" + +#: gnu/packages/perl.scm:6040 msgid "Check for uncleaned imports" msgstr "" -#: gnu/packages/perl.scm:4970 +#: gnu/packages/perl.scm:6041 msgid "" "This module lets you check your module's namespaces for\n" "imported functions you might have forgotten to remove with\n" @@ -8057,11 +10550,11 @@ msgid "" "called as methods, which usually isn't want you want." msgstr "" -#: gnu/packages/perl.scm:4990 +#: gnu/packages/perl.scm:6061 msgid "Flexible deep comparison for the Test::Builder framework" msgstr "" -#: gnu/packages/perl.scm:4992 +#: gnu/packages/perl.scm:6063 msgid "" "Test::Deep compares two structures by going through each level, ensuring\n" "that the values match, that arrays and hashes have the same elements and that\n" @@ -8069,21 +10562,21 @@ msgid "" "structures without getting caught in an infinite loop." msgstr "" -#: gnu/packages/perl.scm:5019 +#: gnu/packages/perl.scm:6089 msgid "Test strings and data structures and show differences" msgstr "" -#: gnu/packages/perl.scm:5020 +#: gnu/packages/perl.scm:6090 msgid "" "This module exports three test functions and four diff-style\n" "functions." msgstr "" -#: gnu/packages/perl.scm:5041 +#: gnu/packages/perl.scm:6111 msgid "Perl extension for maintaining test directories" msgstr "" -#: gnu/packages/perl.scm:5042 +#: gnu/packages/perl.scm:6112 msgid "" "Testing code can involve making sure that files are created\n" "and deleted as expected. Doing this manually can be error prone, as it's easy\n" @@ -8093,76 +10586,99 @@ msgid "" "files, as well as to verify that there are no missing or unknown files." msgstr "" -#: gnu/packages/perl.scm:5068 +#: gnu/packages/perl.scm:6138 msgid "Test exception based code" msgstr "" -#: gnu/packages/perl.scm:5069 +#: gnu/packages/perl.scm:6139 msgid "" "This module provides a few convenience methods for testing\n" "exception based code. It is built with Test::Builder and plays happily with\n" "Test::More and friends." msgstr "" -#: gnu/packages/perl.scm:5089 +#: gnu/packages/perl.scm:6159 msgid "Simple helpers for testing code with exceptions" msgstr "" -#: gnu/packages/perl.scm:5090 +#: gnu/packages/perl.scm:6160 msgid "" "Test::Fatal is an alternative to the popular\n" "Test::Exception. It does much less, but should allow greater flexibility in\n" "testing exception-throwing code with about the same amount of typing." msgstr "" -#: gnu/packages/perl.scm:5120 +#: gnu/packages/perl.scm:6184 +msgid "Ease software testing with files and directories" +msgstr "" + +#: gnu/packages/perl.scm:6185 +msgid "" +"This library provides functions to enable testing of files\n" +"and directories. For instance, the @code{file_ok} helper can test whether the\n" +"contents of a file is equal to a particular string." +msgstr "" + +#: gnu/packages/perl.scm:6215 msgid "Run Perl standard test scripts with statistics" msgstr "" -#: gnu/packages/perl.scm:5121 +#: gnu/packages/perl.scm:6216 msgid "" "Simple test harness which allows tests to be run and results\n" "automatically aggregated and output to STDOUT." msgstr "" -#: gnu/packages/perl.scm:5139 +#: gnu/packages/perl.scm:6234 msgid "Traces memory leaks in Perl" msgstr "" -#: gnu/packages/perl.scm:5140 +#: gnu/packages/perl.scm:6235 msgid "" "Test::LeakTrace provides several functions that trace memory\n" "leaks. This module scans arenas, the memory allocation system, so it can\n" "detect any leaked SVs in given blocks." msgstr "" -#: gnu/packages/perl.scm:5159 +#: gnu/packages/perl.scm:6254 msgid "Tests strings for equality, with more helpful failures" msgstr "" -#: gnu/packages/perl.scm:5160 +#: gnu/packages/perl.scm:6255 msgid "" "This module provides some drop-in replacements for the\n" "string comparison functions of Test::More, but which are more suitable when\n" "you test against long strings." msgstr "" -#: gnu/packages/perl.scm:5188 +#: gnu/packages/perl.scm:6276 +msgid "Interact with a t/test_manifest file" +msgstr "" + +#: gnu/packages/perl.scm:6277 +msgid "" +"@code{Test::Manifest} overrides the default test file order. Instead of\n" +"running all of the t/*.t files in ASCII-betical order, it looks in the t/test_manifest\n" +"file to find out which tests you want to run and the order in which you want to run them.\n" +"It constructs the right value for the build system to do the right thing." +msgstr "" + +#: gnu/packages/perl.scm:6306 msgid "Emulate troublesome interfaces in Perl" msgstr "" -#: gnu/packages/perl.scm:5189 +#: gnu/packages/perl.scm:6307 msgid "" "Test::MockObject allows you to create objects that conform\n" "to particular interfaces with very little code. You don't have to reimplement\n" "the behavior, just the input and the output." msgstr "" -#: gnu/packages/perl.scm:5208 +#: gnu/packages/perl.scm:6326 msgid "Replaces actual time with simulated time" msgstr "" -#: gnu/packages/perl.scm:5209 +#: gnu/packages/perl.scm:6327 msgid "" "This module was created to enable test suites to test code\n" "at specific points in time. Specifically it overrides localtime, gmtime and\n" @@ -8171,22 +10687,22 @@ msgid "" "to gmtime,time or localtime." msgstr "" -#: gnu/packages/perl.scm:5236 +#: gnu/packages/perl.scm:6354 msgid "Most commonly needed test functions and features" msgstr "" -#: gnu/packages/perl.scm:5237 +#: gnu/packages/perl.scm:6355 msgid "" "This module provides the most commonly used testing\n" "functions, along with automatically turning on strict and warning and gives a\n" "bit more fine-grained control over test suites." msgstr "" -#: gnu/packages/perl.scm:5255 +#: gnu/packages/perl.scm:6373 msgid "Ensure no warnings are produced while testing" msgstr "" -#: gnu/packages/perl.scm:5257 +#: gnu/packages/perl.scm:6375 msgid "" "This modules causes any warnings during testing to be captured and\n" "stored. It automatically adds an extra test that will run when your script\n" @@ -8195,91 +10711,91 @@ msgid "" "including a stack trace of what was going on when it occurred." msgstr "" -#: gnu/packages/perl.scm:5282 +#: gnu/packages/perl.scm:6400 msgid "Utilities to test STDOUT and STDERR messages" msgstr "" -#: gnu/packages/perl.scm:5284 +#: gnu/packages/perl.scm:6402 msgid "" "Test::Output provides a simple interface for testing output sent to\n" "STDOUT or STDERR. A number of different utilities are included to try and be\n" "as flexible as possible to the tester." msgstr "" -#: gnu/packages/perl.scm:5306 +#: gnu/packages/perl.scm:6424 msgid "Check for POD errors in files" msgstr "" -#: gnu/packages/perl.scm:5307 +#: gnu/packages/perl.scm:6425 msgid "" "Check POD files for errors or warnings in a test file, using\n" "Pod::Simple to do the heavy lifting." msgstr "" -#: gnu/packages/perl.scm:5327 +#: gnu/packages/perl.scm:6445 msgid "Check for pod coverage" msgstr "" -#: gnu/packages/perl.scm:5328 +#: gnu/packages/perl.scm:6446 msgid "" "This module adds a test to your Perl distribution which\n" "checks for pod coverage of all appropriate files." msgstr "" -#: gnu/packages/perl.scm:5346 +#: gnu/packages/perl.scm:6464 msgid "Checks to see if the module can be loaded" msgstr "" -#: gnu/packages/perl.scm:5347 +#: gnu/packages/perl.scm:6465 msgid "" "Test::Requires checks to see if the module can be loaded.\n" "If this fails, then rather than failing tests this skips all tests." msgstr "" -#: gnu/packages/perl.scm:5366 +#: gnu/packages/perl.scm:6484 msgid "Basic cross-platform tests for scripts" msgstr "" -#: gnu/packages/perl.scm:5368 +#: gnu/packages/perl.scm:6486 msgid "" "The intent of the Test::Script module is to provide a series of basic\n" "tests for 80% of the testing you will need to do for scripts in the script (or\n" "bin as is also commonly used) paths of your Perl distribution." msgstr "" -#: gnu/packages/perl.scm:5391 +#: gnu/packages/perl.scm:6509 msgid "Fork test in Perl" msgstr "" -#: gnu/packages/perl.scm:5392 +#: gnu/packages/perl.scm:6510 msgid "" "Test::SharedFork is a utility module for Test::Builder. It\n" "makes fork(2) safe to use in test cases." msgstr "" -#: gnu/packages/perl.scm:5408 +#: gnu/packages/perl.scm:6526 msgid "Basic utilities for writing tests" msgstr "" -#: gnu/packages/perl.scm:5410 +#: gnu/packages/perl.scm:6528 msgid "Test::Simple contains basic utilities for writing tests." msgstr "" -#: gnu/packages/perl.scm:5427 +#: gnu/packages/perl.scm:6545 msgid "Simplify running Test::Builder tests" msgstr "" -#: gnu/packages/perl.scm:5429 +#: gnu/packages/perl.scm:6547 msgid "" "Test::Tester allows testing of test modules based on Test::Builder with\n" "a minimum of effort." msgstr "" -#: gnu/packages/perl.scm:5455 -msgid "Trap exit codes, exceptions, output, etc." +#: gnu/packages/perl.scm:6573 +msgid "Trap exit codes, exceptions, output, and so on" msgstr "" -#: gnu/packages/perl.scm:5456 +#: gnu/packages/perl.scm:6574 msgid "" "This module is primarily (but not exclusively) for use in\n" "test scripts: A block eval configurable and extensible but by default trapping\n" @@ -8287,11 +10803,11 @@ msgid "" "from boxed blocks of test code." msgstr "" -#: gnu/packages/perl.scm:5476 +#: gnu/packages/perl.scm:6594 msgid "UTF-8 testing in Perl" msgstr "" -#: gnu/packages/perl.scm:5477 +#: gnu/packages/perl.scm:6595 msgid "" "This module is a collection of tests useful for dealing with\n" "UTF-8 strings in Perl. This module has two types of tests: The validity tests\n" @@ -8299,21 +10815,21 @@ msgid "" "will check that string has a given set of characteristics." msgstr "" -#: gnu/packages/perl.scm:5499 +#: gnu/packages/perl.scm:6617 msgid "Perl extension to test methods for warnings" msgstr "" -#: gnu/packages/perl.scm:5500 +#: gnu/packages/perl.scm:6618 msgid "" "This module provides a few convenience methods for testing\n" "warning based code." msgstr "" -#: gnu/packages/perl.scm:5518 +#: gnu/packages/perl.scm:6636 msgid "Test for warnings and the lack of them" msgstr "" -#: gnu/packages/perl.scm:5519 +#: gnu/packages/perl.scm:6637 msgid "" "This module is intended to be used as a drop-in replacement\n" "for Test::NoWarnings. It also adds an extra test, but runs this test before\n" @@ -8322,11 +10838,11 @@ msgid "" "plan, or not, and things will still Just Work." msgstr "" -#: gnu/packages/perl.scm:5540 +#: gnu/packages/perl.scm:6658 msgid "Test fallback behaviour in absence of modules" msgstr "" -#: gnu/packages/perl.scm:5541 +#: gnu/packages/perl.scm:6659 msgid "" "This module allows you to deliberately hide modules from a\n" "program even though they are installed. This is mostly useful for testing\n" @@ -8334,62 +10850,76 @@ msgid "" "installed." msgstr "" -#: gnu/packages/perl.scm:5568 +#: gnu/packages/perl.scm:6686 msgid "Dynamic generation of tests" msgstr "" -#: gnu/packages/perl.scm:5569 +#: gnu/packages/perl.scm:6687 msgid "" "The Test::WriteVariants module provides for the dynamic\n" "generation of tests in nested combinations of contexts." msgstr "" -#: gnu/packages/perl.scm:5589 +#: gnu/packages/perl.scm:6707 msgid "Testing module for YAML implementations" msgstr "" -#: gnu/packages/perl.scm:5590 +#: gnu/packages/perl.scm:6708 msgid "" "Test::YAML is a subclass of Test::Base with YAML specific\n" "support." msgstr "" -#: gnu/packages/perl.scm:5609 +#: gnu/packages/perl.scm:6727 msgid "Align text" msgstr "" -#: gnu/packages/perl.scm:5610 +#: gnu/packages/perl.scm:6728 msgid "" "Text::Aligner exports a single function, align(), which is\n" "used to justify strings to various alignment styles." msgstr "" -#: gnu/packages/perl.scm:5628 +#: gnu/packages/perl.scm:6746 msgid "Extract delimited text sequences from strings" msgstr "" -#: gnu/packages/perl.scm:5629 +#: gnu/packages/perl.scm:6747 msgid "" "The Text::Balanced module can be used to extract delimited\n" "text sequences from strings." msgstr "" -#: gnu/packages/perl.scm:5647 +#: gnu/packages/perl.scm:6765 msgid "Manipulate comma-separated values" msgstr "" -#: gnu/packages/perl.scm:5648 +#: gnu/packages/perl.scm:6766 msgid "" "Text::CSV provides facilities for the composition and\n" "decomposition of comma-separated values. An instance of the Text::CSV class\n" "can combine fields into a CSV string and parse a CSV string into fields." msgstr "" -#: gnu/packages/perl.scm:5669 +#: gnu/packages/perl.scm:6785 +msgid "Rountines for manipulating CSV files" +msgstr "" + +#: gnu/packages/perl.scm:6786 +msgid "" +"@code{Text::CSV_XS} provides facilities for the composition\n" +"and decomposition of comma-separated values. An instance of the\n" +"@code{Text::CSV_XS} class will combine fields into a CSV string and parse a\n" +"CSV string into fields. The module accepts either strings or files as input\n" +"and support the use of user-specified characters for delimiters, separators,\n" +"and escapes." +msgstr "" + +#: gnu/packages/perl.scm:6810 msgid "Perform diffs on files and record sets" msgstr "" -#: gnu/packages/perl.scm:5670 +#: gnu/packages/perl.scm:6811 msgid "" "Text::Diff provides a basic set of services akin to the GNU\n" "diff utility. It is not anywhere near as feature complete as GNU diff, but it\n" @@ -8398,38 +10928,61 @@ msgid "" "generally slower on larger files." msgstr "" -#: gnu/packages/perl.scm:5692 +#: gnu/packages/perl.scm:6833 msgid "Match globbing patterns against text" msgstr "" -#: gnu/packages/perl.scm:5693 +#: gnu/packages/perl.scm:6834 msgid "" "Text::Glob implements glob(3) style matching that can be\n" -"used to match against text, rather than fetching names from a filesystem. If\n" +"used to match against text, rather than fetching names from a file system. If\n" "you want to do full file globbing use the File::Glob module instead." msgstr "" -#: gnu/packages/perl.scm:5712 +#: gnu/packages/perl.scm:6857 +msgid "Fast, middleweight template engine" +msgstr "" + +#: gnu/packages/perl.scm:6859 +msgid "" +"Text::NeatTemplate provides a simple, middleweight but fast\n" +"template engine, for when you need speed rather than complex features,\n" +"yet need more features than simple variable substitution." +msgstr "" + +#: gnu/packages/perl.scm:6878 +msgid "Convert between Roman and Arabic algorisms" +msgstr "" + +#: gnu/packages/perl.scm:6879 +msgid "" +"This package provides functions to convert between Roman and\n" +"Arabic algorisms. It supports both conventional Roman algorisms (which range\n" +"from 1 to 3999) and Milhar Romans, a variation which uses a bar across the\n" +"algorism to indicate multiplication by 1000." +msgstr "" + +#: gnu/packages/perl.scm:6899 msgid "Simple ASCII tables" msgstr "" -#: gnu/packages/perl.scm:5713 +#: gnu/packages/perl.scm:6900 msgid "Text::SimpleTable draws simple ASCII tables." msgstr "" -#: gnu/packages/perl.scm:5734 +#: gnu/packages/perl.scm:6921 msgid "Organize Data in Tables" msgstr "" -#: gnu/packages/perl.scm:5735 +#: gnu/packages/perl.scm:6922 msgid "Text::Table renders plaintext tables." msgstr "" -#: gnu/packages/perl.scm:5752 +#: gnu/packages/perl.scm:6939 msgid "Provide plain ASCII transliterations of Unicode text" msgstr "" -#: gnu/packages/perl.scm:5753 +#: gnu/packages/perl.scm:6940 msgid "" "Text::Unidecode provides a function, unidecode(...) that\n" "takes Unicode data and tries to represent it in US-ASCII characters (i.e., the\n" @@ -8439,21 +10992,43 @@ msgid "" "system." msgstr "" -#: gnu/packages/perl.scm:5781 +#: gnu/packages/perl.scm:6968 msgid "Role for classes that can be thrown" msgstr "" -#: gnu/packages/perl.scm:5782 +#: gnu/packages/perl.scm:6969 msgid "" "Throwable is a role for classes that are meant to be thrown\n" "as exceptions to standard program flow." msgstr "" -#: gnu/packages/perl.scm:5801 +#: gnu/packages/perl.scm:6986 +msgid "Perl script tidier" +msgstr "" + +#: gnu/packages/perl.scm:6987 +msgid "" +"This package contains a Perl script which indents and\n" +"reformats Perl scripts to make them easier to read. The formatting can be\n" +"controlled with command line parameters. The default parameter settings\n" +"approximately follow the suggestions in the Perl Style Guide." +msgstr "" + +#: gnu/packages/perl.scm:7007 +msgid "Cycle through a list of values" +msgstr "" + +#: gnu/packages/perl.scm:7008 +msgid "" +"You use @code{Tie::Cycle} to go through a list over and over\n" +"again. Once you get to the end of the list, you go back to the beginning." +msgstr "" + +#: gnu/packages/perl.scm:7027 msgid "Ordered associative arrays for Perl" msgstr "" -#: gnu/packages/perl.scm:5802 +#: gnu/packages/perl.scm:7028 msgid "" "This Perl module implements Perl hashes that preserve the\n" "order in which the hash elements were added. The order is not affected when\n" @@ -8462,42 +11037,42 @@ msgid "" "operations can also be performed on the IxHash." msgstr "" -#: gnu/packages/perl.scm:5825 +#: gnu/packages/perl.scm:7051 msgid "Tie to an existing Perl object" msgstr "" -#: gnu/packages/perl.scm:5826 +#: gnu/packages/perl.scm:7052 msgid "" "This class provides a tie constructor that returns the\n" "object it was given as it's first argument. This way side effects of calling\n" "$object->TIEHASH are avoided." msgstr "" -#: gnu/packages/perl.scm:5848 +#: gnu/packages/perl.scm:7074 msgid "English expression of durations" msgstr "" -#: gnu/packages/perl.scm:5849 +#: gnu/packages/perl.scm:7075 msgid "" "This module provides functions for expressing durations in\n" "rounded or exact terms." msgstr "" -#: gnu/packages/perl.scm:5871 +#: gnu/packages/perl.scm:7097 msgid "Parse time duration strings" msgstr "" -#: gnu/packages/perl.scm:5872 +#: gnu/packages/perl.scm:7098 msgid "" "Time::Duration::Parse is a module to parse human readable\n" "duration strings like \"2 minutes\" and \"3 seconds\" to seconds." msgstr "" -#: gnu/packages/perl.scm:5890 +#: gnu/packages/perl.scm:7116 msgid "Efficiently compute time from local and GMT time" msgstr "" -#: gnu/packages/perl.scm:5891 +#: gnu/packages/perl.scm:7117 msgid "" "This module provides functions that are the inverse of\n" "built-in perl functions localtime() and gmtime(). They accept a date as a\n" @@ -8505,103 +11080,133 @@ msgid "" "the system epoch." msgstr "" -#: gnu/packages/perl.scm:5911 +#: gnu/packages/perl.scm:7137 msgid "Date parsing/formatting subroutines" msgstr "" -#: gnu/packages/perl.scm:5912 +#: gnu/packages/perl.scm:7138 msgid "" "This module provides routines for parsing date string into\n" "time values and formatting dates into ASCII strings." msgstr "" -#: gnu/packages/perl.scm:5934 +#: gnu/packages/perl.scm:7160 msgid "Shift and scale time" msgstr "" -#: gnu/packages/perl.scm:5935 +#: gnu/packages/perl.scm:7161 msgid "" "This module allows you to speed up your sleep(), alarm(),\n" "and time() calls." msgstr "" -#: gnu/packages/perl.scm:5958 +#: gnu/packages/perl.scm:7184 msgid "Simple tree object" msgstr "" -#: gnu/packages/perl.scm:5959 +#: gnu/packages/perl.scm:7185 msgid "" "This module in a fully object-oriented implementation of a\n" "simple n-ary tree." msgstr "" -#: gnu/packages/perl.scm:5983 +#: gnu/packages/perl.scm:7209 msgid "Factory object for dispensing Visitor objects" msgstr "" -#: gnu/packages/perl.scm:5984 +#: gnu/packages/perl.scm:7210 msgid "" "This module is a factory for dispensing\n" "Tree::Simple::Visitor::* objects." msgstr "" -#: gnu/packages/perl.scm:6002 +#: gnu/packages/perl.scm:7228 msgid "Minimal try/catch with proper preservation of $@" msgstr "" -#: gnu/packages/perl.scm:6003 +#: gnu/packages/perl.scm:7229 msgid "" "This module provides bare bones try/catch/finally statements\n" "that are designed to minimize common mistakes with eval blocks, and nothing\n" "else." msgstr "" -#: gnu/packages/perl.scm:6024 +#: gnu/packages/perl.scm:7250 msgid "Data types for common serialisation formats" msgstr "" -#: gnu/packages/perl.scm:6025 +#: gnu/packages/perl.scm:7251 msgid "" "This module provides some extra datatypes that are used by\n" "common serialisation formats such as JSON or CBOR." msgstr "" -#: gnu/packages/perl.scm:6044 +#: gnu/packages/perl.scm:7269 +msgid "Unicode normalization forms" +msgstr "" + +#: gnu/packages/perl.scm:7270 +msgid "This Perl module provides Unicode normalization forms." +msgstr "" + +#: gnu/packages/perl.scm:7289 +msgid "Unicode collation algorithm" +msgstr "" + +#: gnu/packages/perl.scm:7290 +msgid "" +"This package provides tools for sorting and comparing\n" +"Unicode data." +msgstr "" +"Denne pakke tilbyder værktøjer for sortering og sammenligning\n" +"af Uniocodedata." + +#: gnu/packages/perl.scm:7311 msgid "Unicode line breaking algorithm" msgstr "" -#: gnu/packages/perl.scm:6046 +#: gnu/packages/perl.scm:7313 msgid "" "@code{Unicode::LineBreak} implements the line breaking algorithm\n" "described in Unicode Standard Annex #14. The @code{East_Asian_Width} property\n" "defined by Annex #11 is used to determine breaking positions." msgstr "" -#: gnu/packages/perl.scm:6065 +#: gnu/packages/perl.scm:7336 +msgid "Encoding and decoding of UTF-8 encoding form" +msgstr "" + +#: gnu/packages/perl.scm:7338 +msgid "" +"This module provides functions to encode and decode UTF-8 encoding form\n" +"as specified by Unicode and ISO/IEC 10646:2011." +msgstr "" + +#: gnu/packages/perl.scm:7356 msgid "UNIVERSAL::can() reimplementation" msgstr "" -#: gnu/packages/perl.scm:6066 +#: gnu/packages/perl.scm:7357 msgid "" "This module attempts to work around people calling\n" "UNIVERSAL::can() as a function, which it is not." msgstr "" -#: gnu/packages/perl.scm:6086 +#: gnu/packages/perl.scm:7377 msgid "UNIVERSAL::isa() reimplementation" msgstr "" -#: gnu/packages/perl.scm:6087 +#: gnu/packages/perl.scm:7378 msgid "" "This module attempts to recover from people calling\n" "UNIVERSAL::isa as a function." msgstr "" -#: gnu/packages/perl.scm:6105 +#: gnu/packages/perl.scm:7396 msgid "Associate user-defined magic to variables from Perl" msgstr "" -#: gnu/packages/perl.scm:6106 +#: gnu/packages/perl.scm:7397 msgid "" "Magic is Perl's way of enhancing variables. This mechanism\n" "lets the user add extra data to any variable and hook syntactical\n" @@ -8610,32 +11215,56 @@ msgid "" "having to write a single line of XS." msgstr "" -#: gnu/packages/perl.scm:6129 +#: gnu/packages/perl.scm:7420 +msgid "Easily generate well-formed, namespace-aware XML" +msgstr "" + +#: gnu/packages/perl.scm:7421 +msgid "" +"@code{XML::Writer} is a simple Perl module for writing XML\n" +"documents: it takes care of constructing markup and escaping data correctly.\n" +"By default, it also performs a significant amount of well-formedness checking\n" +"on the output to make certain (for example) that start and end tags match,\n" +"that there is exactly one document element, and that there are not duplicate\n" +"attribute names." +msgstr "" + +#: gnu/packages/perl.scm:7447 msgid "YAML for Perl" msgstr "" -#: gnu/packages/perl.scm:6130 +#: gnu/packages/perl.scm:7448 msgid "" "The YAML.pm module implements a YAML Loader and Dumper based\n" "on the YAML 1.0 specification." msgstr "" -#: gnu/packages/perl.scm:6153 +#: gnu/packages/perl.scm:7471 msgid "Read/Write YAML files" msgstr "" -#: gnu/packages/perl.scm:6154 +#: gnu/packages/perl.scm:7472 msgid "" "YAML::Tiny is a perl class for reading and writing\n" "YAML-style files, written with as little code as possible, reducing load time\n" "and memory overhead." msgstr "" -#: gnu/packages/perl.scm:6181 +#: gnu/packages/perl.scm:7493 +msgid "Generate and use LALR parsers" +msgstr "" + +#: gnu/packages/perl.scm:7494 +msgid "" +"This package compiles yacc-like @dfn{Look Ahead LR} (LALR)\n" +"grammars to generate Perl object oriented parser modules." +msgstr "" + +#: gnu/packages/perl.scm:7520 msgid "Distribution metadata for a CPAN dist" msgstr "" -#: gnu/packages/perl.scm:6182 +#: gnu/packages/perl.scm:7521 msgid "" "Software distributions released to the CPAN include a\n" "META.json or, for older distributions, META.yml, which describes the\n" @@ -8646,11 +11275,11 @@ msgid "" "methods for interrogating that data." msgstr "" -#: gnu/packages/perl.scm:6205 +#: gnu/packages/perl.scm:7544 msgid "Set of version requirements for a CPAN dist" msgstr "" -#: gnu/packages/perl.scm:6206 +#: gnu/packages/perl.scm:7545 msgid "" "A CPAN::Meta::Requirements object models a set of version\n" "constraints like those specified in the META.yml or META.json files in CPAN\n" @@ -8659,22 +11288,22 @@ msgid "" "representation." msgstr "" -#: gnu/packages/perl.scm:6229 +#: gnu/packages/perl.scm:7568 msgid "Read and write a subset of YAML for CPAN Meta files" msgstr "" -#: gnu/packages/perl.scm:6230 +#: gnu/packages/perl.scm:7569 msgid "" "This module implements a subset of the YAML specification\n" "for use in reading and writing CPAN metadata files like META.yml and\n" "MYMETA.yml." msgstr "" -#: gnu/packages/perl.scm:6251 +#: gnu/packages/perl.scm:7590 msgid "Build and install Perl modules" msgstr "" -#: gnu/packages/perl.scm:6252 +#: gnu/packages/perl.scm:7591 msgid "" "@code{Module::Build} is a system for building, testing, and\n" "installing Perl modules; it used to be part of Perl itself until version 5.22,\n" @@ -8685,21 +11314,21 @@ msgid "" "system---most of the @code{Module::Build} code is pure-Perl." msgstr "" -#: gnu/packages/perl.scm:6277 +#: gnu/packages/perl.scm:7616 msgid "Parse META.yml and META.json CPAN metadata files" msgstr "" -#: gnu/packages/perl.scm:6278 +#: gnu/packages/perl.scm:7617 msgid "" "Parse::CPAN::Meta is a parser for META.json and META.yml\n" "files, using JSON::PP and/or CPAN::Meta::YAML." msgstr "" -#: gnu/packages/perl.scm:6296 +#: gnu/packages/perl.scm:7635 msgid "Common Scalar and List utility subroutines" msgstr "" -#: gnu/packages/perl.scm:6297 +#: gnu/packages/perl.scm:7636 msgid "" "This package contains a selection of subroutines that people\n" "have expressed would be nice to have in the perl core, but the usage would not\n" @@ -8707,93 +11336,123 @@ msgid "" "such that being individual extensions would be wasteful." msgstr "" -#: gnu/packages/perl.scm:6321 +#: gnu/packages/perl.scm:7660 msgid "Cross-platform functions emulating common shell commands" msgstr "" -#: gnu/packages/perl.scm:6323 +#: gnu/packages/perl.scm:7662 msgid "Shell::Command is a thin wrapper around ExtUtils::Command." msgstr "" -#: gnu/packages/photo.scm:61 +#: gnu/packages/perl.scm:7689 +msgid "Object-oriented File::Find replacement in Perl" +msgstr "" + +#: gnu/packages/perl.scm:7690 +msgid "" +"File::Find::Object is an object-oriented\n" +"File::Find replacement in Perl." +msgstr "" + +#: gnu/packages/perl.scm:7719 +msgid "Alternative interface to File::Find::Object" +msgstr "" + +#: gnu/packages/perl.scm:7720 +msgid "" +"File::Find::Object::Rule is an alternative Perl\n" +"interface to File::Find::Object." +msgstr "" + +#: gnu/packages/perl.scm:7750 +msgid "Test for trailing space in Perl source files" +msgstr "" + +#: gnu/packages/perl.scm:7751 +msgid "" +"Test::TrailingSpace tests for trailing spaces\n" +"in Perl source files." +msgstr "" + +#: gnu/packages/photo.scm:64 msgid "Raw image decoder" msgstr "" -#: gnu/packages/photo.scm:63 +#: gnu/packages/photo.scm:66 msgid "" "LibRaw is a library for reading RAW files obtained from digital photo\n" "cameras (CRW/CR2, NEF, RAF, DNG, and others)." msgstr "" -#: gnu/packages/photo.scm:80 +#: gnu/packages/photo.scm:83 msgid "Read and manipulate EXIF data in digital photographs" msgstr "" -#: gnu/packages/photo.scm:82 +#: gnu/packages/photo.scm:85 msgid "" "The libexif C library allows applications to read, edit, and save EXIF\n" "data as produced by digital cameras." msgstr "" -#: gnu/packages/photo.scm:107 +#: gnu/packages/photo.scm:111 msgid "Accessing digital cameras" msgstr "" -#: gnu/packages/photo.scm:109 +#: gnu/packages/photo.scm:113 msgid "" "This is the library backend for gphoto2. It contains the code for PTP,\n" "MTP, and other vendor specific protocols for controlling and transferring data\n" "from digital cameras." msgstr "" -#: gnu/packages/photo.scm:150 +#: gnu/packages/photo.scm:154 msgid "Command-line tools to access digital cameras" msgstr "" -#: gnu/packages/photo.scm:152 +#: gnu/packages/photo.scm:156 msgid "" "Gphoto2 is a set of command line utilities for manipulating a large\n" "number of different digital cameras. Through libgphoto2, it supports PTP,\n" "MTP, and much more." msgstr "" -#: gnu/packages/photo.scm:186 +#: gnu/packages/photo.scm:189 msgid "Program and Perl library to manipulate EXIF tags" msgstr "" -#: gnu/packages/photo.scm:188 +#: gnu/packages/photo.scm:191 msgid "" "This package provides the 'exiftool' command and the 'Image::ExifTool'\n" "Perl library to manipulate EXIF tags of digital images." msgstr "" -#: gnu/packages/photo.scm:211 +#: gnu/packages/photo.scm:214 msgid "Library for panoramic images" msgstr "" -#: gnu/packages/photo.scm:213 +#: gnu/packages/photo.scm:216 msgid "" "The libpano13 package contains the backend library written by the\n" "Panorama Tools project for building panoramic images from a set of\n" "overlapping images, as well as some command line tools." msgstr "" -#: gnu/packages/photo.scm:255 +#: gnu/packages/photo.scm:260 msgid "Tools for combining and blending images" msgstr "" -#: gnu/packages/photo.scm:257 +#: gnu/packages/photo.scm:262 msgid "" "Enblend blends away the seams in a panoramic image mosaic using a\n" "multi-resolution spline. Enfuse merges different exposures of the same\n" "scene to produce an image that looks much like a tone-mapped image." msgstr "" -#: gnu/packages/qemu.scm:155 +#: gnu/packages/qemu.scm:162 msgid "Machine emulator and virtualizer" msgstr "" -#: gnu/packages/qemu.scm:157 +#: gnu/packages/qemu.scm:164 msgid "" "QEMU is a generic machine emulator and virtualizer.\n" "\n" @@ -8808,10 +11467,77 @@ msgid "" "server and embedded PowerPC, and S390 guests." msgstr "" -#: gnu/packages/qemu.scm:179 +#: gnu/packages/qemu.scm:186 msgid "Machine emulator and virtualizer (without GUI)" msgstr "" +#: gnu/packages/qemu.scm:245 +msgid "Operating system information database" +msgstr "" + +#: gnu/packages/qemu.scm:246 +msgid "" +"libosinfo is a GObject based library API for managing\n" +"information about operating systems, hypervisors and the (virtual) hardware\n" +"devices they can support. It includes a database containing device metadata\n" +"and provides APIs to match/identify optimal devices for deploying an operating\n" +"system on a hypervisor. Via GObject Introspection, the API is available in\n" +"all common programming languages. Vala bindings are also provided." +msgstr "" + +#: gnu/packages/qemu.scm:320 +msgid "Simple API for virtualization" +msgstr "" + +#: gnu/packages/qemu.scm:321 +msgid "" +"Libvirt is a C toolkit to interact with the virtualization\n" +"capabilities of recent versions of Linux. The library aims at providing long\n" +"term stable C API initially for the Xen paravirtualization but should be able\n" +"to integrate other virtualization mechanisms if needed." +msgstr "" + +#: gnu/packages/qemu.scm:362 +msgid "GLib wrapper around libvirt" +msgstr "" + +#: gnu/packages/qemu.scm:363 +msgid "" +"libvirt-glib wraps the libvirt library to provide a\n" +"high-level object-oriented API better suited for glib-based applications, via\n" +"three libraries:\n" +"\n" +"@enumerate\n" +"@item libvirt-glib - GLib main loop integration & misc helper APIs\n" +"@item libvirt-gconfig - GObjects for manipulating libvirt XML documents\n" +"@item libvirt-gobject - GObjects for managing libvirt objects\n" +"@end enumerate\n" +msgstr "" + +#: gnu/packages/qemu.scm:404 +msgid "Python bindings to libvirt" +msgstr "Pythonbindinger for libvirt" + +#: gnu/packages/qemu.scm:405 +msgid "" +"This package provides Python bindings to the libvirt\n" +"virtualization library." +msgstr "" +"Denne pakke tilbyder Pythonbindinger til virtualiseringsbiblioteket\n" +"libvirt." + +#: gnu/packages/qemu.scm:481 +msgid "Manage virtual machines" +msgstr "Håndter virtuelle maskiner" + +#: gnu/packages/qemu.scm:483 +msgid "" +"The virt-manager application is a desktop user interface for managing\n" +"virtual machines through libvirt. It primarily targets KVM VMs, but also\n" +"manages Xen and LXC (Linux containers). It presents a summary view of running\n" +"domains, their live performance and resource utilization statistics." +msgstr "" + #: gnu/packages/ratpoison.scm:85 msgid "Simple mouse-free tiling window manager" msgstr "" @@ -8832,11 +11558,11 @@ msgid "" "cripples Emacs and other quality pieces of software." msgstr "" -#: gnu/packages/readline.scm:68 +#: gnu/packages/readline.scm:82 msgid "Edit command lines while typing, with history support" msgstr "" -#: gnu/packages/readline.scm:70 +#: gnu/packages/readline.scm:84 msgid "" "The GNU readline library allows users to edit command lines as they\n" "are typed in. It can maintain a searchable history of previously entered\n" @@ -8845,11 +11571,36 @@ msgid "" "comfortable for anyone." msgstr "" -#: gnu/packages/scanner.scm:70 -msgid "Raster image scanner library and drivers" +#: gnu/packages/readline.scm:121 +msgid "Wrapper to allow the editing of keyboard commands" +msgstr "" + +#: gnu/packages/readline.scm:123 +msgid "" +"Rlwrap is a 'readline wrapper', a small utility that uses the GNU\n" +"readline library to allow the editing of keyboard input for any command. You\n" +"should consider rlwrap especially when you need user-defined completion (by way\n" +"of completion word lists) and persistent history, or if you want to program\n" +"'special effects' using the filter mechanism." +msgstr "" + +#: gnu/packages/scanner.scm:84 +msgid "Raster image scanner library and drivers, without scanner support" +msgstr "" + +#: gnu/packages/scanner.scm:85 +msgid "" +"SANE stands for \"Scanner Access Now Easy\" and is an API\n" +"proving access to any raster image scanner hardware (flatbed scanner,\n" +"hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The\n" +"package contains the library, but no drivers." +msgstr "" + +#: gnu/packages/scanner.scm:123 +msgid "Raster image scanner library and drivers, with scanner support" msgstr "" -#: gnu/packages/scanner.scm:71 +#: gnu/packages/scanner.scm:124 msgid "" "SANE stands for \"Scanner Access Now Easy\" and is an API\n" "proving access to any raster image scanner hardware (flatbed scanner,\n" @@ -8857,22 +11608,22 @@ msgid "" "package contains the library and drivers." msgstr "" -#: gnu/packages/scheme.scm:169 +#: gnu/packages/scheme.scm:185 msgid "A Scheme implementation with integrated editor and debugger" msgstr "" -#: gnu/packages/scheme.scm:171 +#: gnu/packages/scheme.scm:187 msgid "" "GNU/MIT Scheme is an implementation of the Scheme programming\n" "language. It provides an interpreter, a compiler and a debugger. It also\n" "features an integrated Emacs-like editor and a large runtime library." msgstr "" -#: gnu/packages/scheme.scm:254 +#: gnu/packages/scheme.scm:270 msgid "Efficient Scheme compiler" msgstr "" -#: gnu/packages/scheme.scm:256 +#: gnu/packages/scheme.scm:272 msgid "" "Bigloo is a Scheme implementation devoted to one goal: enabling\n" "Scheme based programming style where C(++) is usually\n" @@ -8884,11 +11635,11 @@ msgid "" "Scheme and C programs and between Scheme and Java programs." msgstr "" -#: gnu/packages/scheme.scm:300 +#: gnu/packages/scheme.scm:314 msgid "Multi-tier programming language for the Web 2.0" msgstr "" -#: gnu/packages/scheme.scm:302 +#: gnu/packages/scheme.scm:316 msgid "" "HOP is a multi-tier programming language for the Web 2.0 and the\n" "so-called diffuse Web. It is designed for programming interactive web\n" @@ -8897,33 +11648,33 @@ msgid "" "mashups, office (web agendas, mail clients, ...), etc." msgstr "" -#: gnu/packages/scheme.scm:342 +#: gnu/packages/scheme.scm:370 msgid "R5RS Scheme implementation that compiles native code via C" msgstr "" -#: gnu/packages/scheme.scm:344 +#: gnu/packages/scheme.scm:372 msgid "" "CHICKEN is a compiler for the Scheme programming language. CHICKEN\n" "produces portable and efficient C, supports almost all of the R5RS Scheme\n" "language standard, and includes many enhancements and extensions." msgstr "" -#: gnu/packages/scheme.scm:363 +#: gnu/packages/scheme.scm:391 msgid "Scheme implementation using a bytecode interpreter" msgstr "" -#: gnu/packages/scheme.scm:365 +#: gnu/packages/scheme.scm:393 msgid "" "Scheme 48 is an implementation of Scheme based on a byte-code\n" "interpreter and is designed to be used as a testbed for experiments in\n" "implementation techniques and as an expository tool." msgstr "" -#: gnu/packages/scheme.scm:441 +#: gnu/packages/scheme.scm:506 msgid "Implementation of Scheme and related languages" msgstr "" -#: gnu/packages/scheme.scm:443 +#: gnu/packages/scheme.scm:508 msgid "" "Racket is an implementation of the Scheme programming language (R5RS and\n" "R6RS) and related languages, such as Typed Racket. It features a compiler and\n" @@ -8931,11 +11682,11 @@ msgid "" "of libraries." msgstr "" -#: gnu/packages/scheme.scm:481 +#: gnu/packages/scheme.scm:546 msgid "Efficient Scheme interpreter and compiler" msgstr "" -#: gnu/packages/scheme.scm:483 +#: gnu/packages/scheme.scm:548 msgid "" "Gambit consists of two main programs: gsi, the Gambit Scheme\n" "interpreter, and gsc, the Gambit Scheme compiler. The interpreter contains\n" @@ -8946,11 +11697,11 @@ msgid "" "mixed." msgstr "" -#: gnu/packages/scheme.scm:520 +#: gnu/packages/scheme.scm:582 msgid "Small embeddable Scheme implementation" msgstr "" -#: gnu/packages/scheme.scm:522 +#: gnu/packages/scheme.scm:584 msgid "" "Chibi-Scheme is a very small library with no external dependencies\n" "intended for use as an extension and scripting language in C programs. In\n" @@ -8959,11 +11710,11 @@ msgid "" "threads." msgstr "" -#: gnu/packages/scheme.scm:693 +#: gnu/packages/scheme.scm:755 msgid "Scmutils library for MIT Scheme" msgstr "" -#: gnu/packages/scheme.scm:694 +#: gnu/packages/scheme.scm:756 msgid "" "The Scmutils system is an integrated library of\n" "procedures, embedded in the programming language Scheme, and intended to\n" @@ -8971,11 +11722,25 @@ msgid "" "engineering." msgstr "" -#: gnu/packages/search.scm:52 +#: gnu/packages/scheme.scm:804 +msgid "Structure and Interpretation of Computer Programs" +msgstr "" + +#: gnu/packages/scheme.scm:805 +msgid "" +"Structure and Interpretation of Computer Programs (SICP) is\n" +"a textbook aiming to teach the principles of computer programming.\n" +"\n" +"Using Scheme, a dialect of the Lisp programming language, the book explains\n" +"core computer science concepts such as abstraction in programming,\n" +"metalinguistic abstraction, recursion, interpreters, and modular programming." +msgstr "" + +#: gnu/packages/search.scm:63 msgid "Search Engine Library" msgstr "" -#: gnu/packages/search.scm:54 +#: gnu/packages/search.scm:65 msgid "" "Xapian is a highly adaptable toolkit which allows developers to easily\n" "add advanced indexing and search facilities to their own applications. It\n" @@ -8983,11 +11748,11 @@ msgid "" "rich set of boolean query operators." msgstr "" -#: gnu/packages/search.scm:97 +#: gnu/packages/search.scm:108 msgid "Tool for Obsessive Compulsive Classifiers" msgstr "" -#: gnu/packages/search.scm:99 +#: gnu/packages/search.scm:110 msgid "" "libtocc is the engine of the Tocc project, a tag-based file management\n" "system. The goal of Tocc is to provide a better system for classifying files\n" @@ -8995,21 +11760,21 @@ msgid "" "files and directories." msgstr "" -#: gnu/packages/search.scm:121 +#: gnu/packages/search.scm:132 msgid "Command-line interface to libtocc" msgstr "Kommandolinjegrænseflade til libtocc" -#: gnu/packages/search.scm:123 +#: gnu/packages/search.scm:134 msgid "" "Tocc is a tag-based file management system. This package contains the\n" "command line tool for interacting with libtocc." msgstr "" -#: gnu/packages/search.scm:141 +#: gnu/packages/search.scm:152 msgid "Finding text and HTML files that match boolean expressions" msgstr "Find tekst- og HTML-filer som matcher booleske udtryk" -#: gnu/packages/search.scm:143 +#: gnu/packages/search.scm:154 msgid "" "GNU Bool is a utility to perform text searches on files using Boolean\n" "expressions. For example, a search for \"hello AND world\" would return a\n" @@ -9020,6 +11785,31 @@ msgid "" "for parsing HTML files." msgstr "" +#: gnu/packages/search.scm:176 +msgid "Locate files on the file system" +msgstr "Lokaliser filer på filsystemet" + +#: gnu/packages/search.scm:178 +msgid "" +"mlocate is a locate/updatedb implementation. The 'm' stands for\n" +"\"merging\": @code{updatedb} reuses the existing database to avoid rereading\n" +"most of the file system, which makes it faster and does not trash the system\n" +"caches as much. The locate(1) utility is intended to be completely compatible\n" +"with slocate, and attempts to be compatible to GNU locate when it does not\n" +"conflict with slocate compatibility." +msgstr "" + +#: gnu/packages/search.scm:240 +msgid "Web indexing system" +msgstr "" + +#: gnu/packages/search.scm:242 +msgid "" +"Swish-e is Simple Web Indexing System for Humans - Enhanced. Swish-e\n" +"can quickly and easily index directories of files or remote web sites and\n" +"search the generated indexes." +msgstr "" + #: gnu/packages/serveez.scm:51 msgid "Framework for implementing IP-based servers" msgstr "Ramme for implementering af IP-baserede servere" @@ -9035,11 +11825,88 @@ msgid "" "server and an IRC server." msgstr "" -#: gnu/packages/telephony.scm:52 +#: gnu/packages/shells.scm:70 +msgid "POSIX-compliant shell optimised for size" +msgstr "" + +#: gnu/packages/shells.scm:72 +msgid "" +"dash is a POSIX-compliant @command{/bin/sh} implementation that aims to be\n" +"as small as possible, often without sacrificing speed. It is faster than the\n" +"GNU Bourne-Again Shell (@command{bash}) at most scripted tasks. dash is a\n" +"direct descendant of NetBSD's Almquist Shell (@command{ash})." +msgstr "" + +#: gnu/packages/shells.scm:116 +msgid "The friendly interactive shell" +msgstr "" + +#: gnu/packages/shells.scm:118 +msgid "" +"Fish (friendly interactive shell) is a shell focused on interactive use,\n" +"discoverability, and friendliness. Fish has very user-friendly and powerful\n" +"tab-completion, including descriptions of every completion, completion of\n" +"strings with wildcards, and many completions for specific commands. It also\n" +"has extensive and discoverable help. A special help command gives access to\n" +"all the fish documentation in your web browser. Other features include smart\n" +"terminal handling based on terminfo, an easy to search history, and syntax\n" +"highlighting." +msgstr "" + +#: gnu/packages/shells.scm:167 +msgid "Alternative implementation of the rc shell by Byron Rakitzis" +msgstr "" + +#: gnu/packages/shells.scm:169 +msgid "" +"This is a reimplementation by Byron Rakitzis of the Plan 9 shell. It\n" +"has a small feature set similar to a traditional Bourne shell." +msgstr "" + +#: gnu/packages/shells.scm:226 +msgid "Unix shell based on csh" +msgstr "" + +#: gnu/packages/shells.scm:228 +msgid "" +"Tcsh is an enhanced, but completely compatible version of the Berkeley\n" +"UNIX C shell (csh). It is a command language interpreter usable both as an\n" +"interactive login shell and a shell script command processor. It includes a\n" +"command-line editor, programmable word completion, spelling correction, a\n" +"history mechanism, job control and a C-like syntax." +msgstr "" + +#: gnu/packages/shells.scm:286 +msgid "Powerful shell for interactive use and scripting" +msgstr "Funktionsrig skal for interaktiv brug og skriptopbygning" + +#: gnu/packages/shells.scm:287 +msgid "" +"The Z shell (zsh) is a Unix shell that can be used\n" +"as an interactive login shell and as a powerful command interpreter\n" +"for shell scripting. Zsh can be thought of as an extended Bourne shell\n" +"with a large number of improvements, including some features of bash,\n" +"ksh, and tcsh." +msgstr "" + +#: gnu/packages/shells.scm:326 +msgid "Python-ish shell" +msgstr "" + +#: gnu/packages/shells.scm:328 +msgid "" +"Xonsh is a Python-ish, BASHwards-looking shell language and command\n" +"prompt. The language is a superset of Python 3.4+ with additional shell\n" +"primitives that you are used to from Bash and IPython. It works on all major\n" +"systems including Linux, Mac OSX, and Windows. Xonsh is meant for the daily\n" +"use of experts and novices alike." +msgstr "" + +#: gnu/packages/telephony.scm:66 msgid "(u)Common C++ framework for threaded applications" msgstr "(u)Common C++-ramme for trådede programmer" -#: gnu/packages/telephony.scm:53 +#: gnu/packages/telephony.scm:67 msgid "" "GNU Common C++ is an portable, optimized class framework for\n" "threaded applications, supporting concurrent synchronization, inter-process\n" @@ -9048,11 +11915,11 @@ msgid "" "reimplementation." msgstr "" -#: gnu/packages/telephony.scm:73 +#: gnu/packages/telephony.scm:87 msgid "Common C++ framework for threaded applications" msgstr "" -#: gnu/packages/telephony.scm:74 +#: gnu/packages/telephony.scm:88 msgid "" "GNU uCommon C++ is meant as a very light-weight C++ library\n" "to facilitate using C++ design patterns even for very deeply embedded\n" @@ -9060,11 +11927,11 @@ msgid "" "support." msgstr "" -#: gnu/packages/telephony.scm:95 +#: gnu/packages/telephony.scm:110 msgid "Implementation of RTP (real-time transport protocol)" msgstr "" -#: gnu/packages/telephony.scm:96 +#: gnu/packages/telephony.scm:111 msgid "" "GNU ccRTP is an implementation of RTP, the real-time transport\n" "protocol from the IETF. It is suitable both for high capacity servers and\n" @@ -9073,22 +11940,22 @@ msgid "" "packet-manipulation library." msgstr "" -#: gnu/packages/telephony.scm:116 +#: gnu/packages/telephony.scm:131 msgid "Library implementing SIP (RFC-3261)" msgstr "" -#: gnu/packages/telephony.scm:117 +#: gnu/packages/telephony.scm:132 msgid "" "GNU oSIP is an implementation of the SIP protocol. It is\n" "used to provide multimedia and telecom software developers with an interface\n" "to initiate and control SIP sessions." msgstr "" -#: gnu/packages/telephony.scm:137 +#: gnu/packages/telephony.scm:151 msgid "Sip abstraction library" msgstr "" -#: gnu/packages/telephony.scm:138 +#: gnu/packages/telephony.scm:152 msgid "" "EXosip is a library that hides the complexity of using the\n" "SIP protocol for multimedia session establishment. This protocol is mainly to\n" @@ -9097,11 +11964,11 @@ msgid "" "multiplayer games." msgstr "" -#: gnu/packages/telephony.scm:181 +#: gnu/packages/telephony.scm:195 msgid "Secure peer-to-peer VoIP server for the SIP protocol" msgstr "" -#: gnu/packages/telephony.scm:182 +#: gnu/packages/telephony.scm:196 msgid "" "GNU SIP Witch is a peer-to-peer Voice-over-IP server that\n" "uses the SIP protocol. Calls can be made from behind NAT firewalls and\n" @@ -9111,56 +11978,55 @@ msgid "" "internet." msgstr "" -#: gnu/packages/telephony.scm:207 +#: gnu/packages/telephony.scm:240 msgid "Secure RTP (SRTP) Reference Implementation" msgstr "" -#: gnu/packages/telephony.scm:208 +#: gnu/packages/telephony.scm:241 msgid "" "This package provides an implementation of the Secure\n" "Real-time Transport Protocol (SRTP), the Universal Security Transform (UST),\n" "and a supporting cryptographic kernel." msgstr "" -#: gnu/packages/texinfo.scm:55 -msgid "The GNU documentation format" +#: gnu/packages/telephony.scm:276 +msgid "Inter-Asterisk-Protocol library" msgstr "" -#: gnu/packages/texinfo.scm:57 +#: gnu/packages/telephony.scm:277 msgid "" -"Texinfo is the official documentation format of the GNU project. It\n" -"uses a single source file using explicit commands to produce a final document\n" -"in any of several supported output formats, such as HTML or PDF. This\n" -"package includes both the tools necessary to produce Info documents from\n" -"their source and the command-line Info reader. The emphasis of the language\n" -"is on expressing the content semantically, avoiding physical markup commands." +"LibIAX2 implements the Inter-Asterisk-Protocol for relaying\n" +"Voice-over-IP (VoIP) communications." msgstr "" -#: gnu/packages/texinfo.scm:132 -msgid "Convert Texinfo to HTML" +#: gnu/packages/telephony.scm:308 +msgid "Simple VoIP program to create conferences from the terminal" msgstr "" -#: gnu/packages/texinfo.scm:134 +#: gnu/packages/telephony.scm:310 msgid "" -"Texi2HTML is a Perl script which converts Texinfo source files to HTML\n" -"output. It now supports many advanced features, such as internationalization\n" -"and extremely configurable output formats.\n" -"\n" -"Development of Texi2HTML moved to the GNU Texinfo repository in 2010, since it\n" -"was meant to replace the makeinfo implementation in GNU Texinfo. The route\n" -"forward for authors is, in most cases, to alter manuals and build processes as\n" -"necessary to use the new features of the makeinfo/texi2any implementation of\n" -"GNU Texinfo. The Texi2HTML maintainers (one of whom is the principal author\n" -"of the GNU Texinfo implementation) do not intend to make further releases of\n" -"Texi2HTML." +"Seren is a simple VoIP program based on the Opus codec that allows you\n" +"to create a voice conference from the terminal, with up to 10 participants,\n" +"without having to register accounts, exchange emails, or add people to contact\n" +"lists. All you need to join an existing conference is the host name or IP\n" +"address of one of the participants." +msgstr "" + +#: gnu/packages/telephony.scm:413 +msgid "Low-latency, high quality voice chat software" +msgstr "" + +#: gnu/packages/telephony.scm:415 +msgid "" +"Mumble is an low-latency, high quality voice chat\n" +"software primarily intended for use while gaming." msgstr "" -#: gnu/packages/texlive.scm:158 gnu/packages/texlive.scm:221 -#: gnu/packages/texlive.scm:279 +#: gnu/packages/tex.scm:169 gnu/packages/tex.scm:241 gnu/packages/tex.scm:303 msgid "TeX Live, a package of the TeX typesetting system" msgstr "" -#: gnu/packages/texlive.scm:160 +#: gnu/packages/tex.scm:171 msgid "" "TeX Live provides a comprehensive TeX document production system.\n" "It includes all the major TeX-related programs, macro packages, and fonts\n" @@ -9170,7 +12036,7 @@ msgid "" "This package contains the binaries." msgstr "" -#: gnu/packages/texlive.scm:223 +#: gnu/packages/tex.scm:243 msgid "" "TeX Live provides a comprehensive TeX document production system.\n" "It includes all the major TeX-related programs, macro packages, and fonts\n" @@ -9180,7 +12046,7 @@ msgid "" "This package contains the complete tree of texmf-dist data." msgstr "" -#: gnu/packages/texlive.scm:281 +#: gnu/packages/tex.scm:305 msgid "" "TeX Live provides a comprehensive TeX document production system.\n" "It includes all the major TeX-related programs, macro packages, and fonts\n" @@ -9190,7 +12056,7 @@ msgid "" "This package contains the complete TeX Live distribution." msgstr "" -#: gnu/packages/texlive.scm:335 +#: gnu/packages/tex.scm:360 msgid "" "TeX Live provides a comprehensive TeX document production system.\n" "It includes all the major TeX-related programs, macro packages, and fonts\n" @@ -9200,7 +12066,7 @@ msgid "" "This package contains a small subset of the texmf-dist data." msgstr "" -#: gnu/packages/texlive.scm:353 +#: gnu/packages/tex.scm:382 msgid "" "TeX Live provides a comprehensive TeX document production system.\n" "It includes all the major TeX-related programs, macro packages, and fonts\n" @@ -9210,11 +12076,34 @@ msgid "" "This package contains a small working part of the TeX Live distribution." msgstr "" -#: gnu/packages/texlive.scm:381 +#: gnu/packages/tex.scm:423 +msgid "Interface to read and parse BibTeX files" +msgstr "" + +#: gnu/packages/tex.scm:424 +msgid "" +"@code{Text::BibTeX} is a Perl library for reading, parsing,\n" +"and processing BibTeX files. @code{Text::BibTeX} gives you access to the data\n" +"at many different levels: you may work with BibTeX entries as simple field to\n" +"string mappings, or get at the original form of the data as a list of simple\n" +"values (strings, macros, or numbers) pasted together." +msgstr "" + +#: gnu/packages/tex.scm:506 +msgid "Backend for the BibLaTeX citation management tool" +msgstr "" + +#: gnu/packages/tex.scm:507 +msgid "" +"Biber is a BibTeX replacement for users of biblatex. Among\n" +"other things it comes with full Unicode support." +msgstr "" + +#: gnu/packages/tex.scm:558 msgid "Wrapper for LaTeX and friends" msgstr "" -#: gnu/packages/texlive.scm:383 +#: gnu/packages/tex.scm:560 msgid "" "Rubber is a program whose purpose is to handle all tasks related to the\n" "compilation of LaTeX documents. This includes compiling the document itself,\n" @@ -9224,11 +12113,69 @@ msgid "" "PDF documents." msgstr "" -#: gnu/packages/textutils.scm:61 +#: gnu/packages/tex.scm:602 +msgid "LaTeX editor" +msgstr "LaTeX-redigeringsprogram" + +#: gnu/packages/tex.scm:603 +msgid "" +"Texmaker is a program that integrates many tools needed to\n" +"develop documents with LaTeX, in a single application." +msgstr "" + +#: gnu/packages/tex.scm:642 +msgid "Book on TeX, plain TeX and Eplain" +msgstr "" + +#: gnu/packages/tex.scm:643 +msgid "" +"@i{TeX for the Impatient} is a ~350 page book on TeX,\n" +"plain TeX, and Eplain, originally written by Paul Abrahams, Kathryn Hargreaves,\n" +"and Karl Berry." +msgstr "" + +#: gnu/packages/texinfo.scm:55 +msgid "The GNU documentation format" +msgstr "" + +#: gnu/packages/texinfo.scm:57 +msgid "" +"Texinfo is the official documentation format of the GNU project. It\n" +"uses a single source file using explicit commands to produce a final document\n" +"in any of several supported output formats, such as HTML or PDF. This\n" +"package includes both the tools necessary to produce Info documents from\n" +"their source and the command-line Info reader. The emphasis of the language\n" +"is on expressing the content semantically, avoiding physical markup commands." +msgstr "" + +#: gnu/packages/texinfo.scm:125 +msgid "Standalone Info documentation reader" +msgstr "" + +#: gnu/packages/texinfo.scm:155 +msgid "Convert Texinfo to HTML" +msgstr "" + +#: gnu/packages/texinfo.scm:157 +msgid "" +"Texi2HTML is a Perl script which converts Texinfo source files to HTML\n" +"output. It now supports many advanced features, such as internationalization\n" +"and extremely configurable output formats.\n" +"\n" +"Development of Texi2HTML moved to the GNU Texinfo repository in 2010, since it\n" +"was meant to replace the makeinfo implementation in GNU Texinfo. The route\n" +"forward for authors is, in most cases, to alter manuals and build processes as\n" +"necessary to use the new features of the makeinfo/texi2any implementation of\n" +"GNU Texinfo. The Texi2HTML maintainers (one of whom is the principal author\n" +"of the GNU Texinfo implementation) do not intend to make further releases of\n" +"Texi2HTML." +msgstr "" + +#: gnu/packages/textutils.scm:74 msgid "Text encoding converter" msgstr "" -#: gnu/packages/textutils.scm:62 +#: gnu/packages/textutils.scm:75 msgid "" "The Recode library converts files between character sets and\n" "usages. It recognises or produces over 200 different character sets (or about\n" @@ -9238,53 +12185,61 @@ msgid "" "handy front-end to the library." msgstr "" -#: gnu/packages/textutils.scm:90 +#: gnu/packages/textutils.scm:103 msgid "Text encoding detection tool" msgstr "" -#: gnu/packages/textutils.scm:91 +#: gnu/packages/textutils.scm:104 msgid "" "Enca (Extremely Naive Charset Analyser) consists of libenca,\n" "an encoding detection library, and enca, a command line frontend, integrating\n" "libenca and several charset conversion libraries and tools." msgstr "" -#: gnu/packages/textutils.scm:118 +#: gnu/packages/textutils.scm:131 msgid "C library for processing UTF-8 Unicode data" msgstr "" -#: gnu/packages/textutils.scm:119 +#: gnu/packages/textutils.scm:132 msgid "" "utf8proc is a small C library that provides Unicode\n" "normalization, case-folding, and other operations for data in the UTF-8\n" -"encoding, supporting Unicode version 7.0." +"encoding, supporting Unicode version 9.0.0." msgstr "" -#: gnu/packages/textutils.scm:148 +#: gnu/packages/textutils.scm:161 msgid "Gordon's text utils library" msgstr "" -#: gnu/packages/textutils.scm:150 +#: gnu/packages/textutils.scm:163 msgid "" "libgtextutils is a text utilities library used by the fastx toolkit from\n" "the Hannon Lab." msgstr "" -#: gnu/packages/textutils.scm:182 +#: gnu/packages/textutils.scm:195 msgid "C++ hash functions for strings" msgstr "" -#: gnu/packages/textutils.scm:184 +#: gnu/packages/textutils.scm:197 msgid "" "CityHash provides hash functions for strings. The functions mix the\n" "input bits thoroughly but are not suitable for cryptography." msgstr "" -#: gnu/packages/textutils.scm:201 +#: gnu/packages/textutils.scm:234 +msgid "String library with very low memory overhead" +msgstr "" + +#: gnu/packages/textutils.scm:236 +msgid "Ustr is a string library for C with very low memory overhead." +msgstr "" + +#: gnu/packages/textutils.scm:257 msgid "C/C++ configuration file library" msgstr "" -#: gnu/packages/textutils.scm:203 +#: gnu/packages/textutils.scm:259 msgid "" "Libconfig is a simple library for manipulating structured configuration\n" "files. This file format is more compact and more readable than XML. And\n" @@ -9292,11 +12247,11 @@ msgid "" "application code." msgstr "" -#: gnu/packages/textutils.scm:223 +#: gnu/packages/textutils.scm:279 msgid "Probabilistic fast file fingerprinting tool" msgstr "" -#: gnu/packages/textutils.scm:225 +#: gnu/packages/textutils.scm:281 msgid "" "pfff is a tool for calculating a compact digital fingerprint of a file\n" "by sampling randomly from the file instead of reading it in full.\n" @@ -9305,6 +12260,61 @@ msgid "" "as existing hashing techniques, with provably negligible risk of collisions." msgstr "" +#: gnu/packages/textutils.scm:302 +msgid "Regular expression library" +msgstr "Regulært udtryksbibliotek" + +#: gnu/packages/textutils.scm:303 +msgid "" +"Oniguruma is a regular expressions library. The special\n" +"characteristic of this library is that different character encoding for every\n" +"regular expression object can be specified." +msgstr "" + +#: gnu/packages/textutils.scm:336 +msgid "Microsoft Word document reader" +msgstr "Microsoft Word-dokumentlæser" + +#: gnu/packages/textutils.scm:337 +msgid "" +"Antiword is an application for displaying Microsoft Word\n" +"documents. It can also convert the document to PostScript or XML. Only\n" +"documents made by MS Word version 2 and version 6 or later are supported. The\n" +"name comes from: \"The antidote against people who send Microsoft Word files\n" +"to everybody, because they believe that everybody runs Windows and therefore\n" +"runs Word\"." +msgstr "" + +#: gnu/packages/textutils.scm:379 +msgid "Portable C++ library for handling UTF-8" +msgstr "Flytbart C++-bibliotek til håndtering af UTF-8" + +#: gnu/packages/textutils.scm:380 +msgid "" +"UTF8-CPP is a C++ library for handling UTF-8 encoded text\n" +"in a portable way." +msgstr "" + +#: gnu/packages/textutils.scm:446 +msgid "Bayesian text and email classifier" +msgstr "" + +#: gnu/packages/textutils.scm:448 +msgid "" +"dbacl is a fast Bayesian text and email classifier. It builds a variety\n" +"of language models using maximum entropy (minimum divergence) principles, and\n" +"these can then be used to categorize input data automatically among multiple\n" +"categories." +msgstr "" + +#: gnu/packages/textutils.scm:490 +msgid "Configuration file parser library" +msgstr "" + +#: gnu/packages/textutils.scm:492 +msgid "C library for creating and parsing configuration files." +msgstr "" + #: gnu/packages/version-control.scm:105 msgid "Version control system supporting both distributed and centralized workflows" msgstr "" @@ -9316,43 +12326,42 @@ msgid "" "as well as the classic centralized workflow." msgstr "" -#: gnu/packages/version-control.scm:271 +#: gnu/packages/version-control.scm:306 msgid "Distributed version control system" msgstr "" -#: gnu/packages/version-control.scm:273 +#: gnu/packages/version-control.scm:308 msgid "" "Git is a free distributed version control system designed to handle\n" "everything from small to very large projects with speed and efficiency." msgstr "" -#: gnu/packages/version-control.scm:318 -msgid "Man pages of the Git version control system" +#: gnu/packages/version-control.scm:362 +msgid "Library providing Git core methods" msgstr "" -#: gnu/packages/version-control.scm:320 +#: gnu/packages/version-control.scm:364 msgid "" -"This package provides the man pages of the Git version control system.\n" -"This is the documentation displayed when using the '--help' option of a 'git'\n" -"command." +"Libgit2 is a portable, pure C implementation of the Git core methods\n" +"provided as a re-entrant linkable library with a solid API, allowing you to\n" +"write native speed custom Git applications in any language with bindings." msgstr "" -#: gnu/packages/version-control.scm:359 -msgid "Library providing Git core methods" +#: gnu/packages/version-control.scm:425 +msgid "Web frontend for git repositories" msgstr "" -#: gnu/packages/version-control.scm:361 +#: gnu/packages/version-control.scm:427 msgid "" -"Libgit2 is a portable, pure C implementation of the Git core methods\n" -"provided as a re-entrant linkable library with a solid API, allowing you to\n" -"write native speed custom Git applications in any language with bindings." +"CGit is an attempt to create a fast web interface for the Git SCM, using\n" +"a built-in cache to decrease server I/O pressure." msgstr "" -#: gnu/packages/version-control.scm:400 +#: gnu/packages/version-control.scm:464 msgid "Command-line flags library for shell scripts" msgstr "" -#: gnu/packages/version-control.scm:402 +#: gnu/packages/version-control.scm:466 msgid "" "Shell Flags (shFlags) is a library written to greatly simplify the\n" "handling of command-line flags in Bourne based Unix shell scripts (bash, dash,\n" @@ -9363,11 +12372,11 @@ msgid "" "will work." msgstr "" -#: gnu/packages/version-control.scm:445 +#: gnu/packages/version-control.scm:509 msgid "Git extensions for Vincent Driessen's branching model" msgstr "" -#: gnu/packages/version-control.scm:447 +#: gnu/packages/version-control.scm:511 msgid "" "Vincent Driessen's branching model is a git branching and release\n" "management strategy that helps developers keep track of features, hotfixes,\n" @@ -9376,43 +12385,43 @@ msgid "" "lot easier." msgstr "" -#: gnu/packages/version-control.scm:482 +#: gnu/packages/version-control.scm:546 msgid "Run a command over a sequence of commits" msgstr "" -#: gnu/packages/version-control.scm:484 +#: gnu/packages/version-control.scm:548 msgid "" "git-test-sequence is similar to an automated git bisect except it’s\n" "linear. It will test every change between two points in the DAG. It will\n" "also walk each side of a merge and test those changes individually." msgstr "" -#: gnu/packages/version-control.scm:542 +#: gnu/packages/version-control.scm:603 msgid "Git access control layer" msgstr "" -#: gnu/packages/version-control.scm:544 +#: gnu/packages/version-control.scm:605 msgid "" "Gitolite is an access control layer on top of Git, providing fine access\n" "control to Git repositories." msgstr "" -#: gnu/packages/version-control.scm:568 +#: gnu/packages/version-control.scm:629 msgid "Decentralized version control system" msgstr "" -#: gnu/packages/version-control.scm:570 +#: gnu/packages/version-control.scm:631 msgid "" "Mercurial is a free, distributed source control management tool.\n" "It efficiently handles projects of any size\n" "and offers an easy and intuitive interface." msgstr "" -#: gnu/packages/version-control.scm:604 +#: gnu/packages/version-control.scm:665 msgid "HTTP and WebDAV client library" msgstr "" -#: gnu/packages/version-control.scm:605 +#: gnu/packages/version-control.scm:666 msgid "" "Neon is an HTTP and WebDAV client library, with a\n" "C interface. Features:\n" @@ -9432,11 +12441,11 @@ msgid "" "property manipulation." msgstr "" -#: gnu/packages/version-control.scm:684 +#: gnu/packages/version-control.scm:743 msgid "Revision control system" msgstr "" -#: gnu/packages/version-control.scm:686 +#: gnu/packages/version-control.scm:745 msgid "" "Subversion exists to be universally recognized and adopted as a\n" "centralized version control system characterized by its\n" @@ -9445,11 +12454,11 @@ msgid "" "projects, from individuals to large-scale enterprise operations." msgstr "" -#: gnu/packages/version-control.scm:707 +#: gnu/packages/version-control.scm:766 msgid "Per-file local revision control system" msgstr "" -#: gnu/packages/version-control.scm:709 +#: gnu/packages/version-control.scm:768 msgid "" "RCS is the original Revision Control System. It works on a\n" "file-by-file basis, in contrast to subsequent version control systems such as\n" @@ -9458,11 +12467,11 @@ msgid "" "machine." msgstr "" -#: gnu/packages/version-control.scm:736 +#: gnu/packages/version-control.scm:795 msgid "Historical centralized version control system" msgstr "" -#: gnu/packages/version-control.scm:738 +#: gnu/packages/version-control.scm:797 msgid "" "CVS is a version control system, an important component of Source\n" "Configuration Management (SCM). Using it, you can record the history of\n" @@ -9470,11 +12479,11 @@ msgid "" "RCS, PRCS, and Aegis packages." msgstr "" -#: gnu/packages/version-control.scm:771 +#: gnu/packages/version-control.scm:830 msgid "Export an RCS or CVS history as a fast-import stream" msgstr "" -#: gnu/packages/version-control.scm:772 +#: gnu/packages/version-control.scm:831 msgid "" "This program analyzes a collection of RCS files in a CVS\n" "repository (or outside of one) and, when possible, emits an equivalent history\n" @@ -9487,11 +12496,11 @@ msgid "" "masters from remote CVS hosts." msgstr "" -#: gnu/packages/version-control.scm:799 +#: gnu/packages/version-control.scm:858 msgid "Version-control-agnostic ChangeLog diff and commit tool" msgstr "" -#: gnu/packages/version-control.scm:801 +#: gnu/packages/version-control.scm:860 msgid "" "The vc-dwim package contains two tools, \"vc-dwim\" and \"vc-chlog\".\n" "vc-dwim is a tool that simplifies the task of maintaining a ChangeLog and\n" @@ -9501,33 +12510,33 @@ msgid "" "standards-compliant ChangeLog entries based on the changes that it detects." msgstr "" -#: gnu/packages/version-control.scm:823 +#: gnu/packages/version-control.scm:882 msgid "Make histograms from the output of 'diff'" msgstr "" -#: gnu/packages/version-control.scm:825 +#: gnu/packages/version-control.scm:884 msgid "" "Diffstat reads the output of 'diff' and displays a histogram of the\n" "insertions, deletions, and modifications per-file. It is useful for reviewing\n" "large, complex patch files." msgstr "" -#: gnu/packages/version-control.scm:866 +#: gnu/packages/version-control.scm:923 msgid "File-based version control like SCCS" msgstr "" -#: gnu/packages/version-control.scm:867 +#: gnu/packages/version-control.scm:924 msgid "" "GNU CSSC provides a replacement for the legacy Unix source\n" "code control system SCCS. This allows old code still under that system to be\n" "accessed and migrated on modern systems." msgstr "" -#: gnu/packages/version-control.scm:948 +#: gnu/packages/version-control.scm:1003 msgid "Project change supervisor" msgstr "" -#: gnu/packages/version-control.scm:949 +#: gnu/packages/version-control.scm:1004 msgid "" "Aegis is a project change supervisor, and performs some of\n" "the Software Configuration Management needed in a CASE environment. Aegis\n" @@ -9538,32 +12547,47 @@ msgid "" "any project with more than one developer, is one of Aegis's major functions." msgstr "" -#: gnu/packages/version-control.scm:977 +#: gnu/packages/version-control.scm:1053 +msgid "Edit version-control repository history" +msgstr "" + +#: gnu/packages/version-control.scm:1054 +msgid "" +"Reposurgeon enables risky operations that version-control\n" +"systems don't want to let you do, such as editing past comments and metadata\n" +"and removing commits. It works with any version control system that can\n" +"export and import Git fast-import streams, including Git, Mercurial, Fossil,\n" +"Bazaar, CVS, RCS, and Src. It can also read Subversion dump files directly\n" +"and can thus be used to script production of very high-quality conversions\n" +"from Subversion to any supported Distributed Version Control System (DVCS)." +msgstr "" + +#: gnu/packages/version-control.scm:1093 msgid "Ncurses-based text user interface for Git" msgstr "" -#: gnu/packages/version-control.scm:979 +#: gnu/packages/version-control.scm:1095 msgid "" "Tig is an ncurses text user interface for Git, primarily intended as\n" "a history browser. It can also stage hunks for commit, or colorize the\n" "output of the 'git' command." msgstr "" -#: gnu/packages/version-control.scm:1005 +#: gnu/packages/version-control.scm:1121 msgid "Print the modification time of the latest file" msgstr "" -#: gnu/packages/version-control.scm:1007 +#: gnu/packages/version-control.scm:1123 msgid "" "Recursively find the newest file in a file tree and print its\n" "modification time." msgstr "" -#: gnu/packages/version-control.scm:1032 +#: gnu/packages/version-control.scm:1148 msgid "Multiple repository management tool" msgstr "" -#: gnu/packages/version-control.scm:1034 +#: gnu/packages/version-control.scm:1150 msgid "" "Myrepos provides the @code{mr} command, which maps an operation (e.g.,\n" "fetching updates) over a collection of version control repositories. It\n" @@ -9571,16 +12595,37 @@ msgid "" "Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity." msgstr "" -#: gnu/packages/version-control.scm:1064 +#: gnu/packages/version-control.scm:1180 msgid "Use hubic as a git-annex remote" msgstr "" -#: gnu/packages/version-control.scm:1066 +#: gnu/packages/version-control.scm:1182 msgid "" "This package allows you to use your hubic account as a \"special\n" "repository\" with git-annex." msgstr "" +#: gnu/packages/version-control.scm:1232 +msgid "Software configuration management system" +msgstr "" + +#: gnu/packages/version-control.scm:1234 +msgid "" +"Fossil is a distributed source control management system which supports\n" +"access and administration over HTTP CGI or via a built-in HTTP server. It has\n" +"a built-in wiki, built-in file browsing, built-in tickets system, etc." +msgstr "" + +#: gnu/packages/version-control.scm:1262 +msgid "Static git page generator" +msgstr "" + +#: gnu/packages/version-control.scm:1263 +msgid "" +"Stagit creates static pages for git repositories, the results can\n" +"be served with a HTTP file server of your choice." +msgstr "" + #: gnu/packages/webkit.scm:123 msgid "Web content engine for GTK+" msgstr "" @@ -9592,11 +12637,11 @@ msgid "" "HTML/CSS applications to full-fledged web browsers." msgstr "" -#: gnu/packages/web.scm:89 +#: gnu/packages/web.scm:114 msgid "Featureful HTTP server" msgstr "" -#: gnu/packages/web.scm:91 +#: gnu/packages/web.scm:116 msgid "" "The Apache HTTP Server Project is a collaborative software development\n" "effort aimed at creating a robust, commercial-grade, featureful, and\n" @@ -9606,85 +12651,120 @@ msgid "" "and its related documentation." msgstr "" -#: gnu/packages/web.scm:169 +#: gnu/packages/web.scm:194 msgid "HTTP and reverse proxy server" msgstr "" -#: gnu/packages/web.scm:171 +#: gnu/packages/web.scm:196 msgid "" "Nginx (\"engine X\") is a high-performance web and reverse proxy server\n" "created by Igor Sysoev. It can be used both as a standalone web server\n" "and as a proxy to reduce the load on back-end HTTP or mail servers." msgstr "" -#: gnu/packages/web.scm:207 +#: gnu/packages/web.scm:225 +msgid "Language-independent, high-performant extension to CGI" +msgstr "" + +#: gnu/packages/web.scm:226 +msgid "" +"FastCGI is a language independent, scalable extension to CGI\n" +"that provides high performance without the limitations of server specific\n" +"APIs." +msgstr "" + +#: gnu/packages/web.scm:262 +msgid "Simple server for running CGI applications over FastCGI" +msgstr "" + +#: gnu/packages/web.scm:263 +msgid "" +"Fcgiwrap is a simple server for running CGI applications\n" +"over FastCGI. It hopes to provide clean CGI support to Nginx (and other web\n" +"servers that may need it)." +msgstr "" + +#: gnu/packages/web.scm:294 msgid "PSGI/Plack web server" msgstr "" -#: gnu/packages/web.scm:208 +#: gnu/packages/web.scm:295 msgid "" "Starman is a PSGI perl web server that has unique features\n" "such as high performance, preforking, signal support, superdaemon awareness,\n" "and UNIX socket support." msgstr "" -#: gnu/packages/web.scm:227 +#: gnu/packages/web.scm:314 msgid "JSON C library" msgstr "" -#: gnu/packages/web.scm:229 +#: gnu/packages/web.scm:316 msgid "" "Jansson is a C library for encoding, decoding and manipulating JSON\n" "data." msgstr "" -#: gnu/packages/web.scm:261 +#: gnu/packages/web.scm:348 msgid "JSON implementation in C" msgstr "" -#: gnu/packages/web.scm:263 +#: gnu/packages/web.scm:350 msgid "" "JSON-C implements a reference counting object model that allows you to\n" "easily construct JSON objects in C, output them as JSON formatted strings and\n" "parse JSON formatted strings back into the C representation of JSON objects." msgstr "" -#: gnu/packages/web.scm:289 +#: gnu/packages/web.scm:433 +msgid "Hierarchical data exploration with zoomable HTML5 pie charts" +msgstr "" + +#: gnu/packages/web.scm:435 +msgid "" +"Krona is a flexible tool for exploring the relative proportions of\n" +"hierarchical data, such as metagenomic classifications, using a radial,\n" +"space-filling display. It is implemented using HTML5 and JavaScript, allowing\n" +"charts to be explored locally or served over the Internet, requiring only a\n" +"current version of any major web browser." +msgstr "" + +#: gnu/packages/web.scm:463 msgid "JSON parser/generator for C++ with both SAX/DOM style API" msgstr "" -#: gnu/packages/web.scm:291 +#: gnu/packages/web.scm:465 msgid "" "RapidJSON is a fast JSON parser/generator for C++ with both SAX/DOM\n" "style API." msgstr "" -#: gnu/packages/web.scm:309 +#: gnu/packages/web.scm:483 msgid "C library for parsing JSON" msgstr "" -#: gnu/packages/web.scm:311 +#: gnu/packages/web.scm:485 msgid "" "Yet Another JSON Library (YAJL) is a small event-driven (SAX-style) JSON\n" "parser written in ANSI C and a small validating JSON generator." msgstr "" -#: gnu/packages/web.scm:341 +#: gnu/packages/web.scm:515 msgid "WebSockets library written in C" msgstr "" -#: gnu/packages/web.scm:343 +#: gnu/packages/web.scm:517 msgid "" "Libwebsockets is a library that allows C programs to establish client\n" "and server WebSockets connections---a protocol layered above HTTP that allows\n" "for efficient socket-like bidirectional reliable communication channels." msgstr "" -#: gnu/packages/web.scm:378 +#: gnu/packages/web.scm:542 msgid "C library for the Publix Suffix List" msgstr "" -#: gnu/packages/web.scm:380 +#: gnu/packages/web.scm:544 msgid "" "A \"public suffix\" is a domain name under which Internet users can\n" "directly register own names.\n" @@ -9702,21 +12782,21 @@ msgid "" "UTS#46." msgstr "" -#: gnu/packages/web.scm:426 +#: gnu/packages/web.scm:589 msgid "HTML validator and tidier" msgstr "" -#: gnu/packages/web.scm:427 +#: gnu/packages/web.scm:590 msgid "" "HTML Tidy is a command-line tool and C library that can be\n" "used to validate and fix HTML data." msgstr "" -#: gnu/packages/web.scm:468 +#: gnu/packages/web.scm:630 msgid "Light-weight HTTP/HTTPS proxy daemon" msgstr "" -#: gnu/packages/web.scm:469 +#: gnu/packages/web.scm:631 msgid "" "Tinyproxy is a light-weight HTTP/HTTPS proxy\n" "daemon. Designed from the ground up to be fast and yet small, it is an ideal\n" @@ -9725,52 +12805,52 @@ msgid "" "unavailable." msgstr "" -#: gnu/packages/web.scm:502 +#: gnu/packages/web.scm:664 msgid "Small caching web proxy" msgstr "" -#: gnu/packages/web.scm:504 +#: gnu/packages/web.scm:666 msgid "" "Polipo is a small caching web proxy (web cache, HTTP proxy, and proxy\n" "server). It was primarily designed to be used by one person or a small group\n" "of people." msgstr "" -#: gnu/packages/web.scm:524 +#: gnu/packages/web.scm:687 msgid "YAML 1.1 parser and emitter written in C" msgstr "" -#: gnu/packages/web.scm:526 +#: gnu/packages/web.scm:689 msgid "LibYAML is a YAML 1.1 parser and emitter written in C." msgstr "" -#: gnu/packages/web.scm:542 gnu/packages/web.scm:575 gnu/packages/web.scm:597 +#: gnu/packages/web.scm:706 gnu/packages/web.scm:740 gnu/packages/web.scm:763 msgid "Media stream URL parser" msgstr "" -#: gnu/packages/web.scm:543 +#: gnu/packages/web.scm:707 msgid "" "This package contains support scripts called by libquvi to\n" "parse media stream properties." msgstr "" -#: gnu/packages/web.scm:576 +#: gnu/packages/web.scm:741 msgid "" "libquvi is a library with a C API for parsing media stream\n" "URLs and extracting their actual media files." msgstr "" -#: gnu/packages/web.scm:598 +#: gnu/packages/web.scm:764 msgid "" "quvi is a command-line-tool suite to extract media files\n" "from streaming URLs. It is a command-line wrapper for the libquvi library." msgstr "" -#: gnu/packages/web.scm:661 +#: gnu/packages/web.scm:827 msgid "High-performance asynchronous HTTP client library" msgstr "" -#: gnu/packages/web.scm:663 +#: gnu/packages/web.scm:829 msgid "" "serf is a C-based HTTP client library built upon the Apache Portable\n" "Runtime (APR) library. It multiplexes connections, running the read/write\n" @@ -9778,49 +12858,49 @@ msgid "" "minimum to provide high performance operation." msgstr "" -#: gnu/packages/web.scm:718 +#: gnu/packages/web.scm:884 msgid "CSS pre-processor" msgstr "" -#: gnu/packages/web.scm:719 +#: gnu/packages/web.scm:885 msgid "" "SassC is a compiler written in C for the CSS pre-processor\n" "language known as SASS." msgstr "" -#: gnu/packages/web.scm:748 +#: gnu/packages/web.scm:914 msgid "Compile a log format string to perl-code" msgstr "" -#: gnu/packages/web.scm:749 +#: gnu/packages/web.scm:915 msgid "" "This module provides methods to compile a log format string\n" "to perl-code, for faster generation of access_log lines." msgstr "" -#: gnu/packages/web.scm:770 +#: gnu/packages/web.scm:936 msgid "SASL authentication framework" msgstr "" -#: gnu/packages/web.scm:771 +#: gnu/packages/web.scm:937 msgid "Authen::SASL provides an SASL authentication framework." msgstr "" -#: gnu/packages/web.scm:795 +#: gnu/packages/web.scm:961 msgid "Sensible default Catalyst action" msgstr "" -#: gnu/packages/web.scm:796 +#: gnu/packages/web.scm:962 msgid "" "This Catalyst action implements a sensible default end\n" "action, which will forward to the first available view." msgstr "" -#: gnu/packages/web.scm:824 +#: gnu/packages/web.scm:993 msgid "Automated REST Method Dispatching" msgstr "" -#: gnu/packages/web.scm:825 +#: gnu/packages/web.scm:994 msgid "" "This Action handles doing automatic method dispatching for\n" "REST requests. It takes a normal Catalyst action, and changes the dispatch to\n" @@ -9829,32 +12909,32 @@ msgid "" "regular method." msgstr "" -#: gnu/packages/web.scm:861 +#: gnu/packages/web.scm:1030 msgid "Storage class for Catalyst authentication using DBIx::Class" msgstr "" -#: gnu/packages/web.scm:862 +#: gnu/packages/web.scm:1031 msgid "" "The Catalyst::Authentication::Store::DBIx::Class class\n" "provides access to authentication information stored in a database via\n" "DBIx::Class." msgstr "" -#: gnu/packages/web.scm:886 +#: gnu/packages/web.scm:1055 msgid "Create only one instance of Moose component per context" msgstr "" -#: gnu/packages/web.scm:887 +#: gnu/packages/web.scm:1056 msgid "" "Catalyst::Component::InstancePerContext returns a new\n" "instance of a component on each request." msgstr "" -#: gnu/packages/web.scm:924 +#: gnu/packages/web.scm:1093 msgid "Catalyst Development Tools" msgstr "" -#: gnu/packages/web.scm:925 +#: gnu/packages/web.scm:1094 msgid "" "The Catalyst-Devel distribution includes a variety of\n" "modules useful for the development of Catalyst applications, but not required\n" @@ -9864,11 +12944,11 @@ msgid "" "modules." msgstr "" -#: gnu/packages/web.scm:954 +#: gnu/packages/web.scm:1123 msgid "Regex DispatchType for Catalyst" msgstr "" -#: gnu/packages/web.scm:955 +#: gnu/packages/web.scm:1124 msgid "" "Dispatch type managing path-matching behaviour using\n" "regexes. Regex dispatch types have been deprecated and removed from Catalyst\n" @@ -9878,32 +12958,32 @@ msgid "" "when the dispatch type is first seen in your application." msgstr "" -#: gnu/packages/web.scm:1003 +#: gnu/packages/web.scm:1172 msgid "DBIx::Class::Schema Model Class" msgstr "" -#: gnu/packages/web.scm:1004 +#: gnu/packages/web.scm:1173 msgid "" "This is a Catalyst Model for DBIx::Class::Schema-based\n" "Models." msgstr "" -#: gnu/packages/web.scm:1028 +#: gnu/packages/web.scm:1196 msgid "Request logging from within Catalyst" msgstr "" -#: gnu/packages/web.scm:1029 +#: gnu/packages/web.scm:1197 msgid "" "This Catalyst plugin enables you to create \"access logs\"\n" "from within a Catalyst application instead of requiring a webserver to do it\n" "for you. It will work even with Catalyst debug logging turned off." msgstr "" -#: gnu/packages/web.scm:1061 +#: gnu/packages/web.scm:1229 msgid "Infrastructure plugin for the Catalyst authentication framework" msgstr "" -#: gnu/packages/web.scm:1062 +#: gnu/packages/web.scm:1230 msgid "" "The authentication plugin provides generic user support for\n" "Catalyst apps. It is the basis for both authentication (checking the user is\n" @@ -9911,52 +12991,52 @@ msgid "" "system authorises them to do)." msgstr "" -#: gnu/packages/web.scm:1092 +#: gnu/packages/web.scm:1260 msgid "Role-based authorization for Catalyst" msgstr "" -#: gnu/packages/web.scm:1093 +#: gnu/packages/web.scm:1261 msgid "" "Catalyst::Plugin::Authorization::Roles provides role-based\n" "authorization for Catalyst based on Catalyst::Plugin::Authentication." msgstr "" -#: gnu/packages/web.scm:1116 +#: gnu/packages/web.scm:1284 msgid "Captchas for Catalyst" msgstr "" -#: gnu/packages/web.scm:1117 +#: gnu/packages/web.scm:1285 msgid "" "This plugin creates and validates Captcha images for\n" "Catalyst." msgstr "" -#: gnu/packages/web.scm:1143 +#: gnu/packages/web.scm:1311 msgid "Load config files of various types" msgstr "" -#: gnu/packages/web.scm:1144 +#: gnu/packages/web.scm:1312 msgid "" "This module will attempt to load find and load configuration\n" "files of various types. Currently it supports YAML, JSON, XML, INI and Perl\n" "formats." msgstr "" -#: gnu/packages/web.scm:1174 +#: gnu/packages/web.scm:1343 msgid "Catalyst generic session plugin" msgstr "" -#: gnu/packages/web.scm:1175 +#: gnu/packages/web.scm:1344 msgid "" "This plugin links the two pieces required for session\n" "management in web applications together: the state, and the store." msgstr "" -#: gnu/packages/web.scm:1201 +#: gnu/packages/web.scm:1370 msgid "Maintain session IDs using cookies" msgstr "" -#: gnu/packages/web.scm:1202 +#: gnu/packages/web.scm:1371 msgid "" "In order for Catalyst::Plugin::Session to work, the session\n" "ID needs to be stored on the client, and the session data needs to be stored\n" @@ -9964,22 +13044,22 @@ msgid "" "cookie mechanism." msgstr "" -#: gnu/packages/web.scm:1232 +#: gnu/packages/web.scm:1401 msgid "FastMmap session storage backend" msgstr "" -#: gnu/packages/web.scm:1233 +#: gnu/packages/web.scm:1402 msgid "" "Catalyst::Plugin::Session::Store::FastMmap is a fast session\n" "storage plugin for Catalyst that uses an mmap'ed file to act as a shared\n" "memory interprocess cache. It is based on Cache::FastMmap." msgstr "" -#: gnu/packages/web.scm:1256 +#: gnu/packages/web.scm:1425 msgid "Stack trace on the Catalyst debug screen" msgstr "" -#: gnu/packages/web.scm:1257 +#: gnu/packages/web.scm:1426 msgid "" "This plugin enhances the standard Catalyst debug screen by\n" "including a stack trace of your application up to the point where the error\n" @@ -9987,11 +13067,11 @@ msgid "" "number, file name, and code context surrounding the line number." msgstr "" -#: gnu/packages/web.scm:1283 +#: gnu/packages/web.scm:1452 msgid "Simple serving of static pages" msgstr "" -#: gnu/packages/web.scm:1284 +#: gnu/packages/web.scm:1453 msgid "" "The Static::Simple plugin is designed to make serving static\n" "content in your application during development quick and easy, without\n" @@ -10002,11 +13082,11 @@ msgid "" "MIME type directly to the browser, without being processed through Catalyst." msgstr "" -#: gnu/packages/web.scm:1351 +#: gnu/packages/web.scm:1520 msgid "The Catalyst Framework Runtime" msgstr "" -#: gnu/packages/web.scm:1352 +#: gnu/packages/web.scm:1521 msgid "" "Catalyst is a modern framework for making web applications.\n" "It is designed to make it easy to manage the various tasks you need to do to\n" @@ -10014,11 +13094,11 @@ msgid "" "\"plug in\" existing Perl modules that do what you need." msgstr "" -#: gnu/packages/web.scm:1382 +#: gnu/packages/web.scm:1551 msgid "Replace request base with value passed by HTTP proxy" msgstr "" -#: gnu/packages/web.scm:1383 +#: gnu/packages/web.scm:1552 msgid "" "This module is a Moose::Role which allows you more\n" "flexibility in your application's deployment configurations when deployed\n" @@ -10026,42 +13106,42 @@ msgid "" "replaced with the contents of the X-Request-Base header." msgstr "" -#: gnu/packages/web.scm:1409 +#: gnu/packages/web.scm:1578 msgid "Download data in many formats" msgstr "" -#: gnu/packages/web.scm:1410 +#: gnu/packages/web.scm:1579 msgid "" "The purpose of this module is to provide a method for\n" "downloading data into many supportable formats. For example, downloading a\n" "table based report in a variety of formats (CSV, HTML, etc.)." msgstr "" -#: gnu/packages/web.scm:1435 +#: gnu/packages/web.scm:1604 msgid "Catalyst JSON view" msgstr "" -#: gnu/packages/web.scm:1436 +#: gnu/packages/web.scm:1605 msgid "" "Catalyst::View::JSON is a Catalyst View handler that returns\n" "stash data in JSON format." msgstr "" -#: gnu/packages/web.scm:1461 +#: gnu/packages/web.scm:1631 msgid "Template View Class" msgstr "" -#: gnu/packages/web.scm:1462 +#: gnu/packages/web.scm:1632 msgid "" "This module is a Catalyst view class for the Template\n" "Toolkit." msgstr "" -#: gnu/packages/web.scm:1491 +#: gnu/packages/web.scm:1661 msgid "Trait Loading and Resolution for Catalyst Components" msgstr "" -#: gnu/packages/web.scm:1492 +#: gnu/packages/web.scm:1662 msgid "" "Adds a \"COMPONENT\" in Catalyst::Component method to your\n" "Catalyst component base class that reads the optional \"traits\" parameter\n" @@ -10070,31 +13150,31 @@ msgid "" "MooseX::Traits::Pluggable." msgstr "" -#: gnu/packages/web.scm:1517 +#: gnu/packages/web.scm:1687 msgid "Apply roles to Catalyst classes" msgstr "" -#: gnu/packages/web.scm:1518 +#: gnu/packages/web.scm:1688 msgid "" "CatalystX::RoleApplicator applies roles to Catalyst\n" "application classes." msgstr "" -#: gnu/packages/web.scm:1544 +#: gnu/packages/web.scm:1714 msgid "Catalyst development server with Starman" msgstr "" -#: gnu/packages/web.scm:1545 +#: gnu/packages/web.scm:1715 msgid "" "This module provides a Catalyst extension to replace the\n" "development server with Starman." msgstr "" -#: gnu/packages/web.scm:1569 +#: gnu/packages/web.scm:1739 msgid "Handle Common Gateway Interface requests and responses" msgstr "" -#: gnu/packages/web.scm:1570 +#: gnu/packages/web.scm:1740 msgid "" "CGI.pm is a stable, complete and mature solution for\n" "processing and preparing HTTP requests and responses. Major features include\n" @@ -10103,52 +13183,52 @@ msgid "" "headers." msgstr "" -#: gnu/packages/web.scm:1594 +#: gnu/packages/web.scm:1764 msgid "CGI interface that is CGI.pm compliant" msgstr "" -#: gnu/packages/web.scm:1595 +#: gnu/packages/web.scm:1765 msgid "" "CGI::Simple provides a relatively lightweight drop in\n" "replacement for CGI.pm. It shares an identical OO interface to CGI.pm for\n" "parameter parsing, file upload, cookie handling and header generation." msgstr "" -#: gnu/packages/web.scm:1616 +#: gnu/packages/web.scm:1786 msgid "Build structures from CGI data" msgstr "" -#: gnu/packages/web.scm:1617 +#: gnu/packages/web.scm:1787 msgid "" "This is a module for building structured data from CGI\n" "inputs, in a manner reminiscent of how PHP does." msgstr "" -#: gnu/packages/web.scm:1640 +#: gnu/packages/web.scm:1810 msgid "Date conversion routines" msgstr "" -#: gnu/packages/web.scm:1641 +#: gnu/packages/web.scm:1811 msgid "" "This module provides functions that deal with the date\n" "formats used by the HTTP protocol." msgstr "" -#: gnu/packages/web.scm:1661 +#: gnu/packages/web.scm:1831 msgid "MD5 sums for files and urls" msgstr "" -#: gnu/packages/web.scm:1662 +#: gnu/packages/web.scm:1832 msgid "" "Digest::MD5::File is a Perl extension for getting MD5 sums\n" "for files and urls." msgstr "" -#: gnu/packages/web.scm:1680 +#: gnu/packages/web.scm:1850 msgid "Perl locale encoding determination" msgstr "" -#: gnu/packages/web.scm:1682 +#: gnu/packages/web.scm:1852 msgid "" "The POSIX locale system is used to specify both the language\n" "conventions requested by the user and the preferred character set to\n" @@ -10160,91 +13240,102 @@ msgid "" "with Encode::decode(locale => $string)." msgstr "" -#: gnu/packages/web.scm:1708 +#: gnu/packages/web.scm:1883 +msgid "Syndication feed auto-discovery" +msgstr "" + +#: gnu/packages/web.scm:1884 +msgid "" +"@code{Feed::Find} implements feed auto-discovery for finding\n" +"syndication feeds, given a URI. It will discover the following feed formats:\n" +"RSS 0.91, RSS 1.0, RSS 2.0, Atom." +msgstr "" + +#: gnu/packages/web.scm:1905 msgid "Perl directory listing parser" msgstr "" -#: gnu/packages/web.scm:1710 +#: gnu/packages/web.scm:1907 msgid "" "The File::Listing module exports a single function called parse_dir(),\n" "which can be used to parse directory listings." msgstr "" -#: gnu/packages/web.scm:1742 +#: gnu/packages/web.scm:1939 msgid "Stock and mutual fund quotes" msgstr "" -#: gnu/packages/web.scm:1744 +#: gnu/packages/web.scm:1941 msgid "" "Finance::Quote gets stock quotes from various internet sources, including\n" "Yahoo! Finance, Fidelity Investments, and the Australian Stock Exchange." msgstr "" -#: gnu/packages/web.scm:1766 +#: gnu/packages/web.scm:1963 msgid "Perl extension providing access to the GSSAPIv2 library" msgstr "" -#: gnu/packages/web.scm:1767 +#: gnu/packages/web.scm:1964 msgid "" "This is a Perl extension for using GSSAPI C bindings as\n" "described in RFC 2744." msgstr "" -#: gnu/packages/web.scm:1787 +#: gnu/packages/web.scm:1984 msgid "Manipulate tables of HTML::Element" msgstr "" -#: gnu/packages/web.scm:1789 +#: gnu/packages/web.scm:1986 msgid "" "HTML::Element::Extended is a Perl extension for manipulating a table\n" "composed of HTML::Element style components." msgstr "" -#: gnu/packages/web.scm:1813 +#: gnu/packages/web.scm:2010 msgid "Perl class representing an HTML form element" msgstr "" -#: gnu/packages/web.scm:1814 +#: gnu/packages/web.scm:2011 msgid "" "Objects of the HTML::Form class represents a single HTML\n" "<form> ... </form> instance." msgstr "" -#: gnu/packages/web.scm:1836 +#: gnu/packages/web.scm:2033 msgid "Check for HTML errors in a string or file" msgstr "Kontroller for HTML-fejl i en streng eller fil" -#: gnu/packages/web.scm:1837 +#: gnu/packages/web.scm:2034 msgid "" "HTML::Lint is a pure-Perl HTML parser and checker for\n" "syntactic legitmacy." msgstr "" -#: gnu/packages/web.scm:1858 +#: gnu/packages/web.scm:2055 msgid "Extract contents from HTML tables" msgstr "Udtræk indhold fra HTML-tabeller" -#: gnu/packages/web.scm:1860 +#: gnu/packages/web.scm:2057 msgid "" "HTML::TableExtract is a Perl module for extracting the content contained\n" "in tables within an HTML document, either as text or encoded element trees." msgstr "" -#: gnu/packages/web.scm:1885 +#: gnu/packages/web.scm:2082 msgid "Work with HTML in a DOM-like tree structure" msgstr "Arbejd med HTML i en DOM-lignende træstruktur" -#: gnu/packages/web.scm:1886 +#: gnu/packages/web.scm:2083 msgid "" "This distribution contains a suite of modules for\n" "representing, creating, and extracting information from HTML syntax trees." msgstr "" -#: gnu/packages/web.scm:1906 +#: gnu/packages/web.scm:2104 msgid "Perl HTML parser class" msgstr "" -#: gnu/packages/web.scm:1908 +#: gnu/packages/web.scm:2106 msgid "" "Objects of the HTML::Parser class will recognize markup and separate\n" "it from plain text (alias data content) in HTML documents. As different\n" @@ -10252,21 +13343,21 @@ msgid "" "are invoked." msgstr "" -#: gnu/packages/web.scm:1928 +#: gnu/packages/web.scm:2126 msgid "Perl data tables useful in parsing HTML" msgstr "" -#: gnu/packages/web.scm:1930 +#: gnu/packages/web.scm:2128 msgid "" "The HTML::Tagset module contains several data tables useful in various\n" "kinds of HTML parsing operations." msgstr "" -#: gnu/packages/web.scm:1949 +#: gnu/packages/web.scm:2147 msgid "HTML-like templates" msgstr "" -#: gnu/packages/web.scm:1951 +#: gnu/packages/web.scm:2149 msgid "" "This module attempts to make using HTML templates simple and natural.\n" "It extends standard HTML with a few new HTML-esque tags: @code{<TMPL_VAR>},\n" @@ -10277,72 +13368,72 @@ msgid "" "you to separate design from the data." msgstr "" -#: gnu/packages/web.scm:1979 +#: gnu/packages/web.scm:2177 msgid "HTTP Body Parser" msgstr "" -#: gnu/packages/web.scm:1980 +#: gnu/packages/web.scm:2178 msgid "" "HTTP::Body parses chunks of HTTP POST data and supports\n" "application/octet-stream, application/json, application/x-www-form-urlencoded,\n" "and multipart/form-data." msgstr "" -#: gnu/packages/web.scm:2006 +#: gnu/packages/web.scm:2205 msgid "Minimalist HTTP user agent cookie jar" msgstr "" -#: gnu/packages/web.scm:2007 +#: gnu/packages/web.scm:2206 msgid "" "This module implements a minimalist HTTP user agent cookie\n" "jar in conformance with RFC 6265 <http://tools.ietf.org/html/rfc6265>." msgstr "" -#: gnu/packages/web.scm:2027 +#: gnu/packages/web.scm:2226 msgid "Perl HTTP cookie jars" msgstr "" -#: gnu/packages/web.scm:2029 +#: gnu/packages/web.scm:2228 msgid "" "The HTTP::Cookies class is for objects that represent a cookie jar,\n" "that is, a database of all the HTTP cookies that a given LWP::UserAgent\n" "object knows about." msgstr "" -#: gnu/packages/web.scm:2051 +#: gnu/packages/web.scm:2250 msgid "Perl simple http server class" msgstr "" -#: gnu/packages/web.scm:2053 +#: gnu/packages/web.scm:2252 msgid "" "Instances of the HTTP::Daemon class are HTTP/1.1 servers that listen\n" "on a socket for incoming requests. The HTTP::Daemon is a subclass of\n" "IO::Socket::INET, so you can perform socket operations directly on it too." msgstr "" -#: gnu/packages/web.scm:2072 +#: gnu/packages/web.scm:2271 msgid "Perl date conversion routines" msgstr "" -#: gnu/packages/web.scm:2074 +#: gnu/packages/web.scm:2273 msgid "" "The HTTP::Date module provides functions that deal with date formats\n" "used by the HTTP protocol (and then some more)." msgstr "" -#: gnu/packages/web.scm:2097 +#: gnu/packages/web.scm:2297 msgid "Perl HTTP style message" msgstr "" -#: gnu/packages/web.scm:2099 +#: gnu/packages/web.scm:2299 msgid "An HTTP::Message object contains some headers and a content body." msgstr "" -#: gnu/packages/web.scm:2118 +#: gnu/packages/web.scm:2318 msgid "Perl http content negotiation" msgstr "" -#: gnu/packages/web.scm:2120 +#: gnu/packages/web.scm:2320 msgid "" "The HTTP::Negotiate module provides a complete implementation of the\n" "HTTP content negotiation algorithm specified in\n" @@ -10352,11 +13443,11 @@ msgid "" "fields in the request." msgstr "" -#: gnu/packages/web.scm:2145 +#: gnu/packages/web.scm:2345 msgid "Parse HTTP/1.1 requests" msgstr "" -#: gnu/packages/web.scm:2146 +#: gnu/packages/web.scm:2346 msgid "" "This is an HTTP request parser. It takes chunks of text as\n" "received and returns a 'hint' as to what is required, or returns the\n" @@ -10364,74 +13455,74 @@ msgid "" "supported." msgstr "" -#: gnu/packages/web.scm:2166 +#: gnu/packages/web.scm:2366 msgid "Fast HTTP request parser" msgstr "" -#: gnu/packages/web.scm:2167 +#: gnu/packages/web.scm:2367 msgid "" "HTTP::Parser::XS is a fast, primitive HTTP request/response\n" "parser." msgstr "" -#: gnu/packages/web.scm:2188 +#: gnu/packages/web.scm:2388 msgid "Set up a CGI environment from an HTTP::Request" msgstr "" -#: gnu/packages/web.scm:2189 +#: gnu/packages/web.scm:2389 msgid "" "This module provides a convenient way to set up a CGI\n" "environment from an HTTP::Request." msgstr "" -#: gnu/packages/web.scm:2213 +#: gnu/packages/web.scm:2413 msgid "Lightweight HTTP server" msgstr "Simpel HTTP-server" -#: gnu/packages/web.scm:2214 +#: gnu/packages/web.scm:2414 msgid "" "HTTP::Server::Simple is a simple standalone HTTP daemon with\n" "no non-core module dependencies. It can be used for building a standalone\n" "http-based UI to your existing tools." msgstr "" -#: gnu/packages/web.scm:2238 +#: gnu/packages/web.scm:2439 msgid "HTTP/1.1 client" msgstr "" -#: gnu/packages/web.scm:2239 +#: gnu/packages/web.scm:2440 msgid "" "This is a very simple HTTP/1.1 client, designed for doing\n" "simple requests without the overhead of a large framework like LWP::UserAgent.\n" "It supports proxies and redirection. It also correctly resumes after EINTR." msgstr "" -#: gnu/packages/web.scm:2258 +#: gnu/packages/web.scm:2459 msgid "Perl module to open an HTML file with automatic charset detection" msgstr "" -#: gnu/packages/web.scm:2260 +#: gnu/packages/web.scm:2461 msgid "" "IO::HTML provides an easy way to open a file containing HTML while\n" "automatically determining its encoding. It uses the HTML5 encoding sniffing\n" "algorithm specified in section 8.2.2.1 of the draft standard." msgstr "" -#: gnu/packages/web.scm:2280 +#: gnu/packages/web.scm:2481 msgid "Family-neutral IP socket supporting both IPv4 and IPv6" msgstr "" -#: gnu/packages/web.scm:2281 +#: gnu/packages/web.scm:2482 msgid "" "This module provides a protocol-independent way to use IPv4\n" "and IPv6 sockets, intended as a replacement for IO::Socket::INET." msgstr "" -#: gnu/packages/web.scm:2301 +#: gnu/packages/web.scm:2504 msgid "Nearly transparent SSL encapsulation for IO::Socket::INET" msgstr "" -#: gnu/packages/web.scm:2303 +#: gnu/packages/web.scm:2506 msgid "" "IO::Socket::SSL makes using SSL/TLS much easier by wrapping the\n" "necessary functionality into the familiar IO::Socket interface and providing\n" @@ -10440,11 +13531,11 @@ msgid "" "select or poll." msgstr "" -#: gnu/packages/web.scm:2334 +#: gnu/packages/web.scm:2540 msgid "Perl modules for the WWW" msgstr "Perlmoduler for www" -#: gnu/packages/web.scm:2336 +#: gnu/packages/web.scm:2542 msgid "" "The libwww-perl collection is a set of Perl modules which provides a\n" "simple and consistent application programming interface to the\n" @@ -10454,11 +13545,11 @@ msgid "" "help you implement simple HTTP servers." msgstr "" -#: gnu/packages/web.scm:2358 +#: gnu/packages/web.scm:2564 msgid "Perl module to guess the media type for a file or a URL" msgstr "" -#: gnu/packages/web.scm:2360 +#: gnu/packages/web.scm:2566 #, scheme-format msgid "" "The LWP::MediaTypes module provides functions for handling media (also\n" @@ -10467,21 +13558,21 @@ msgid "" "exists it is used instead." msgstr "" -#: gnu/packages/web.scm:2386 +#: gnu/packages/web.scm:2592 msgid "HTTPS support for LWP::UserAgent" msgstr "" -#: gnu/packages/web.scm:2387 +#: gnu/packages/web.scm:2593 msgid "" "The LWP::Protocol::https module provides support for using\n" "https schemed URLs with LWP." msgstr "" -#: gnu/packages/web.scm:2407 +#: gnu/packages/web.scm:2613 msgid "Virtual browser that retries errors" msgstr "" -#: gnu/packages/web.scm:2408 +#: gnu/packages/web.scm:2614 msgid "" "LWP::UserAgent::Determined works just like LWP::UserAgent,\n" "except that when you use it to get a web page but run into a\n" @@ -10489,19 +13580,19 @@ msgid "" "and retry a few times." msgstr "" -#: gnu/packages/web.scm:2453 +#: gnu/packages/web.scm:2659 msgid "Perl interface to Amazon S3" msgstr "" -#: gnu/packages/web.scm:2454 +#: gnu/packages/web.scm:2660 msgid "This module provides a Perlish interface to Amazon S3." msgstr "" -#: gnu/packages/web.scm:2474 +#: gnu/packages/web.scm:2680 msgid "Perl low-level HTTP connection (client)" msgstr "" -#: gnu/packages/web.scm:2476 +#: gnu/packages/web.scm:2682 msgid "" "The Net::HTTP class is a low-level HTTP client. An instance of the\n" "Net::HTTP class represents a connection to an HTTP server. The HTTP protocol\n" @@ -10509,11 +13600,11 @@ msgid "" "HTTP/1.1." msgstr "" -#: gnu/packages/web.scm:2496 +#: gnu/packages/web.scm:2702 msgid "Extensible Perl server engine" msgstr "" -#: gnu/packages/web.scm:2497 +#: gnu/packages/web.scm:2703 msgid "" "Net::Server is an extensible, generic Perl server engine.\n" "It attempts to be a generic server as in Net::Daemon and NetServer::Generic.\n" @@ -10527,19 +13618,19 @@ msgid "" "or to multiple server ports." msgstr "" -#: gnu/packages/web.scm:2525 +#: gnu/packages/web.scm:2731 msgid "SSL support for Net::SMTP" msgstr "SSL-understøttelse for Net::SMTP" -#: gnu/packages/web.scm:2526 +#: gnu/packages/web.scm:2732 msgid "SSL support for Net::SMTP." msgstr "SSL-understøttelse for Net::SMTP." -#: gnu/packages/web.scm:2560 +#: gnu/packages/web.scm:2766 msgid "Perl Superglue for Web frameworks and servers (PSGI toolkit)" msgstr "" -#: gnu/packages/web.scm:2561 +#: gnu/packages/web.scm:2767 msgid "" "Plack is a set of tools for using the PSGI stack. It\n" "contains middleware components, a reference server, and utilities for Web\n" @@ -10547,21 +13638,21 @@ msgid "" "WSGI." msgstr "" -#: gnu/packages/web.scm:2587 +#: gnu/packages/web.scm:2793 msgid "Plack::Middleware which sets body for redirect response" msgstr "" -#: gnu/packages/web.scm:2588 +#: gnu/packages/web.scm:2794 msgid "" "This module sets the body in redirect response, if it's not\n" "already set." msgstr "" -#: gnu/packages/web.scm:2611 +#: gnu/packages/web.scm:2817 msgid "Override REST methods to Plack apps via POST" msgstr "" -#: gnu/packages/web.scm:2612 +#: gnu/packages/web.scm:2818 msgid "" "This middleware allows for POST requests that pretend to be\n" "something else: by adding either a header named X-HTTP-Method-Override to the\n" @@ -10569,72 +13660,72 @@ msgid "" "can say what method it actually meant." msgstr "" -#: gnu/packages/web.scm:2636 +#: gnu/packages/web.scm:2842 msgid "Plack::Middleware which removes body for HTTP response" msgstr "" -#: gnu/packages/web.scm:2637 +#: gnu/packages/web.scm:2843 msgid "" "This module removes the body in an HTTP response if it's not\n" "required." msgstr "" -#: gnu/packages/web.scm:2658 +#: gnu/packages/web.scm:2864 msgid "Supports app to run as a reverse proxy backend" msgstr "" -#: gnu/packages/web.scm:2659 +#: gnu/packages/web.scm:2865 msgid "" "Plack::Middleware::ReverseProxy resets some HTTP headers,\n" "which are changed by reverse-proxy. You can specify the reverse proxy address\n" "and stop fake requests using 'enable_if' directive in your app.psgi." msgstr "" -#: gnu/packages/web.scm:2680 +#: gnu/packages/web.scm:2886 msgid "Run HTTP tests on external live servers" msgstr "" -#: gnu/packages/web.scm:2681 +#: gnu/packages/web.scm:2887 msgid "" "This module allows your to run your Plack::Test tests\n" "against an external server instead of just against a local application through\n" "either mocked HTTP or a locally spawned server." msgstr "" -#: gnu/packages/web.scm:2703 +#: gnu/packages/web.scm:2909 msgid "Testing TCP programs" msgstr "Testning af TCP-programmer" -#: gnu/packages/web.scm:2704 +#: gnu/packages/web.scm:2910 msgid "Test::TCP is test utilities for TCP/IP programs." msgstr "Test::TCP er testredskaber for TCP/IP-programmer." -#: gnu/packages/web.scm:2732 +#: gnu/packages/web.scm:2938 msgid "Testing-specific WWW::Mechanize subclass" msgstr "" -#: gnu/packages/web.scm:2733 +#: gnu/packages/web.scm:2939 msgid "" "Test::WWW::Mechanize is a subclass of the Perl module\n" "WWW::Mechanize that incorporates features for web application testing." msgstr "" -#: gnu/packages/web.scm:2766 +#: gnu/packages/web.scm:2972 msgid "Test::WWW::Mechanize for Catalyst" msgstr "Test::WWW::Mechanize for Catalyst" -#: gnu/packages/web.scm:2767 +#: gnu/packages/web.scm:2973 msgid "" "The Test::WWW::Mechanize::Catalyst module meshes the\n" "Test::WWW:Mechanize module and the Catalyst web application framework to allow\n" "testing of Catalyst applications without needing to start up a web server." msgstr "" -#: gnu/packages/web.scm:2791 +#: gnu/packages/web.scm:2997 msgid "Test PSGI programs using WWW::Mechanize" msgstr "" -#: gnu/packages/web.scm:2792 +#: gnu/packages/web.scm:2998 msgid "" "PSGI is a specification to decouple web server environments\n" "from web application framework code. Test::WWW::Mechanize is a subclass of\n" @@ -10643,22 +13734,33 @@ msgid "" "applications." msgstr "" -#: gnu/packages/web.scm:2812 +#: gnu/packages/web.scm:3018 msgid "Perl Uniform Resource Identifiers (absolute and relative)" msgstr "" -#: gnu/packages/web.scm:2814 +#: gnu/packages/web.scm:3020 msgid "" "The URI module implements the URI class. Objects of this class\n" "represent \"Uniform Resource Identifier references\" as specified in RFC 2396\n" "and updated by RFC 2732." msgstr "" -#: gnu/packages/web.scm:2837 +#: gnu/packages/web.scm:3044 +msgid "Smart URI fetching/caching" +msgstr "" + +#: gnu/packages/web.scm:3045 +msgid "" +"@code{URI::Fetch} is a smart client for fetching HTTP pages,\n" +"notably syndication feeds (RSS, Atom, and others), in an intelligent, bandwidth-\n" +"and time-saving way." +msgstr "" + +#: gnu/packages/web.scm:3068 msgid "Find URIs in arbitrary text" msgstr "" -#: gnu/packages/web.scm:2838 +#: gnu/packages/web.scm:3069 msgid "" "This module finds URIs and URLs (according to what URI.pm\n" "considers a URI) in plain text. It only finds URIs which include a\n" @@ -10666,41 +13768,63 @@ msgid "" "URI::Find::Schemeless. For a command-line interface, urifind is provided." msgstr "" -#: gnu/packages/web.scm:2860 +#: gnu/packages/web.scm:3091 msgid "WebSocket support for URI package" msgstr "" -#: gnu/packages/web.scm:2861 +#: gnu/packages/web.scm:3092 msgid "" "With this module, the URI package provides the same set of\n" "methods for WebSocket URIs as it does for HTTP URIs." msgstr "" +"Med dette modul tilbyder URI-pakken det samme sæt af\n" +"metoder for WebSocket URI'er som den gør for HTTP URI'er." -#: gnu/packages/web.scm:2881 -msgid "Perl extension interface for libcurl" +#: gnu/packages/web.scm:3115 +msgid "Object for handling URI templates" +msgstr "Objekt til håndtering af URI-skabeloner" + +#: gnu/packages/web.scm:3116 +msgid "" +"This perl module provides a wrapper around URI templates as described in\n" +"RFC 6570." msgstr "" -#: gnu/packages/web.scm:2883 +#: gnu/packages/web.scm:3137 +msgid "Perl extension interface for libcurl" +msgstr "Perludvidelsesgrænseflade for libcurl" + +#: gnu/packages/web.scm:3139 msgid "" "This is a Perl extension interface for the libcurl file downloading\n" "library." msgstr "" -#: gnu/packages/web.scm:2912 +#: gnu/packages/web.scm:3168 msgid "Web browsing in a Perl object" msgstr "" -#: gnu/packages/web.scm:2913 +#: gnu/packages/web.scm:3169 msgid "" "WWW::Mechanize is a Perl module for stateful programmatic\n" "web browsing, used for automating interaction with websites." msgstr "" -#: gnu/packages/web.scm:2933 +#: gnu/packages/web.scm:3195 +msgid "Search A9 OpenSearch compatible engines" +msgstr "" + +#: gnu/packages/web.scm:3197 +msgid "" +"@code{WWW::OpenSearch} is a module to search @url{A9's OpenSearch,\n" +"http://opensearch.a9.com} compatible search engines." +msgstr "" + +#: gnu/packages/web.scm:3217 msgid "Perl database of robots.txt-derived permissions" msgstr "" -#: gnu/packages/web.scm:2935 +#: gnu/packages/web.scm:3219 msgid "" "The WWW::RobotRules module parses /robots.txt files as specified in\n" "\"A Standard for Robot Exclusion\", at\n" @@ -10709,11 +13833,21 @@ msgid "" "their web site." msgstr "" -#: gnu/packages/web.scm:2955 +#: gnu/packages/web.scm:3242 +msgid "Parse feeds in Python" +msgstr "" + +#: gnu/packages/web.scm:3244 +msgid "" +"Universal feed parser which handles RSS 0.9x, RSS 1.0, RSS 2.0,\n" +"CDF, Atom 0.3, and Atom 1.0 feeds." +msgstr "" + +#: gnu/packages/web.scm:3265 msgid "HTTP and WebSocket server library for R" msgstr "" -#: gnu/packages/web.scm:2957 +#: gnu/packages/web.scm:3267 msgid "" "The httpuv package provides low-level socket and protocol support for\n" "handling HTTP and WebSocket requests directly from within R. It is primarily\n" @@ -10721,11 +13855,11 @@ msgid "" "particularly easy to create complete web applications using httpuv alone." msgstr "" -#: gnu/packages/web.scm:2978 +#: gnu/packages/web.scm:3288 msgid "Robust, high performance JSON parser and generator for R" msgstr "" -#: gnu/packages/web.scm:2980 +#: gnu/packages/web.scm:3290 msgid "" "The jsonlite package provides a fast JSON parser and generator optimized\n" "for statistical data and the web. It offers flexible, robust, high\n" @@ -10737,41 +13871,56 @@ msgid "" "in systems and applications." msgstr "" -#: gnu/packages/web.scm:3008 +#: gnu/packages/web.scm:3318 msgid "Simple HTTP server to serve static files or dynamic documents" msgstr "" -#: gnu/packages/web.scm:3010 +#: gnu/packages/web.scm:3320 msgid "" "Servr provides an HTTP server in R to serve static files, or dynamic\n" "documents that can be converted to HTML files (e.g., R Markdown) under a given\n" "directory." msgstr "" -#: gnu/packages/web.scm:3029 +#: gnu/packages/web.scm:3354 msgid "R tools for HTML" msgstr "R-værktøjer for HTML" -#: gnu/packages/web.scm:3031 +#: gnu/packages/web.scm:3356 msgid "This package provides tools for HTML generation and output in R." msgstr "Denne pakke tilbyder værktøjer for HTML-oprettelse og uddata i R." -#: gnu/packages/web.scm:3050 +#: gnu/packages/web.scm:3375 msgid "HTML Widgets for R" msgstr "HTML-kontroller for R" -#: gnu/packages/web.scm:3052 +#: gnu/packages/web.scm:3377 msgid "" "HTML widgets is a framework for creating HTML widgets that render in\n" "various contexts including the R console, R Markdown documents, and Shiny web\n" "applications." msgstr "" -#: gnu/packages/web.scm:3071 +#: gnu/packages/web.scm:3400 +msgid "Advanced tables for Markdown/HTML" +msgstr "" + +#: gnu/packages/web.scm:3402 +msgid "" +"This package provides functions to build tables with advanced layout\n" +"elements such as row spanners, column spanners, table spanners, zebra\n" +"striping, and more. While allowing advanced layout, the underlying\n" +"CSS-structure is simple in order to maximize compatibility with word\n" +"processors such as LibreOffice. The package also contains a few text\n" +"formatting functions that help outputting text compatible with HTML or\n" +"LaTeX." +msgstr "" + +#: gnu/packages/web.scm:3439 msgid "HTTP client for R" msgstr "HTTP-klient for R" -#: gnu/packages/web.scm:3073 +#: gnu/packages/web.scm:3441 msgid "" "The @code{curl()} and @code{curl_download()} functions provide highly\n" "configurable drop-in replacements for base @code{url()} and\n" @@ -10782,11 +13931,31 @@ msgid "" "callback or connection interfaces." msgstr "" -#: gnu/packages/web.scm:3107 +#: gnu/packages/web.scm:3463 +msgid "Output R objects in HTML format" +msgstr "" + +#: gnu/packages/web.scm:3465 +msgid "" +"This package provides easy-to-use and versatile functions to output R\n" +"objects in HTML format." +msgstr "" + +#: gnu/packages/web.scm:3482 +msgid "JSON library for R" +msgstr "" + +#: gnu/packages/web.scm:3484 +msgid "" +"This package provides functions to convert R objects into JSON objects\n" +"and vice-versa." +msgstr "" + +#: gnu/packages/web.scm:3513 msgid "HTML5 parsing library" msgstr "HTML5-fortolkningsbibliotek" -#: gnu/packages/web.scm:3109 +#: gnu/packages/web.scm:3515 msgid "" "Gumbo is an implementation of the HTML5 parsing algorithm implemented as\n" "a pure C99 library." @@ -10794,13 +13963,118 @@ msgstr "" "Gumbo er en implementering af HTML5-fortolkningsalgoritmen implenteret\n" "som et rent C99-bibliotek." -#: gnu/packages/wordnet.scm:79 +#: gnu/packages/web.scm:3586 +msgid "Application container server" +msgstr "" + +#: gnu/packages/web.scm:3588 +msgid "" +"uWSGI presents a complete stack for networked/clustered web applications,\n" +"implementing message/object passing, caching, RPC and process management.\n" +"It uses the uwsgi protocol for all the networking/interprocess communications." +msgstr "" + +#: gnu/packages/web.scm:3618 +msgid "Command-line JSON processor" +msgstr "" + +#: gnu/packages/web.scm:3619 +msgid "" +"jq is like sed for JSON data – you can use it to slice and\n" +"filter and map and transform structured data with the same ease that sed, awk,\n" +"grep and friends let you play with text. It is written in portable C. jq can\n" +"mangle the data format that you have into the one that you want with very\n" +"little effort, and the program to do so is often shorter and simpler than\n" +"you'd expect." +msgstr "" + +#: gnu/packages/web.scm:3658 +msgid "Library for mocking web service APIs which use HTTP or HTTPS" +msgstr "" + +#: gnu/packages/web.scm:3660 +msgid "" +"Uhttpmock is a project for mocking web service APIs which use HTTP or\n" +"HTTPS. It provides a library, libuhttpmock, which implements recording and\n" +"playback of HTTP request/response traces." +msgstr "" + +#: gnu/packages/web.scm:3695 +msgid "Single file web server" +msgstr "" + +#: gnu/packages/web.scm:3696 +msgid "" +"Woof (Web Offer One File) is a small simple web server that\n" +"can easily be invoked on a single file. Your partner can access the file with\n" +"tools they trust (e.g. wget)." +msgstr "" + +#: gnu/packages/web.scm:3805 +msgid "Web browser" +msgstr "Internetbrowser" + +#: gnu/packages/web.scm:3807 +msgid "" +"NetSurf is a lightweight web browser that has its own layout and\n" +"rendering engine entirely written from scratch. It is small and capable of\n" +"handling many of the web standards in use today." +msgstr "" + +#: gnu/packages/web.scm:3829 +msgid "Unix command line interface to the www" +msgstr "Unix-kommandolinjegrænseflade til www" + +#: gnu/packages/web.scm:3830 +msgid "" +"Surfraw (Shell Users' Revolutionary Front Rage Against the Web)\n" +"provides a unix command line interface to a variety of popular www search engines\n" +"and similar services." +msgstr "" + +#: gnu/packages/web.scm:3866 +msgid "Simple static web server" +msgstr "Simpel statisk internetserver" + +#: gnu/packages/web.scm:3867 +msgid "" +"darkhttpd is a simple static web server. It is\n" +"standalone and does not need inetd or ucspi-tcp. It does not need any\n" +"config files---you only have to specify the www root." +msgstr "" + +#: gnu/packages/web.scm:3897 +msgid "Analyze Web server logs in real time" +msgstr "" + +#: gnu/packages/web.scm:3899 +msgid "" +"GoAccess is a real-time web log analyzer and interactive viewer that\n" +"runs in a terminal or through your browser. It provides fast and valuable\n" +"HTTP statistics for system administrators that require a visual server report\n" +"on the fly." +msgstr "" + +#: gnu/packages/web.scm:3934 +msgid "Tunnel data connections through HTTP requests" +msgstr "" + +#: gnu/packages/web.scm:3935 +msgid "" +"httptunnel creates a bidirectional virtual data connection\n" +"tunnelled through HTTP (HyperText Transfer Protocol) requests. This can be\n" +"useful for users behind restrictive firewalls. As long as Web traffic is\n" +"allowed, even through a HTTP-only proxy, httptunnel can be combined with other\n" +"tools like SSH (Secure Shell) to reach the outside world." +msgstr "" + +#: gnu/packages/wordnet.scm:91 msgid "Lexical database for the English language" msgstr "Leksikal database for det engelske sprog" -#: gnu/packages/wordnet.scm:81 +#: gnu/packages/wordnet.scm:93 msgid "" -"WordNet® is a large lexical database of English. Nouns, verbs,\n" +"WordNet is a large lexical database of English. Nouns, verbs,\n" "adjectives and adverbs are grouped into sets of cognitive synonyms (synsets),\n" "each expressing a distinct concept. Synsets are interlinked by means of\n" "conceptual-semantic and lexical relations. The resulting network of\n" @@ -10868,40 +14142,42 @@ msgid "" "Libao is a cross-platform audio library that allows programs to\n" "output audio using a simple API on a wide variety of platforms.\n" "It currently supports:\n" -"Null output (handy for testing without a sound device),\n" -"WAV files,\n" -"AU files,\n" -"RAW files,\n" -"OSS (Open Sound System, used on Linux and FreeBSD),\n" -"ALSA (Advanced Linux Sound Architecture),\n" -"aRts (Analog RealTime Synth, used by KDE),\n" -"PulseAudio (next generation GNOME sound server),\n" -"esd (EsounD or Enlightened Sound Daemon),\n" -"Mac OS X,\n" -"Windows (98 and later),\n" -"AIX,\n" -"Sun/NetBSD/OpenBSD,\n" -"IRIX,\n" -"NAS (Network Audio Server),\n" -"RoarAudio (Modern, multi-OS, networked Sound System),\n" -"OpenBSD's sndio." -msgstr "" - -#: gnu/packages/xiph.scm:215 +"@enumerate\n" +"@item Null output (handy for testing without a sound device),\n" +"@item WAV files,\n" +"@item AU files,\n" +"@item RAW files,\n" +"@item OSS (Open Sound System, used on Linux and FreeBSD),\n" +"@item ALSA (Advanced Linux Sound Architecture),\n" +"@item aRts (Analog RealTime Synth, used by KDE),\n" +"@item PulseAudio (next generation GNOME sound server),\n" +"@item esd (EsounD or Enlightened Sound Daemon),\n" +"@item Mac OS X,\n" +"@item Windows (98 and later),\n" +"@item AIX,\n" +"@item Sun/NetBSD/OpenBSD,\n" +"@item IRIX,\n" +"@item NAS (Network Audio Server),\n" +"@item RoarAudio (Modern, multi-OS, networked Sound System),\n" +"@item OpenBSD's sndio.\n" +"@end enumerate\n" +msgstr "" + +#: gnu/packages/xiph.scm:218 msgid "Free lossless audio codec" msgstr "Fri lydkodning uden kvalitetstab" -#: gnu/packages/xiph.scm:217 +#: gnu/packages/xiph.scm:220 msgid "" "FLAC stands for Free Lossless Audio Codec, an audio format that is lossless,\n" "meaning that audio is compressed in FLAC without any loss in quality." msgstr "" -#: gnu/packages/xiph.scm:243 +#: gnu/packages/xiph.scm:246 msgid "Karaoke and text codec for embedding in ogg" msgstr "" -#: gnu/packages/xiph.scm:245 +#: gnu/packages/xiph.scm:248 msgid "" "Kate is an overlay codec, originally designed for karaoke and text,\n" "that can be multiplixed in Ogg. Text and images can be carried by a Kate\n" @@ -10916,11 +14192,11 @@ msgid "" "Kate stream." msgstr "" -#: gnu/packages/xiph.scm:279 +#: gnu/packages/xiph.scm:286 msgid "Ogg vorbis tools" msgstr "Ogg vorbis-værktøjer" -#: gnu/packages/xiph.scm:281 +#: gnu/packages/xiph.scm:288 msgid "" "Ogg vorbis is a non-proprietary, patent-and-royalty-free,\n" "general-purpose compressed audio format.\n" @@ -10933,11 +14209,11 @@ msgid "" " an ogg vorbis file." msgstr "" -#: gnu/packages/xiph.scm:306 gnu/packages/xiph.scm:369 +#: gnu/packages/xiph.scm:313 gnu/packages/xiph.scm:376 msgid "Versatile audio codec" msgstr "Alsidig lydkodning" -#: gnu/packages/xiph.scm:308 +#: gnu/packages/xiph.scm:315 msgid "" "Opus is a totally open, royalty-free, highly versatile audio codec. Opus\n" "is unmatched for interactive speech and music transmission over the Internet,\n" @@ -10946,29 +14222,29 @@ msgid "" "incorporated technology from Skype's SILK codec and Xiph.Org's CELT codec." msgstr "" -#: gnu/packages/xiph.scm:342 +#: gnu/packages/xiph.scm:349 msgid "Command line utilities to encode, inspect, and decode .opus files" msgstr "" -#: gnu/packages/xiph.scm:343 +#: gnu/packages/xiph.scm:350 msgid "" "Opus is a royalty-free, highly versatile audio codec.\n" "Opus-tools provide command line utilities for creating, inspecting and\n" "decoding .opus files." msgstr "" -#: gnu/packages/xiph.scm:371 +#: gnu/packages/xiph.scm:378 msgid "" "The opusfile library provides seeking, decode, and playback of Opus\n" "streams in the Ogg container (.opus files) including over http(s) on posix and\n" "windows systems." msgstr "" -#: gnu/packages/xiph.scm:401 +#: gnu/packages/xiph.scm:408 msgid "Streaming media server" msgstr "Strøm-medieserver" -#: gnu/packages/xiph.scm:402 +#: gnu/packages/xiph.scm:409 msgid "" "Icecast is a streaming media server which currently supports\n" "Ogg (Vorbis and Theora), Opus, WebM and MP3 audio streams. It can be used to\n" @@ -10976,22 +14252,22 @@ msgid "" "things in between." msgstr "" -#: gnu/packages/xiph.scm:430 +#: gnu/packages/xiph.scm:437 msgid "Audio streaming library for icecast encoders" msgstr "" -#: gnu/packages/xiph.scm:432 +#: gnu/packages/xiph.scm:439 msgid "" "Libshout is a library for communicating with and sending data to an\n" "icecast server. It handles the socket connection, the timing of the data,\n" "and prevents bad data from getting to the icecast server." msgstr "" -#: gnu/packages/zip.scm:57 +#: gnu/packages/zip.scm:58 msgid "Compression and file packing utility" msgstr "Komprimerings- og filpakningsredskab" -#: gnu/packages/zip.scm:59 +#: gnu/packages/zip.scm:60 msgid "" "Zip is a compression and file packaging/archive utility. Zip is useful\n" "for packaging a set of files for distribution, for archiving files, and for\n" @@ -11006,11 +14282,11 @@ msgid "" "Compression ratios of 2:1 to 3:1 are common for text files." msgstr "" -#: gnu/packages/zip.scm:113 +#: gnu/packages/zip.scm:114 msgid "Decompression and file extraction utility" msgstr "" -#: gnu/packages/zip.scm:115 +#: gnu/packages/zip.scm:116 msgid "" "UnZip is an extraction utility for archives compressed in .zip format,\n" "also called \"zipfiles\".\n" @@ -11021,27 +14297,14 @@ msgid "" "recreates the stored directory structure by default." msgstr "" -#: gnu/packages/zip.scm:149 +#: gnu/packages/zip.scm:150 msgid "Library for accessing zip files" msgstr "Bibliotek til at tilgå zip-filer" -#: gnu/packages/zip.scm:151 +#: gnu/packages/zip.scm:152 msgid "ZZipLib is a library based on zlib for accessing zip files." msgstr "ZZipLib er et bibliotek baseret på zlib for adgang til zip-filer." -#: gnu/packages/zip.scm:169 +#: gnu/packages/zip.scm:170 msgid "Provides an interface to ZIP archive files" msgstr "Tilbyder en grænseflade til ZIP-arkivfiler" - -#: gnu/packages/zsh.scm:71 -msgid "Powerful shell for interactive use and scripting" -msgstr "Funktionsrig skal for interaktiv brug og skriptopbygning" - -#: gnu/packages/zsh.scm:72 -msgid "" -"The Z shell (zsh) is a Unix shell that can be used\n" -"as an interactive login shell and as a powerful command interpreter\n" -"for shell scripting. Zsh can be thought of as an extended Bourne shell\n" -"with a large number of improvements, including some features of bash,\n" -"ksh, and tcsh." -msgstr "" diff --git a/tests/cpan.scm b/tests/cpan.scm index e37fc437fc..0c28a74d3e 100644 --- a/tests/cpan.scm +++ b/tests/cpan.scm @@ -68,46 +68,55 @@ (lambda () (display (match url - ("https://api.metacpan.org/release/Foo-Bar" - test-json) - ("https://api.metacpan.org/module/Test::Script" - "{ \"distribution\" : \"Test-Script\" }") ("http://example.com/Foo-Bar-0.1.tar.gz" test-source) (_ (error "Unexpected URL: " url)))))))) - (match (cpan->guix-package "Foo::Bar") - (('package - ('name "perl-foo-bar") - ('version "0.1") - ('source ('origin - ('method 'url-fetch) - ('uri ('string-append "http://example.com/Foo-Bar-" - 'version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'perl-build-system) - ('inputs - ('quasiquote - (("perl-test-script" ('unquote 'perl-test-script))))) - ('home-page "http://search.cpan.org/dist/Foo-Bar") - ('synopsis "Fizzle Fuzz") - ('description 'fill-in-yourself!) - ('license (package-license perl))) - (string=? (bytevector->nix-base32-string - (call-with-input-string test-source port-sha256)) - hash)) - (x - (pk 'fail x #f))))) + (mock ((guix http-client) http-fetch + (lambda (url) + (match url + ("https://api.metacpan.org/release/Foo-Bar" + (values (open-input-string test-json) + (string-length test-json))) + ("https://api.metacpan.org/module/Test::Script?fields=distribution" + (let ((result "{ \"distribution\" : \"Test-Script\" }")) + (values (open-input-string result) + (string-length result)))) + (_ (error "Unexpected URL: " url))))) + (match (cpan->guix-package "Foo::Bar") + (('package + ('name "perl-foo-bar") + ('version "0.1") + ('source ('origin + ('method 'url-fetch) + ('uri ('string-append "http://example.com/Foo-Bar-" + 'version ".tar.gz")) + ('sha256 + ('base32 + (? string? hash))))) + ('build-system 'perl-build-system) + ('inputs + ('quasiquote + (("perl-test-script" ('unquote 'perl-test-script))))) + ('home-page "http://search.cpan.org/dist/Foo-Bar") + ('synopsis "Fizzle Fuzz") + ('description 'fill-in-yourself!) + ('license (package-license perl))) + (string=? (bytevector->nix-base32-string + (call-with-input-string test-source port-sha256)) + hash)) + (x + (pk 'fail x #f)))))) (test-equal "source-url-http" - ((@@ (guix import cpan) fix-source-url) - "http://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz") + ((@@ (guix import cpan) cpan-source-url) + `(("download_url" . + "http://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz"))) "mirror://cpan/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz") (test-equal "source-url-https" - ((@@ (guix import cpan) fix-source-url) - "https://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz") + ((@@ (guix import cpan) cpan-source-url) + `(("download_url" . + "https://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz"))) "mirror://cpan/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz") (test-end "cpan") diff --git a/tests/crate.scm b/tests/crate.scm new file mode 100644 index 0000000000..0bb344bb8a --- /dev/null +++ b/tests/crate.scm @@ -0,0 +1,103 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2014 David Thompson <davet@gnu.org> +;;; Copyright © 2016 David Craven <david@craven.ch> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (test-crate) + #:use-module (guix import crate) + #:use-module (guix base32) + #:use-module (guix build-system cargo) + #:use-module (guix hash) + #:use-module (guix tests) + #:use-module (ice-9 iconv) + #:use-module (ice-9 match) + #:use-module (srfi srfi-64)) + +(define test-crate + "{ + \"crate\": { + \"max_version\": \"1.0.0\", + \"name\": \"foo\", + \"license\": \"MIT/Apache-2.0\", + \"description\": \"summary\", + \"homepage\": \"http://example.com\", + \"repository\": \"http://example.com\", + } +}") + +(define test-dependencies + "{ + \"dependencies\": [ + { + \"crate_id\": \"bar\", + \"kind\": \"normal\", + } + ] +}") + +(define test-source-hash + "") + +(test-begin "crate") + +(test-equal "guix-package->crate-name" + "rustc-serialize" + (guix-package->crate-name + (dummy-package + "rust-rustc-serialize" + (source (dummy-origin + (uri (crate-uri "rustc-serialize" "1.0"))))))) + +(test-assert "crate->guix-package" + ;; Replace network resources with sample data. + (mock ((guix http-client) http-fetch + (lambda (url) + (match url + ("https://crates.io/api/v1/crates/foo" + (open-input-string test-crate)) + ("https://crates.io/api/v1/crates/foo/1.0.0/download" + (set! test-source-hash + (bytevector->nix-base32-string + (sha256 (string->bytevector "empty file\n" "utf-8")))) + (open-input-string "empty file\n")) + ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies" + (open-input-string test-dependencies)) + (_ (error "Unexpected URL: " url))))) + (match (crate->guix-package "foo") + (('package + ('name "rust-foo") + ('version "1.0.0") + ('source ('origin + ('method 'url-fetch) + ('uri ('crate-uri "foo" 'version)) + ('file-name ('string-append 'name "-" 'version ".tar.gz")) + ('sha256 + ('base32 + (? string? hash))))) + ('build-system 'cargo-build-system) + ('inputs + ('quasiquote + (("rust-bar" ('unquote 'rust-bar) "src")))) + ('home-page "http://example.com") + ('synopsis "summary") + ('description "summary") + ('license ('list 'license:expat 'license:asl2.0))) + (string=? test-source-hash hash)) + (x + (pk 'fail x #f))))) + +(test-end "crate") diff --git a/tests/gem.scm b/tests/gem.scm index a46c2b1439..669cd8ee60 100644 --- a/tests/gem.scm +++ b/tests/gem.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson <davet@gnu.org> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -45,13 +46,12 @@ (test-assert "gem->guix-package" ;; Replace network resources with sample data. - (mock ((guix import utils) url-fetch - (lambda (url file-name) + (mock ((guix http-client) http-fetch + (lambda (url) (match url ("https://rubygems.org/api/v1/gems/foo.json" - (with-output-to-file file-name - (lambda () - (display test-json)))) + (values (open-input-string test-json) + (string-length test-json))) (_ (error "Unexpected URL: " url))))) (match (gem->guix-package "foo") (('package diff --git a/tests/gexp.scm b/tests/gexp.scm index 354d28f014..baf78837ae 100644 --- a/tests/gexp.scm +++ b/tests/gexp.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -92,6 +92,16 @@ (package-derivation %store coreutils))) (gexp->sexp* exp))))) +(test-assert "one input package, dotted list" + (let ((exp (gexp (coreutils . (ungexp coreutils))))) + (and (gexp? exp) + (match (gexp-inputs exp) + (((p "out")) + (eq? p coreutils))) + (equal? `(coreutils . ,(derivation->output-path + (package-derivation %store coreutils))) + (gexp->sexp* exp))))) + (test-assert "one input origin" (let ((exp (gexp (display (ungexp (package-source coreutils)))))) (and (gexp? exp) @@ -277,6 +287,14 @@ (ungexp %bootstrap-guile))))) (list (gexp-inputs exp) '<> (gexp-native-inputs exp)))) +(test-equal "ungexp + ungexp-native, nested, special mixture" + `(() <> ((,coreutils "out"))) + + ;; (gexp-native-inputs exp) used to return '(), wrongfully. + (let* ((foo (gexp (foo (ungexp-native coreutils)))) + (exp (gexp (bar (ungexp foo))))) + (list (gexp-inputs exp) '<> (gexp-native-inputs exp)))) + (test-assert "input list" (let ((exp (gexp (display '(ungexp (list %bootstrap-guile coreutils))))) @@ -327,7 +345,8 @@ `(list ,@(cons 5 outputs)))))) (test-assert "input list splicing + ungexp-native-splicing" - (let* ((inputs (list (gexp-input glibc "debug") %bootstrap-guile)) + (let* ((inputs (list (gexp-input glibc "debug" #:native? #t) + %bootstrap-guile)) (exp (gexp (list (ungexp-native-splicing (cons (+ 2 3) inputs)))))) (and (lset= equal? `((,glibc "debug") (,%bootstrap-guile "out")) diff --git a/tests/graph.scm b/tests/graph.scm index f2e441cee6..6431c482f7 100644 --- a/tests/graph.scm +++ b/tests/graph.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,6 +32,7 @@ #:use-module (gnu packages) #:use-module (gnu packages base) #:use-module (gnu packages guile) + #:use-module (gnu packages libunistring) #:use-module (gnu packages bootstrap) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -57,7 +58,8 @@ edges." (define (return) (values (reverse nodes) (reverse edges))) - (values (graph-backend (const #t) (const #t) + (values (graph-backend "test" "This is the test backend." + (const #t) (const #t) record-node record-edge) return))) @@ -91,6 +93,17 @@ edges." (list p3 p3 p2) (list p2 p1 p1)))))))) +(test-assert "reverse package DAG" + (let-values (((backend nodes+edges) (make-recording-backend))) + (run-with-store %store + (export-graph (list libunistring) 'port + #:node-type %reverse-package-node-type + #:backend backend)) + ;; We should see nothing more than these 3 packages. + (let-values (((nodes edges) (nodes+edges))) + (and (member (package->tuple guile-2.0) nodes) + (->bool (member (edge->tuple libunistring guile-2.0) edges)))))) + (test-assert "bag-emerged DAG" (let-values (((backend nodes+edges) (make-recording-backend))) (let* ((o (dummy-origin (method (lambda _ diff --git a/tests/guix-environment.sh b/tests/guix-environment.sh index 68343520b0..2b3bbfe036 100644 --- a/tests/guix-environment.sh +++ b/tests/guix-environment.sh @@ -25,7 +25,8 @@ set -e guix environment --version tmpdir="t-guix-environment-$$" -trap 'rm -r "$tmpdir"' EXIT +gcroot="t-guix-environment-gc-root-$$" +trap 'rm -r "$tmpdir"; rm -f "$gcroot"' EXIT mkdir "$tmpdir" @@ -61,6 +62,20 @@ fi guix environment --bootstrap --ad-hoc guile-bootstrap --pure \ -- "$SHELL" -c 'test -f "$GUIX_ENVIRONMENT/bin/guile"' +# Make sure '-r' works as expected. +rm -f "$gcroot" +expected="`guix environment --bootstrap --ad-hoc guile-bootstrap \ + -- "$SHELL" -c 'echo $GUIX_ENVIRONMENT'`" +guix environment --bootstrap -r "$gcroot" --ad-hoc guile-bootstrap \ + -- guile -c 1 +test `readlink "$gcroot"` = "$expected" + +# Make sure '-r' is idempotent. +guix environment --bootstrap -r "$gcroot" --ad-hoc guile-bootstrap \ + -- guile -c 1 +test `readlink "$gcroot"` = "$expected" + + case "`uname -m`" in x86_64) # On x86_64, we should be able to create a 32-bit environment. diff --git a/tests/lint.scm b/tests/lint.scm index 0c534562a4..3a9b89fe95 100644 --- a/tests/lint.scm +++ b/tests/lint.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org> +;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -34,6 +35,10 @@ #:use-module (gnu packages) #:use-module (gnu packages glib) #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (web server) + #:use-module (web server http) + #:use-module (web response) #:use-module (ice-9 match) #:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-64)) @@ -274,6 +279,38 @@ (check-inputs-should-be-native pkg))) "'glib:bin' should probably be a native input"))) +(test-assert + "inputs: python-setuptools should not be an input at all (input)" + (->bool + (string-contains + (with-warnings + (let ((pkg (dummy-package "x" + (inputs `(("python-setuptools" ,python-setuptools)))))) + (check-inputs-should-not-be-an-input-at-all pkg))) + "'python-setuptools' should probably not be an input at all"))) + +(test-assert + "inputs: python-setuptools should not be an input at all (native-input)" + (->bool + (string-contains + (with-warnings + (let ((pkg (dummy-package "x" + (native-inputs + `(("python-setuptools" ,python-setuptools)))))) + (check-inputs-should-not-be-an-input-at-all pkg))) + "'python-setuptools' should probably not be an input at all"))) + +(test-assert + "inputs: python-setuptools should not be an input at all (propagated-input)" + (->bool + (string-contains + (with-warnings + (let ((pkg (dummy-package "x" + (propagated-inputs + `(("python-setuptools" ,python-setuptools)))))) + (check-inputs-should-not-be-an-input-at-all pkg))) + "'python-setuptools' should probably not be an input at all"))) + (test-assert "patches: file names" (->bool (string-contains diff --git a/tests/packages.scm b/tests/packages.scm index 47e76b53e9..247f75cc43 100644 --- a/tests/packages.scm +++ b/tests/packages.scm @@ -968,7 +968,8 @@ (profile-derivation (manifest (map package->manifest-entry (list p1 p2))) - #:hooks '()) + #:hooks '() + #:locales? #f) #:guile-for-build (%guile-for-build)))) (build-derivations %store (list prof)) (string-match (format #f "^export XML_CATALOG_FILES=\"~a/xml/+bar/baz/catalog\\.xml\"\n" diff --git a/tests/profiles.scm b/tests/profiles.scm index f9c2f5499e..5536364889 100644 --- a/tests/profiles.scm +++ b/tests/profiles.scm @@ -195,7 +195,8 @@ ((entry -> (package->manifest-entry %bootstrap-guile)) (guile (package->derivation %bootstrap-guile)) (drv (profile-derivation (manifest (list entry)) - #:hooks '())) + #:hooks '() + #:locales? #f)) (profile -> (derivation->output-path drv)) (bindir -> (string-append profile "/bin")) (_ (built-derivations (list drv)))) @@ -207,7 +208,8 @@ (mlet* %store-monad ((entry -> (package->manifest-entry packages:glibc "debug")) (drv (profile-derivation (manifest (list entry)) - #:hooks '()))) + #:hooks '() + #:locales? #f))) (return (derivation-inputs drv)))) (test-assert "package->manifest-entry defaults to \"out\"" @@ -228,7 +230,8 @@ (package-native-search-paths packages:guile-2.0)))) (entry -> (package->manifest-entry guile)) (drv (profile-derivation (manifest (list entry)) - #:hooks '())) + #:hooks '() + #:locales? #f)) (profile -> (derivation->output-path drv))) (mbegin %store-monad (built-derivations (list drv)) @@ -259,7 +262,8 @@ (package-native-search-paths packages:guile-2.0)))) (entry -> (package->manifest-entry guile)) (drv (profile-derivation (manifest (list entry)) - #:hooks '())) + #:hooks '() + #:locales? #f)) (profile -> (derivation->output-path drv))) (mbegin %store-monad (built-derivations (list drv)) @@ -293,7 +297,8 @@ (display "foo!" port)))))))) (entry -> (package->manifest-entry thing)) (drv (profile-derivation (manifest (list entry)) - #:hooks '())) + #:hooks '() + #:locales? #f)) (profile -> (derivation->output-path drv))) (mbegin %store-monad (built-derivations (list drv)) @@ -321,7 +326,8 @@ (display "foo!" port)))))))) (entry -> (package->manifest-entry thing)) (drv (profile-derivation (manifest (list entry)) - #:hooks '())) + #:hooks '() + #:locales? #f)) (profile -> (derivation->output-path drv))) (mbegin %store-monad (built-derivations (list drv)) diff --git a/tests/pypi.scm b/tests/pypi.scm index 9d2fcc7391..f26e7fea13 100644 --- a/tests/pypi.scm +++ b/tests/pypi.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 David Thompson <davet@gnu.org> +;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -91,51 +92,55 @@ baz > 13.37") (test-assert "pypi->guix-package" ;; Replace network resources with sample data. - (mock ((guix import utils) url-fetch - (lambda (url file-name) - (match url - ("https://pypi.python.org/pypi/foo/json" - (with-output-to-file file-name - (lambda () - (display test-json)))) - ("https://example.com/foo-1.0.0.tar.gz" - (begin - (mkdir "foo-1.0.0") - (with-output-to-file "foo-1.0.0/requirements.txt" - (lambda () - (display test-requirements))) - (system* "tar" "czvf" file-name "foo-1.0.0/") - (delete-file-recursively "foo-1.0.0") - (set! test-source-hash - (call-with-input-file file-name port-sha256)))) - ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f) - (_ (error "Unexpected URL: " url))))) - (match (pypi->guix-package "foo") - (('package - ('name "python-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri (string-append "https://example.com/foo-" - version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'python-build-system) - ('propagated-inputs - ('quasiquote - (("python-bar" ('unquote 'python-bar)) - ("python-baz" ('unquote 'python-baz)) - ("python-setuptools" ('unquote 'python-setuptools))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license 'license:lgpl2.0)) - (string=? (bytevector->nix-base32-string - test-source-hash) - hash)) - (x - (pk 'fail x #f))))) + (mock ((guix import utils) url-fetch + (lambda (url file-name) + (match url + ("https://example.com/foo-1.0.0.tar.gz" + (begin + (mkdir "foo-1.0.0") + (with-output-to-file "foo-1.0.0/requirements.txt" + (lambda () + (display test-requirements))) + (system* "tar" "czvf" file-name "foo-1.0.0/") + (delete-file-recursively "foo-1.0.0") + (set! test-source-hash + (call-with-input-file file-name port-sha256)))) + ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f) + (_ (error "Unexpected URL: " url))))) + (mock ((guix http-client) http-fetch + (lambda (url) + (match url + ("https://pypi.python.org/pypi/foo/json" + (values (open-input-string test-json) + (string-length test-json))) + ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f) + (_ (error "Unexpected URL: " url))))) + (match (pypi->guix-package "foo") + (('package + ('name "python-foo") + ('version "1.0.0") + ('source ('origin + ('method 'url-fetch) + ('uri (string-append "https://example.com/foo-" + version ".tar.gz")) + ('sha256 + ('base32 + (? string? hash))))) + ('build-system 'python-build-system) + ('propagated-inputs + ('quasiquote + (("python-bar" ('unquote 'python-bar)) + ("python-baz" ('unquote 'python-baz)) + ("python-setuptools" ('unquote 'python-setuptools))))) + ('home-page "http://example.com") + ('synopsis "summary") + ('description "summary") + ('license 'license:lgpl2.0)) + (string=? (bytevector->nix-base32-string + test-source-hash) + hash)) + (x + (pk 'fail x #f)))))) (test-skip (if (which "zip") 0 1)) (test-assert "pypi->guix-package, wheels" @@ -143,10 +148,6 @@ baz > 13.37") (mock ((guix import utils) url-fetch (lambda (url file-name) (match url - ("https://pypi.python.org/pypi/foo/json" - (with-output-to-file file-name - (lambda () - (display test-json)))) ("https://example.com/foo-1.0.0.tar.gz" (begin (mkdir "foo-1.0.0") @@ -170,31 +171,39 @@ baz > 13.37") (rename-file zip-file file-name)) (delete-file-recursively "foo-1.0.0.dist-info"))) (_ (error "Unexpected URL: " url))))) - (match (pypi->guix-package "foo") - (('package - ('name "python-foo") - ('version "1.0.0") - ('source ('origin - ('method 'url-fetch) - ('uri (string-append "https://example.com/foo-" - version ".tar.gz")) - ('sha256 - ('base32 - (? string? hash))))) - ('build-system 'python-build-system) - ('propagated-inputs - ('quasiquote - (("python-bar" ('unquote 'python-bar)) - ("python-baz" ('unquote 'python-baz)) - ("python-setuptools" ('unquote 'python-setuptools))))) - ('home-page "http://example.com") - ('synopsis "summary") - ('description "summary") - ('license 'license:lgpl2.0)) - (string=? (bytevector->nix-base32-string - test-source-hash) - hash)) - (x - (pk 'fail x #f))))) + (mock ((guix http-client) http-fetch + (lambda (url) + (match url + ("https://pypi.python.org/pypi/foo/json" + (values (open-input-string test-json) + (string-length test-json))) + ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f) + (_ (error "Unexpected URL: " url))))) + (match (pypi->guix-package "foo") + (('package + ('name "python-foo") + ('version "1.0.0") + ('source ('origin + ('method 'url-fetch) + ('uri (string-append "https://example.com/foo-" + version ".tar.gz")) + ('sha256 + ('base32 + (? string? hash))))) + ('build-system 'python-build-system) + ('propagated-inputs + ('quasiquote + (("python-bar" ('unquote 'python-bar)) + ("python-baz" ('unquote 'python-baz)) + ("python-setuptools" ('unquote 'python-setuptools))))) + ('home-page "http://example.com") + ('synopsis "summary") + ('description "summary") + ('license 'license:lgpl2.0)) + (string=? (bytevector->nix-base32-string + test-source-hash) + hash)) + (x + (pk 'fail x #f)))))) (test-end "pypi") diff --git a/tests/scripts-build.scm b/tests/scripts-build.scm index b324012806..a1f684c736 100644 --- a/tests/scripts-build.scm +++ b/tests/scripts-build.scm @@ -50,6 +50,19 @@ (add-to-store store "guix.scm" #t "sha256" s))))))) +(test-assert "options->transformation, with-source, replacement" + ;; Same, but this time the original package has a 'replacement' field. We + ;; expect that replacement to be set to #f in the new package. + (let* ((p (dummy-package "guix.scm" (replacement coreutils))) + (s (search-path %load-path "guix.scm")) + (t (options->transformation `((with-source . ,s))))) + (with-store store + (let ((new (t store p))) + (and (not (eq? new p)) + (string=? (package-source new) + (add-to-store store "guix.scm" #t "sha256" s)) + (not (package-replacement new))))))) + (test-assert "options->transformation, with-source, with version" ;; Our pseudo-package is called 'guix.scm' so the 'guix.scm-2.0' source ;; should be applicable, and its version should be extracted. diff --git a/tests/store.scm b/tests/store.scm index 38b8efce96..123ea8a787 100644 --- a/tests/store.scm +++ b/tests/store.scm @@ -48,6 +48,15 @@ (test-begin "store") +(test-equal "connection handshake error" + EPROTO + (let ((port (%make-void-port "rw"))) + (guard (c ((nix-connection-error? c) + (and (eq? port (nix-connection-error-file c)) + (nix-connection-error-code c)))) + (open-connection #f #:port port) + 'broken))) + (test-equal "store-path-hash-part" "283gqy39v3g9dxjy26rynl0zls82fmcg" (store-path-hash-part |