aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-09-26 00:20:11 +0200
committerLudovic Courtès <ludo@gnu.org>2013-09-26 00:20:11 +0200
commit7facbf2b58f80afffedbb9230ec7ab9b61232dfe (patch)
tree7ab3870f77f596e548ccd0e50f5ea16d1c32f434
parent1fa49a2c4636c0f35972c16f6bd2d28a4424b821 (diff)
parent834b5c80763eba42018606a674bcc53bfeca10eb (diff)
downloadguix-7facbf2b58f80afffedbb9230ec7ab9b61232dfe.tar
guix-7facbf2b58f80afffedbb9230ec7ab9b61232dfe.tar.gz
Merge branch 'master' into core-updates
-rw-r--r--NEWS88
-rwxr-xr-xbuild-aux/list-packages.scm130
-rw-r--r--doc/guix.texi8
-rw-r--r--gnu/packages/fontutils.scm10
-rw-r--r--gnu/packages/gnupg.scm16
-rw-r--r--gnu/packages/mail.scm5
-rw-r--r--gnu/packages/maths.scm4
-rw-r--r--gnu/packages/package-management.scm22
-rw-r--r--gnu/packages/scheme.scm20
-rw-r--r--gnu/packages/xorg.scm46
-rw-r--r--gnu/packages/zile.scm34
-rw-r--r--gnu/system/dmd.scm67
-rw-r--r--gnu/system/linux.scm13
-rw-r--r--gnu/system/vm.scm202
-rw-r--r--guix/packages.scm4
-rw-r--r--guix/scripts/package.scm27
-rw-r--r--nix/guix-register/guix-register.cc28
-rw-r--r--po/eo.po346
-rw-r--r--tests/guix-package.sh12
-rw-r--r--tests/guix-register.sh26
20 files changed, 829 insertions, 279 deletions
diff --git a/NEWS b/NEWS
index e7cb112bec..1e816d98f5 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,94 @@ Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
Please send Guix bug reports to bug-guix@gnu.org.
+* Changes in 0.4 (since 0.3)
+
+** Package management
+
+*** New ‘--list-generations’ and ‘--delete-generations’ options
+
+The ‘guix package’ command has these two new options, which make it easier to
+deal with a profile’s generation. See “Invoking guix package” in the manual.
+
+*** New ‘guix-register’ program
+
+This program allows the meta-data of a new store to be initialized, by
+copying info from an existing store. It is mostly an internal tool.
+
+** Programming interfaces
+
+*** New API to bootstrap Autotools-based packages
+
+The (guix build-system gnu) has a new ‘dist-package’ procedure that takes a
+package object and source directory, and returns a new package object that
+runs ‘./bootstrap && make dist’ or anything similar.
+
+*** ‘derivation’ and related procedures have a #:references-graphs parameter
+
+This parameter instructs the build daemon to populate the derivation’s build
+tree with files containing the list of references of the given store files.
+This is useful to write code that copies a packages and all its dependencies
+to another storage device, such as a QEMU disk image.
+
+*** Extended API to build a GNU system virtual machine image
+
+The (gnu system vm) module has been augmented in many ways: the ‘qemu-image’
+procedure can now populate and initialize the image’s store; the new
+‘system-qemu-image’ procedure returns a QEMU image that runs dmd as its init
+system, has ‘login’ running on several consoles, has a set of installed
+packages, and where Guix can be used.
+
+New (gnu system …) modules have been added to handle the configuration of the
+various parts of a GNU/Linux system. For instance, (gnu system dmd) provides
+support for instantiating dmd services; (gnu system linux) helps with Linux
+PAM configuration; and so on.
+
+*** <derivation> objects supersede .drv file names in the API
+
+‘derivation’ and similar procedures no longer return two values (a
+<derivation> and a .drv file name); they now return a single value, which is
+a <derivation> object. The <derivation> object embeds the corresponding .drv
+file name. See “Derivations” in the manual for details.
+
+** GNU distribution
+
+*** XXX new packages
+
+*** XXX package updates
+
+*** Fontconfig font search path made more convenient
+
+Fontconfig, the library used by many graphical applications, such as those
+based on GTK+, now knows where to find the default set of fonts. Additional
+fonts installed in the user profile are automatically picked up.
+
+*** More GUI applications
+
+The ‘emacs’ and ‘racket’ packages are now linked against GTK+. New GTK+
+applications have been added (see above.)
+
+*** Packaging guidelines
+
+The documentation of packaging guidelines has been augmented. See the manual
+under “GNU Distribution”.
+
+*** Support for Python 3 along with Python 2
+
+Python 3 has been added to the distribution, and Python packages that support
+it are now built for both Python 2 and Python 3. See the “Python Modules”
+section of the manual for details.
+
+** Internationalization
+
+Updated translations: eo.
+
+** Bugs fixed
+
+*** The dependency graph image has correct size in PDF output
+*** Hop 2.4 builds with newer Bigloo (http://bugs.gnu.org/15194)
+*** Xorg server test suite no longer fails (http://bugs.gnu.org/15392)
+*** Workarounds for Guile 2.0.5 now work on Debian derivatives
+
* Changes in 0.3 (since 0.2)
diff --git a/build-aux/list-packages.scm b/build-aux/list-packages.scm
index 3e798fc6d1..60c9bc39da 100755
--- a/build-aux/list-packages.scm
+++ b/build-aux/list-packages.scm
@@ -29,6 +29,7 @@ exec guile -l "$0" \
#:use-module (guix gnu-maintenance)
#:use-module (gnu packages)
#:use-module (sxml simple)
+ #:use-module (sxml fold)
#:use-module (web uri)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
@@ -48,8 +49,13 @@ exec guile -l "$0" \
(equal? (gnu-package-name package) name))
gnu))))
-(define (package->sxml package)
- "Return HTML-as-SXML representing PACKAGE."
+(define (package->sxml package previous description-ids remaining)
+ "Return 3 values: the HTML-as-SXML for PACKAGE added to all previously
+collected package output in PREVIOUS, a list of DESCRIPTION-IDS and the number
+of packages still to be processed in REMAINING. Also Introduces a call to the
+JavaScript prep_pkg_descs function as part of the output of PACKAGE, every
+time the length of DESCRIPTION-IDS, increasing, is 15 or when REMAINING,
+decreasing, is 1."
(define (source-url package)
(let ((loc (package-location package)))
(and loc
@@ -92,37 +98,66 @@ exec guile -l "$0" \
(and=> (lookup-gnu-package name)
gnu-package-logo))
+ (define (insert-tr description-id js?)
+ (define (insert-js-call description-ids)
+ "Return an sxml call to prep_pkg_descs, with up to 15 elements of
+description-ids as formal parameters."
+ `(script (@ (type "text/javascript"))
+ ,(format #f "prep_pkg_descs(~a)"
+ (string-append "'"
+ (string-join description-ids "', '")
+ "'"))))
+
+ (let ((description-ids (cons description-id description-ids)))
+ `(tr (td ,(if (gnu-package? package)
+ `(img (@ (src "/graphics/gnu-head-mini.png")
+ (alt "Part of GNU")
+ (title "Part of GNU")))
+ ""))
+ (td (a (@ (href ,(source-url package))
+ (title "Link to the Guix package source code"))
+ ,(package-name package) " "
+ ,(package-version package)))
+ (td (span ,(package-synopsis package))
+ (div (@ (id ,description-id))
+ ,(match (package-logo (package-name package))
+ ((? string? url)
+ `(img (@ (src ,url)
+ (height "35")
+ (class "package-logo")
+ (alt ("Logo of " ,(package-name package))))))
+ (_ #f))
+ (p ,(package-description package))
+ ,(license package)
+ (a (@ (href ,(package-home-page package))
+ (title "Link to the package's website"))
+ ,(package-home-page package))
+ ,(status package)
+ ,(if js?
+ (insert-js-call description-ids)
+ ""))))))
+
(let ((description-id (symbol->string
(gensym (package-name package)))))
- `(tr (td ,(if (gnu-package? package)
- `(img (@ (src "/graphics/gnu-head-mini.png")
- (alt "Part of GNU")
- (title "Part of GNU")))
- ""))
- (td (a (@ (href ,(source-url package))
- (title "Link to the Guix package source code"))
- ,(package-name package) " "
- ,(package-version package)))
- (td (a (@ (href "javascript:void(0)")
- (title "show/hide package description")
- (onClick ,(format #f "javascript:show_hide('~a')"
- description-id)))
- ,(package-synopsis package))
- (div (@ (id ,description-id)
- (style "display: none;"))
- ,(match (package-logo (package-name package))
- ((? string? url)
- `(img (@ (src ,url)
- (height "35")
- (class "package-logo")
- (alt ("Logo of " ,(package-name package))))))
- (_ #f))
- (p ,(package-description package))
- ,(license package)
- (a (@ (href ,(package-home-page package))
- (title "Link to the package's website"))
- ,(package-home-page package))
- ,(status package))))))
+ (cond ((= remaining 1) ; Last package in packages
+ (values
+ (reverse ; Fold has reversed packages
+ (cons (insert-tr description-id 'js) ; Prefix final sxml
+ previous))
+ '() ; No more work to do
+ 0)) ; End of the line
+ ((= (length description-ids) 15) ; Time for a JS call
+ (values
+ (cons (insert-tr description-id 'js)
+ previous) ; Prefix new sxml
+ '() ; Reset description-ids
+ (1- remaining))) ; Reduce remaining
+ (else ; Insert another row, and build description-ids
+ (values
+ (cons (insert-tr description-id #f)
+ previous) ; Prefix new sxml
+ (cons description-id description-ids) ; Update description-ids
+ (1- remaining)))))) ; Reduce remaining
(define (packages->sxml packages)
"Return an HTML page as SXML describing PACKAGES."
@@ -145,7 +180,7 @@ exec guile -l "$0" \
(tr (th "GNU?")
(th "Package version")
(th "Package details"))
- ,@(map package->sxml packages))
+ ,@(fold-values package->sxml packages '() '() (length packages)))
(a (@ (href "#intro")
(title "Back to top.")
(id "top"))
@@ -239,14 +274,45 @@ a#top:hover, a#top:focus {
// license: CC0
function show_hide(idThing)
{
+ if(document.getElementById && document.createTextNode) {
var thing = document.getElementById(idThing);
+ /* Used to change the link text, depending on whether description is
+ collapsed or expanded */
+ var thingLink = thing.previousSibling.lastChild.firstChild;
if (thing) {
if (thing.style.display == \"none\") {
thing.style.display = \"\";
+ thingLink.data = 'Collapse';
} else {
thing.style.display = \"none\";
+ thingLink.data = 'Expand';
}
}
+ }
+}
+/* Add controllers used for collapse/expansion of package descriptions */
+function prep(idThing)
+{
+ var tdThing = document.getElementById(idThing).parentNode;
+ if (tdThing) {
+ var aThing = tdThing.firstChild.appendChild(document.createElement('a'));
+ aThing.setAttribute('href', 'javascript:void(0)');
+ aThing.setAttribute('title', 'show/hide package description');
+ aThing.appendChild(document.createTextNode('Expand'));
+ aThing.onclick=function(){show_hide(idThing);};
+ /* aThing.onkeypress=function(){show_hide(idThing);}; */
+ }
+}
+/* Take n element IDs, prepare them for javascript enhanced
+ display and hide the IDs by default. */
+function prep_pkg_descs()
+{
+ if(document.getElementById && document.createTextNode) {
+ for(var i=0; i<arguments.length; i++) {
+ prep(arguments[i])
+ show_hide(arguments[i]);
+ }
+ }
}
</script>"))
diff --git a/doc/guix.texi b/doc/guix.texi
index 90016a4496..442cef26da 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -583,9 +583,8 @@ When combined with options such as @code{--install}, roll back occurs
before any other actions.
When rolling back from the first generation that actually contains
-installed packages, the profile is made to point to the @dfn{empty
-profile}, also known as @dfn{profile zero}---i.e., it contains no files
-apart from its own meta-data.
+installed packages, the profile is made to point to the @dfn{zeroth
+generation}, which contains no files apart from its own meta-data.
Installing, removing, or upgrading packages from a generation that has
been rolled back to overwrites previous future generations. Thus, the
@@ -683,7 +682,8 @@ Multiple Outputs}), and the source location of its definition.
@itemx -l [@var{pattern}]
Return a list of generations along with their creation dates; for each
generation, show the installed packages, with the most recently
-installed packages shown last.
+installed packages shown last. Note that the zeroth generation is never
+shown.
For each installed package, print the following items, separated by
tabs: the name of a package, its version string, the part of the package
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index 8b5e9c582a..ac0dbdf9d5 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -19,6 +19,7 @@
(define-module (gnu packages fontutils)
#:use-module (gnu packages)
#:use-module (gnu packages compression)
+ #:use-module (gnu packages ghostscript)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages xml)
#:use-module ((guix licenses) #:renamer (symbol-prefix-proc 'license:))
@@ -75,11 +76,16 @@ anti-aliased glyph bitmap generation with 256 gray levels.")
(build-system gnu-build-system)
(inputs `(("expat" ,expat)
("freetype" ,freetype)
+ ("gs-fonts" ,gs-fonts)
("pkg-config" ,pkg-config)))
(arguments
`(#:configure-flags
- ;; point to user profile instead of /usr/share/fonts in /etc/fonts.conf
- `("--with-default-fonts=~/.guix-profile/share/fonts")))
+ ;; point to user profile instead of /usr/share/fonts in /etc/fonts.conf
+ (list "--with-default-fonts=~/.guix-profile/share/fonts"
+ ;; register gs-fonts
+ (string-append "--with-add-fonts="
+ (assoc-ref %build-inputs "gs-fonts")
+ "/share/fonts"))))
(synopsis "Fontconfig, a library for configuring and customising font access.")
(description
"Fontconfig can discover new fonts when installed automatically;
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 7c0f50900a..c098db3315 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -57,14 +57,14 @@ Daemon and possibly more in the future.")
(define-public libgcrypt
(package
(name "libgcrypt")
- (version "1.5.2")
+ (version "1.5.3")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
version ".tar.bz2"))
(sha256
(base32
- "0gwnzqd64cpwdmk93nll54nidsr74jpimxzj4p4z7502ylwl66p4"))))
+ "1lar8y3lh61zl5flljpz540d78g99h4d5idfwrfw8lm3gm737xdw"))))
(build-system gnu-build-system)
(propagated-inputs
`(("libgpg-error" ,libgpg-error)))
@@ -106,7 +106,7 @@ provided.")
(define-public libksba
(package
(name "libksba")
- (version "1.2.0")
+ (version "1.3.0")
(source
(origin
(method url-fetch)
@@ -115,7 +115,7 @@ provided.")
version ".tar.bz2"))
(sha256
(base32
- "0jwk7hm3x3g4hd7l12z3d79dy7359x7lc88dq6z7q0ixn1jwxbq9"))))
+ "0w8rfb6yhcwkwzvjafrashcygy4hd9xwwmvlnkfd1m2h0paywqas"))))
(build-system gnu-build-system)
(propagated-inputs
`(("libgpg-error" ,libgpg-error)))
@@ -131,7 +131,7 @@ specifications are building blocks of S/MIME and TLS.")
(define-public gnupg
(package
(name "gnupg")
- (version "2.0.20")
+ (version "2.0.21")
(source
(origin
(method url-fetch)
@@ -139,12 +139,10 @@ specifications are building blocks of S/MIME and TLS.")
".tar.bz2"))
(sha256
(base32
- "16mp0j5inrcqcb3fxbn0b3aamascy3n923wiy0y8marc0rzrp53f"))))
+ "1xgf1q1phdawk6y66haaqcvfnlsqk12jmjin1m2d5x6fqw18kpq0"))))
(build-system gnu-build-system)
(inputs
- `(;; TODO: Add missing optional dep libusb.
-;; ("libusb" ,libusb)
- ("bzip2" ,guix:bzip2)
+ `(("bzip2" ,guix:bzip2)
("curl" ,curl)
("libassuan" ,libassuan)
("libgcrypt" ,libgcrypt)
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index b8ddcd71e1..a6236e7698 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -19,6 +19,7 @@
(define-module (gnu packages mail)
#:use-module (gnu packages)
#:use-module (gnu packages autotools)
+ #:use-module (gnu packages cyrus-sasl)
#:use-module (gnu packages dejagnu)
#:use-module (gnu packages gdbm)
#:use-module (gnu packages gnutls)
@@ -154,7 +155,8 @@ aliasing facilities to work just as they would on normal mail.")
"1864cwz240gh0zy56fb47qqzwyf6ghg01037rb4p2kqgimpg6h91"))))
(build-system gnu-build-system)
(inputs
- `(("ncurses" ,ncurses)
+ `(("cyrus-sasl" ,cyrus-sasl)
+ ("ncurses" ,ncurses)
("openssl" ,openssl)
("perl" ,perl)))
(arguments
@@ -162,6 +164,7 @@ aliasing facilities to work just as they would on normal mail.")
"--enable-imap"
"--enable-pop"
"--with-ssl"
+ "--with-sasl"
;; so that mutt does not check whether the path
;; exists, which it does not in the chroot
"--with-mailpath=/var/mail")))
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 75354122b5..c72d6074ab 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -108,7 +108,7 @@ extensive test suite.")
(define-public pspp
(package
(name "pspp")
- (version "0.8.0a")
+ (version "0.8.1")
(source
(origin
(method url-fetch)
@@ -116,7 +116,7 @@ extensive test suite.")
version ".tar.gz"))
(sha256
(base32
- "1pgkb3z8b4wk4gymnafclhkrqq7n05wq83mra3v53jdl6bnllmyq"))))
+ "0qhxsdbwxd3cn1shc13wxvx2lg32lp4z6sz24kv3jz7p5xfi8j7x"))))
(build-system gnu-build-system)
(inputs
`(("gettext" ,gnu:gettext)
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index e4eb082230..ccd15cef6f 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -22,7 +22,7 @@
#:use-module (guix build-system gnu)
#:use-module ((guix licenses) #:select (gpl3+))
#:use-module (gnu packages guile)
- #:use-module ((gnu packages compression) #:select (bzip2))
+ #:use-module ((gnu packages compression) #:select (bzip2 gzip))
#:use-module (gnu packages gnupg)
#:use-module (gnu packages sqlite)
#:use-module (gnu packages pkg-config))
@@ -41,6 +41,7 @@
(build-system gnu-build-system)
(arguments
`(#:configure-flags (list
+ "--localstatedir=/var"
(string-append "--with-libgcrypt-prefix="
(assoc-ref %build-inputs
"libgcrypt")))
@@ -70,6 +71,8 @@
"/20130105/guile-2.0.7.tar.xz"))
(sha256 hash)))))
`(("bzip2" ,bzip2)
+ ("gzip" ,gzip)
+
("sqlite" ,sqlite)
("libgcrypt" ,libgcrypt)
("guile" ,guile-2.0)
@@ -100,3 +103,20 @@ A user-land free software distribution for GNU/Linux comes as part of Guix.
Guix is based on the Nix package manager.")
(license gpl3+)))
+
+(define-public guix-0.4
+ ;; XXX: Hack to allow the use of a 0.4ish tarball. This assumes that you
+ ;; have run 'make dist' in your build tree. Remove when 0.4 is out.
+ (let* ((builddir (dirname
+ (canonicalize-path
+ (dirname (search-path %load-path
+ "guix/config.scm")))))
+ (tarball (string-append builddir "/guix-0.4.tar.gz")))
+ (package (inherit guix)
+ (version "0.4rc")
+ (source (if (file-exists? tarball)
+ tarball
+ (begin
+ (format (current-error-port)
+ "warning: 'guix-0.4.tar.gz' not found~%")
+ (package-source guix)))))))
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index 43853fa08c..b7df902136 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -32,6 +32,7 @@
#:use-module (gnu packages avahi)
#:use-module (gnu packages libphidget)
#:use-module (gnu packages glib)
+ #:use-module (gnu packages gtk)
#:use-module (gnu packages libffi)
#:use-module (gnu packages libjpeg)
#:use-module ((gnu packages gtk) #:select (cairo pango))
@@ -358,12 +359,15 @@ implementation techniques and as an expository tool.")
'(#:phases
(let* ((gui-libs
(lambda (inputs)
- ;; FIXME: Add GTK+ and GDK for DrRacket.
- (let ((glib (string-append (assoc-ref inputs "glib") "/lib"))
- (cairo (string-append (assoc-ref inputs "cairo") "/lib"))
- (pango (string-append (assoc-ref inputs "pango") "/lib"))
- (libjpeg (string-append (assoc-ref inputs "libjpeg") "/lib")))
- (list glib cairo pango libjpeg)))))
+ (define (lib input)
+ (string-append (assoc-ref inputs input) "/lib"))
+
+ (list (lib "glib")
+ (lib "cairo")
+ (lib "pango")
+ (lib "libjpeg")
+ (lib "gtk")
+ (lib "gdk-pixbuf")))))
(alist-cons-before
'configure 'pre-configure
(lambda* (#:key inputs #:allow-other-keys)
@@ -397,7 +401,9 @@ implementation techniques and as an expository tool.")
("glib" ,glib) ; for DrRacket
("cairo" ,cairo)
("pango" ,pango)
- ("libjpeg" ,libjpeg-8)))
+ ("libjpeg" ,libjpeg-8)
+ ("gdk-pixbuf" ,gdk-pixbuf)
+ ("gtk" ,gtk+)))
(home-page "http://racket-lang.org")
(synopsis "Implementation of Scheme and related languages")
(description
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 0659c8d10c..613e2c5f0e 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -29,11 +29,11 @@
#:use-module ((gnu packages gettext)
#:renamer (symbol-prefix-proc 'gnu:))
#:use-module (gnu packages glib)
+ #:use-module (gnu packages gnupg)
#:use-module (gnu packages gperf)
#:use-module (gnu packages libpng)
#:use-module (gnu packages linux)
#:use-module (gnu packages m4)
- #:use-module (gnu packages openssl)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python)
@@ -3114,9 +3114,9 @@ tracking.")
(license license:x11)))
-(define-public xkbcomp
+(define xkbcomp-intermediate ; used as input for xkeyboard-config
(package
- (name "xkbcomp")
+ (name "xkbcomp-intermediate")
(version "1.2.4")
(source
(origin
@@ -3139,6 +3139,18 @@ tracking.")
(description "X.org provides an implementation of the X Window System")
(license license:x11)))
+(define-public xkbcomp ; using xkeyboard-config as input
+ (package (inherit xkbcomp-intermediate)
+ (name "xkbcomp")
+ (inputs
+ `(,@(package-inputs xkbcomp-intermediate)
+ ("xkeyboard-config" ,xkeyboard-config)))
+ (arguments
+ `(#:configure-flags
+ (list (string-append "--with-xkb-config-root="
+ (assoc-ref %build-inputs "xkeyboard-config")
+ "/share/X11/xkb"))))))
+
(define-public xkbevd
(package
@@ -3212,7 +3224,7 @@ tracking.")
("intltool" ,intltool)
("libx11" ,libx11)
("pkg-config" ,pkg-config)
- ("xkbcomp" ,xkbcomp)))
+ ("xkbcomp-intermediate" ,xkbcomp-intermediate)))
(home-page "http://www.x.org/wiki/")
(synopsis "xorg implementation of the X Window System")
(description "X.org provides an implementation of the X Window System")
@@ -4262,6 +4274,7 @@ emulation to complete hardware acceleration for modern GPUs.")
("dbus" ,dbus)
("dmxproto" ,dmxproto)
("libdmx" ,libdmx)
+ ("libgcrypt" ,libgcrypt)
("libxau" ,libxau)
("libxaw" ,libxaw)
("libxdmcp" ,libxdmcp)
@@ -4273,7 +4286,6 @@ emulation to complete hardware acceleration for modern GPUs.")
("libxt" ,libxt)
("libxv" ,libxv)
("mesa" ,mesa)
- ("openssl" ,openssl)
("pkg-config" ,pkg-config)
("python" ,python-wrapper)
("recordproto" ,recordproto)
@@ -4284,10 +4296,30 @@ emulation to complete hardware acceleration for modern GPUs.")
("xf86dgaproto" ,xf86dgaproto)
("xf86driproto" ,xf86driproto)
("xf86vidmodeproto" ,xf86vidmodeproto)
-;; ("xkbutils" ,xkbutils)
-;; ("xkeyboard-config" ,xkeyboard-config)
+ ("xkbcomp" ,xkbcomp)
+ ("xkeyboard-config" ,xkeyboard-config)
("xtrans" ,xtrans)
("zlib" ,zlib)))
+ (arguments
+ `(#:configure-flags
+ (list (string-append "--with-xkb-path="
+ (assoc-ref %build-inputs "xkeyboard-config")
+ "/share/X11/xkb")
+ (string-append "--with-xkb-output="
+ "/tmp") ; FIXME: This is a bit doubtful; where should
+ ; the compiled keyboard maps go?
+ (string-append "--with-xkb-bin-directory="
+ (assoc-ref %build-inputs "xkbcomp")
+ "/bin"))
+ #:phases
+ (alist-replace
+ 'configure
+ (lambda* (#:key outputs #:allow-other-keys #:rest args)
+ (let ((configure (assoc-ref %standard-phases 'configure)))
+ (substitute* (find-files "." "\\.c$")
+ (("/bin/sh") (which "sh")))
+ (apply configure args)))
+ %standard-phases)))
(home-page "http://www.x.org/wiki/")
(synopsis "xorg implementation of the X Window System")
(description "X.org provides an implementation of the X Window System")
diff --git a/gnu/packages/zile.scm b/gnu/packages/zile.scm
index 6e540ccfab..4907031c89 100644
--- a/gnu/packages/zile.scm
+++ b/gnu/packages/zile.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -24,25 +24,37 @@
#:use-module (gnu packages bdw-gc)
#:use-module (gnu packages perl)
#:use-module (gnu packages help2man)
- #:use-module (gnu packages ncurses))
+ #:use-module (gnu packages ncurses)
+ #:use-module (gnu packages bash))
(define-public zile
(package
(name "zile")
(version "2.4.9")
- (source
- (origin
- (method url-fetch)
- (uri (string-append "mirror://gnu/zile/zile-"
- version ".tar.gz"))
- (sha256
- (base32
- "0j801c28ypm924rw3lqyb6khxyslg6ycrv16wmmwcam0mk3mj6f7"))))
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/zile/zile-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "0j801c28ypm924rw3lqyb6khxyslg6ycrv16wmmwcam0mk3mj6f7"))))
(build-system gnu-build-system)
+ (arguments
+ '(#:phases (alist-cons-before
+ 'configure 'patch-/bin/sh
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((bash (assoc-ref inputs "bash")))
+ ;; Refer to the actual shell.
+ (substitute* '("lib/spawni.c" "src/funcs.c")
+ (("/bin/sh")
+ (string-append bash "/bin/sh")))))
+ %standard-phases)))
(inputs
`(("boehm-gc" ,libgc)
("ncurses" ,ncurses)
- ("perl" ,perl)
+ ("bash" ,bash)))
+ (native-inputs
+ `(("perl" ,perl)
("help2man" ,help2man)))
(home-page "http://www.gnu.org/software/zile/")
(synopsis "Zile is lossy Emacs, a lightweight Emacs clone")
diff --git a/gnu/system/dmd.scm b/gnu/system/dmd.scm
index 1e8767e357..b248d9f0c5 100644
--- a/gnu/system/dmd.scm
+++ b/gnu/system/dmd.scm
@@ -21,8 +21,12 @@
#:use-module (guix packages)
#:use-module (guix derivations)
#:use-module (guix records)
+ #:use-module ((gnu packages base)
+ #:select (glibc-final))
#:use-module ((gnu packages system)
#:select (mingetty inetutils))
+ #:use-module ((gnu packages package-management)
+ #:select (guix))
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:export (service?
@@ -34,8 +38,13 @@
service-stop
service-inputs
+ host-name-service
syslog-service
mingetty-service
+ nscd-service
+ guix-service
+ static-networking-service
+
dmd-configuration-file))
;;; Commentary:
@@ -58,6 +67,14 @@
(inputs service-inputs ; list of inputs
(default '())))
+(define (host-name-service store name)
+ "Return a service that sets the host name to NAME."
+ (service
+ (provision '(host-name))
+ (start `(lambda _
+ (sethostname ,name)))
+ (respawn? #f)))
+
(define (mingetty-service store tty)
"Return a service to run mingetty on TTY."
(let* ((mingetty-drv (package-derivation store mingetty))
@@ -65,9 +82,32 @@
"/sbin/mingetty")))
(service
(provision (list (symbol-append 'term- (string->symbol tty))))
+
+ ;; Since the login prompt shows the host name, wait for the 'host-name'
+ ;; service to be done.
+ (requirement '(host-name))
+
(start `(make-forkexec-constructor ,mingetty-bin "--noclear" ,tty))
(inputs `(("mingetty" ,mingetty))))))
+(define* (nscd-service store
+ #:key (glibc glibc-final))
+ "Return a service that runs libc's name service cache daemon (nscd)."
+ (let ((nscd (string-append (package-output store glibc) "/sbin/nscd")))
+ (service
+ (provision '(nscd))
+ (start `(make-forkexec-constructor ,nscd "-f" "/dev/null"))
+
+ ;; XXX: Local copy of 'make-kill-destructor' because the one upstream
+ ;; uses the broken 'opt-lambda' macro.
+ (stop `(lambda* (#:optional (signal SIGTERM))
+ (lambda (pid . args)
+ (kill pid signal)
+ #f)))
+
+ (respawn? #f)
+ (inputs `(("glibc" ,glibc))))))
+
(define (syslog-service store)
"Return a service that runs 'syslogd' with reasonable default settings."
@@ -104,6 +144,33 @@
(inputs `(("inetutils" ,inetutils)
("syslog.conf" ,syslog.conf))))))
+(define* (guix-service store #:key (guix guix))
+ "Return a service that runs the build daemon from GUIX."
+ (let* ((drv (package-derivation store guix))
+ (daemon (string-append (derivation->output-path drv)
+ "/bin/guix-daemon")))
+ (service
+ (provision '(guix-daemon))
+ (start `(make-forkexec-constructor ,daemon))
+ (inputs `(("guix" ,guix))))))
+
+(define* (static-networking-service store interface ip
+ #:key (inetutils inetutils))
+ "Return a service that starts INTERFACE with address IP."
+
+ ;; TODO: Eventually we should do this using Guile's networking procedures,
+ ;; like 'configure-qemu-networking' does, but the patch that does this is
+ ;; not yet in stock Guile.
+ (let ((ifconfig (string-append (package-output store inetutils)
+ "/bin/ifconfig")))
+ (service
+ (provision '(networking))
+ (start `(make-forkexec-constructor ,ifconfig ,interface ,ip "up"))
+ (stop `(make-forkexec-constructor ,ifconfig ,interface "down"))
+ (respawn? #f)
+ (inputs `(("inetutils" ,inetutils))))))
+
+
(define (dmd-configuration-file store services)
"Return the dmd configuration file for SERVICES."
(define config
diff --git a/gnu/system/linux.scm b/gnu/system/linux.scm
index b2daa13e06..6aebe159ba 100644
--- a/gnu/system/linux.scm
+++ b/gnu/system/linux.scm
@@ -125,9 +125,10 @@
(let ((unix (pam-entry
(control "required")
(module "pam_unix.so"))))
- (lambda* (name #:key allow-empty-passwords?)
+ (lambda* (name #:key allow-empty-passwords? motd)
"Return a standard Unix-style PAM service for NAME. When
-ALLOW-EMPTY-PASSWORDS? is true, allow empty passwords."
+ALLOW-EMPTY-PASSWORDS? is true, allow empty passwords. When MOTD is true, it
+should be the name of a file used as the message-of-the-day."
;; See <http://www.linux-pam.org/Linux-PAM-html/sag-configuration-example.html>.
(let ((name* name))
(pam-service
@@ -140,6 +141,12 @@ ALLOW-EMPTY-PASSWORDS? is true, allow empty passwords."
(arguments '("nullok")))
unix)))
(password (list unix))
- (session (list unix)))))))
+ (session (if motd
+ (list unix
+ (pam-entry
+ (control "optional")
+ (module "pam_motd.so")
+ (arguments (list (string-append "motd=" motd)))))
+ (list unix))))))))
;;; linux.scm ends here
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index df55f7c94e..0ed805510a 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -23,6 +23,8 @@
#:use-module (guix packages)
#:use-module ((gnu packages base) #:select (%final-inputs
guile-final
+ gcc-final
+ glibc-final
coreutils))
#:use-module (gnu packages guile)
#:use-module (gnu packages bash)
@@ -31,6 +33,7 @@
#:use-module (gnu packages grub)
#:use-module (gnu packages linux)
#:use-module (gnu packages linux-initrd)
+ #:use-module (gnu packages package-management)
#:use-module ((gnu packages make-bootstrap)
#:select (%guile-static-stripped))
#:use-module (gnu packages system)
@@ -91,6 +94,10 @@ made available under the /xchg CIFS share."
`(,input . ,(package-output store package "out" system)))
((input (? package? package) sub-drv)
`(,input . ,(package-output store package sub-drv system)))
+ ((input (? derivation? drv))
+ `(,input . ,(derivation->output-path drv)))
+ ((input (? derivation? drv) sub-drv)
+ `(,input . ,(derivation->output-path drv sub-drv)))
((input (and (? string?) (? store-path?) file))
`(,input . ,file)))
inputs))
@@ -177,7 +184,8 @@ made available under the /xchg CIFS share."
`(,name ,(->drv package)
,@sub-drv))
((name (? string? file))
- `(,name ,file)))
+ `(,name ,file))
+ (tuple tuple))
inputs))
#:env-vars env-vars
#:modules (delete-duplicates
@@ -191,6 +199,7 @@ made available under the /xchg CIFS share."
(system (%current-system))
(disk-image-size (* 100 (expt 2 20)))
grub-configuration
+ (initialize-store? #f)
(populate #f)
(inputs '())
(inputs-to-copy '()))
@@ -199,11 +208,13 @@ disk image, with a GRUB installation that uses GRUB-CONFIGURATION as its
configuration file.
INPUTS-TO-COPY is a list of inputs (as for packages) whose closure is copied
-into the image being built.
+into the image being built. When INITIALIZE-STORE? is true, initialize the
+store database in the image so that Guix can be used in the image.
-When POPULATE is true, it must be the store file name of a Guile script to run
-in the disk image partition once it has been populated with INPUTS-TO-COPY.
-It can be used to provide additional files, such as /etc files."
+POPULATE is a list of directives stating directories or symlinks to be created
+in the disk image partition. It is evaluated once the image has been
+populated with INPUTS-TO-COPY. It can be used to provide additional files,
+such as /etc files."
(define input->name+derivation
(match-lambda
((name (? package? package))
@@ -213,6 +224,10 @@ It can be used to provide additional files, such as /etc files."
`(,name . ,(derivation->output-path
(package-derivation store package system)
sub-drv)))
+ ((name (? derivation? drv))
+ `(,name . ,(derivation->output-path drv)))
+ ((name (? derivation? drv) sub-drv)
+ `(,name . ,(derivation->output-path drv sub-drv)))
((input (and (? string?) (? store-path?) file))
`(,input . ,file))))
@@ -298,6 +313,36 @@ It can be used to provide additional files, such as /etc files."
;; Populate /dev.
(make-essential-device-nodes #:root "/fs")
+ ;; Optionally, register the inputs in the image's store.
+ (let* ((guix (assoc-ref %build-inputs "guix"))
+ (register (string-append guix
+ "/sbin/guix-register")))
+ ,@(if initialize-store?
+ (match inputs-to-copy
+ (((graph-files . _) ...)
+ (map (lambda (closure)
+ `(system* register "--prefix" "/fs"
+ ,(string-append "/xchg/"
+ closure)))
+ graph-files)))
+ '(#f)))
+
+ ;; Evaluate the POPULATE directives.
+ ,@(let loop ((directives populate)
+ (statements '()))
+ (match directives
+ (()
+ (reverse statements))
+ ((('directory name) rest ...)
+ (loop rest
+ (cons `(mkdir-p ,(string-append "/fs" name))
+ statements)))
+ (((new '-> old) rest ...)
+ (loop rest
+ (cons `(symlink ,old
+ ,(string-append "/fs" new))
+ statements)))))
+
(and=> (assoc-ref %build-inputs "populate")
(lambda (populate)
(chdir "/fs")
@@ -337,8 +382,8 @@ It can be used to provide additional files, such as /etc files."
("gawk" ,(car (assoc-ref %final-inputs "gawk")))
("util-linux" ,util-linux)
- ,@(if populate
- `(("populate" ,populate))
+ ,@(if initialize-store?
+ `(("guix" ,guix-0.4))
'())
,@inputs-to-copy)
@@ -353,19 +398,73 @@ It can be used to provide additional files, such as /etc files."
;;; Stand-alone VM image.
;;;
+(define* (union store inputs
+ #:key (guile (%guile-for-build)) (system (%current-system))
+ (name "union"))
+ "Return a derivation that builds the union of INPUTS. INPUTS is a list of
+input tuples."
+ (define builder
+ `(begin
+ (use-modules (guix build union))
+
+ (setvbuf (current-output-port) _IOLBF)
+ (setvbuf (current-error-port) _IOLBF)
+
+ (let ((output (assoc-ref %outputs "out"))
+ (inputs (map cdr %build-inputs)))
+ (format #t "building union `~a' with ~a packages...~%"
+ output (length inputs))
+ (union-build output inputs))))
+
+ (build-expression->derivation store name system builder
+ (map (match-lambda
+ ((name (? package? p))
+ `(,name ,(package-derivation store p
+ system)))
+ ((name (? package? p) output)
+ `(,name ,(package-derivation store p
+ system)
+ ,output))
+ (x x))
+ inputs)
+ #:modules '((guix build union))
+ #:guile-for-build guile))
+
(define (system-qemu-image store)
"Return the derivation of a QEMU image of the GNU system."
+ (define motd
+ (add-text-to-store store "motd" "
+Happy birthday, GNU! http://www.gnu.org/gnu30
+
+"))
+
(define %pam-services
;; Services known to PAM.
(list %pam-other-services
- (unix-pam-service "login" #:allow-empty-passwords? #t)))
+ (unix-pam-service "login"
+ #:allow-empty-passwords? #t
+ #:motd motd)))
(define %dmd-services
;; Services run by dmd.
- (list (mingetty-service store "tty1")
+ (list (host-name-service store "gnu")
+ (mingetty-service store "tty1")
(mingetty-service store "tty2")
(mingetty-service store "tty3")
- (syslog-service store)))
+ (mingetty-service store "tty4")
+ (mingetty-service store "tty5")
+ (mingetty-service store "tty6")
+ (syslog-service store)
+ (guix-service store #:guix guix-0.4)
+ (nscd-service store)
+
+ ;; QEMU networking settings.
+ (static-networking-service store "eth0" "10.0.2.10")))
+
+ (define resolv.conf
+ ;; Name resolution for default QEMU settings.
+ (add-text-to-store store "resolv.conf"
+ "nameserver 10.0.2.3\n"))
(parameterize ((%guile-for-build (package-derivation store guile-final)))
(let* ((bash-drv (package-derivation store bash))
@@ -383,20 +482,53 @@ It can be used to provide additional files, such as /etc files."
"root:x:0:\n"))
(pam.d-drv (pam-services->directory store %pam-services))
(pam.d (derivation->output-path pam.d-drv))
- (populate
- (add-text-to-store store "populate-qemu-image"
- (object->string
- `(begin
- (mkdir-p "etc")
- (mkdir-p "var/log") ; for dmd
- (symlink ,shadow "etc/shadow")
- (symlink ,passwd "etc/passwd")
- (symlink ,group "etc/group")
- (symlink "/dev/null"
- "etc/login.defs")
- (symlink ,pam.d "etc/pam.d")
- (mkdir-p "var/run")))
- (list passwd)))
+
+ (packages `(("coreutils" ,coreutils)
+ ("bash" ,bash)
+ ("guile" ,guile-2.0)
+ ("dmd" ,dmd)
+ ("gcc" ,gcc-final)
+ ("libc" ,glibc-final)
+ ("inetutils" ,inetutils)
+ ("guix" ,guix-0.4)))
+
+ ;; TODO: Replace with a real profile with a manifest.
+ ;; TODO: Generate bashrc from packages' search-paths.
+ (profile-drv (union store packages
+ #:name "default-profile"))
+ (profile (derivation->output-path profile-drv))
+ (bashrc (add-text-to-store store "bashrc"
+ (string-append "
+export PS1='\\u@\\h\\$ '
+export PATH=$HOME/.guix-profile/bin:" profile "/bin:" profile "/sbin
+export CPATH=$HOME/.guix-profile/include:" profile "/include
+export LIBRARY_PATH=$HOME/.guix-profile/lib:" profile "/lib
+alias ls='ls -p --color'
+alias ll='ls -l'
+")))
+
+ (issue (add-text-to-store store "issue" "
+This is an alpha preview of the GNU system. Welcome.
+
+This image features the GNU Guix package manager, which was used to
+build it (http://www.gnu.org/software/guix/). The init system is
+GNU dmd (http://www.gnu.org/software/dmd/).
+
+You can log in as 'root' with no password.
+"))
+
+ (populate `((directory "/etc")
+ (directory "/var/log") ; for dmd
+ (directory "/var/run/nscd")
+ ("/etc/shadow" -> ,shadow)
+ ("/etc/passwd" -> ,passwd)
+ ("/etc/login.defs" -> "/dev/null")
+ ("/etc/pam.d" -> ,pam.d)
+ ("/etc/resolv.conf" -> ,resolv.conf)
+ ("/etc/profile" -> ,bashrc)
+ ("/etc/issue" -> ,issue)
+ (directory "/var/nix/gcroots")
+ ("/var/nix/gcroots/default-profile" -> ,profile)))
(out (derivation->output-path
(package-derivation store mingetty)))
(boot (add-text-to-store store "boot"
@@ -405,32 +537,36 @@ It can be used to provide additional files, such as /etc files."
"--config" ,dmd-conf))
(list out)))
(entries (list (menu-entry
- (label "Boot-to-Guile! (GNU System technology preview)")
+ (label (string-append
+ "GNU System with Linux-Libre "
+ (package-version linux-libre)
+ " (technology preview)"))
(linux linux-libre)
(linux-arguments `("--root=/dev/vda1"
,(string-append "--load=" boot)))
(initrd gnu-system-initrd))))
(grub.cfg (grub-configuration-file store entries)))
- (build-derivations store (list pam.d-drv))
(qemu-image store
#:grub-configuration grub.cfg
#:populate populate
- #:disk-image-size (* 400 (expt 2 20))
+ #:disk-image-size (* 500 (expt 2 20))
+ #:initialize-store? #t
#:inputs-to-copy `(("boot" ,boot)
("linux" ,linux-libre)
("initrd" ,gnu-system-initrd)
- ("coreutils" ,coreutils)
- ("bash" ,bash)
- ("guile" ,guile-2.0)
- ("mingetty" ,mingetty)
- ("dmd" ,dmd)
+ ("pam.d" ,pam.d-drv)
+ ("profile" ,profile-drv)
;; Configuration.
("dmd.conf" ,dmd-conf)
- ("etc-pam.d" ,pam.d)
+ ("etc-pam.d" ,pam.d-drv)
("etc-passwd" ,passwd)
("etc-shadow" ,shadow)
("etc-group" ,group)
+ ("etc-resolv.conf" ,resolv.conf)
+ ("etc-bashrc" ,bashrc)
+ ("etc-issue" ,issue)
+ ("etc-motd" ,motd)
,@(append-map service-inputs
%dmd-services))))))
diff --git a/guix/packages.scm b/guix/packages.scm
index efec414675..9433fe9586 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -462,8 +462,8 @@ system identifying string)."
#:outputs outputs #:system system
(args))))))))
-(define* (package-output store package output
- #:optional (system (%current-system)))
+(define* (package-output store package
+ #:optional (output "out") (system (%current-system)))
"Return the output path of PACKAGE's OUTPUT for SYSTEM---where OUTPUT is the
symbolic output name, such as \"out\". Note that this procedure calls
`package-derivation', which is costly."
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 1d00e39540..66505f172f 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -955,12 +955,16 @@ more information.~%"))
(match (assoc-ref opts 'query)
(('list-generations pattern)
(define (list-generation number)
- (begin
- (format #t (_ "Generation ~a\t~a~%") number
- (date->string
- (time-utc->date
- (generation-time profile number))
- "~b ~d ~Y ~T"))
+ (unless (zero? number)
+ (let ((header (format #f (_ "Generation ~a\t~a") number
+ (date->string
+ (time-utc->date
+ (generation-time profile number))
+ "~b ~d ~Y ~T")))
+ (current (generation-number profile)))
+ (if (= number current)
+ (format #t (_ "~a\t(current)~%") header)
+ (format #t "~a~%" header)))
(for-each (match-lambda
((name version output location _)
(format #t " ~a\t~a\t~a\t~a~%"
@@ -977,11 +981,16 @@ more information.~%"))
(leave (_ "profile '~a' does not exist~%")
profile))
((string-null? pattern)
- (for-each list-generation
- (generation-numbers profile)))
+ (let ((numbers (generation-numbers profile)))
+ (if (equal? numbers '(0))
+ (exit 1)
+ (for-each list-generation numbers))))
((matching-generations pattern profile)
=>
- (cut for-each list-generation <>))
+ (lambda (numbers)
+ (if (null-list? numbers)
+ (exit 1)
+ (for-each list-generation numbers))))
(else
(leave (_ "invalid syntax: ~a~%")
pattern)))
diff --git a/nix/guix-register/guix-register.cc b/nix/guix-register/guix-register.cc
index 0a028f0cfe..14478f6a13 100644
--- a/nix/guix-register/guix-register.cc
+++ b/nix/guix-register/guix-register.cc
@@ -62,6 +62,10 @@ static const struct argp_option options[] =
{ 0, 0, 0, 0, 0 }
};
+
+/* Prefix of the store being populated. */
+static std::string prefix;
+
/* Parse a single option. */
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
@@ -70,7 +74,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
{
case 'p':
{
- string prefix = canonPath (arg);
+ prefix = canonPath (arg);
settings.nixStore = prefix + NIX_STORE_DIR;
settings.nixDataDir = prefix + NIX_DATA_DIR;
settings.nixLogDir = prefix + NIX_LOG_DIR;
@@ -128,15 +132,25 @@ register_validity (LocalStore *store, std::istream &input,
ValidPathInfo info = decodeValidPathInfo (input, hashGiven);
if (info.path == "")
break;
+
+ /* Rewrite the input to refer final name, as if we were in a chroot
+ under PREFIX. */
+ std::string final_prefix (NIX_STORE_DIR "/");
+ info.path = final_prefix + baseNameOf (info.path);
+
+ /* Keep its real path to canonicalize it and compute its hash. */
+ std::string real_path;
+ real_path = prefix + "/" + settings.nixStore + "/" + baseNameOf (info.path);
+
if (!store->isValidPath (info.path) || reregister)
{
/* !!! races */
if (canonicalise)
- canonicalisePathMetaData (info.path, -1);
+ canonicalisePathMetaData (real_path, -1);
if (!hashGiven)
{
- HashResult hash = hashPath (htSHA256, info.path);
+ HashResult hash = hashPath (htSHA256, real_path);
info.hash = hash.first;
info.narSize = hash.second;
}
@@ -155,7 +169,15 @@ main (int argc, char *argv[])
{
argp_parse (&argp, argc, argv, 0, 0, 0);
+ /* Instantiate the store. This creates any missing directories among
+ 'settings.nixStore', 'settings.nixDBPath', etc. */
LocalStore store;
+
+ /* Under the --prefix tree, the final name of the store will be
+ NIX_STORE_DIR. Set it here so that the database uses file names
+ prefixed by NIX_STORE_DIR and not PREFIX + NIX_STORE_DIR. */
+ settings.nixStore = NIX_STORE_DIR;
+
register_validity (&store, *input);
}
catch (std::exception &e)
diff --git a/po/eo.po b/po/eo.po
index b5f56f2cd4..ab1d82ff15 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -5,16 +5,17 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: guix 0.3-pre3\n"
+"Project-Id-Version: guix 0.4-pre2\n"
"Report-Msgid-Bugs-To: ludo@gnu.org\n"
-"POT-Creation-Date: 2013-08-15 11:44+0200\n"
-"PO-Revision-Date: 2013-07-25 09:25-0300\n"
+"POT-Creation-Date: 2013-09-25 16:04+0200\n"
+"PO-Revision-Date: 2013-09-25 15:53-0300\n"
"Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
-"Language: eo\n"
+"Language: Esperanto\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
#: gnu/packages.scm:94
#, scheme-format
@@ -52,15 +53,13 @@ msgid ""
"Sed (stream editor) isn't really a true text editor or text processor.\n"
"Instead, it is used to filter text, i.e., it takes text input and performs\n"
"some operation (or set of operations) on it and outputs the modified text.\n"
-"Sed is typically used for extracting part of a file using pattern matching "
-"or\n"
+"Sed is typically used for extracting part of a file using pattern matching or\n"
"substituting multiple occurrences of a string within a file."
msgstr ""
"Sed (flu-redaktilo) ne estas fakte vera tekst-redaktilo aŭ tekst-procezilo.\n"
"Anstataŭe, ĝi estas uzata por filtri tekston, t.e., ĝi prenas tekston kaj\n"
"aplikas iun operacion (aŭ aron) al ĝi kaj eligas la modifitan tekston.\n"
-"Sed ordinare estas uzata por eltiri parton de dosiero per ŝablon-kongruon "
-"aŭ\n"
+"Sed ordinare estas uzata por eltiri parton de dosiero per ŝablon-kongruon aŭ\n"
"por anstataŭigi multoblajn aperojn de ĉeno interne de dosiero."
#: gnu/packages/base.scm:140
@@ -77,8 +76,7 @@ msgid ""
"Initially, tar archives were used to store files conveniently on magnetic\n"
"tape. The name \"Tar\" comes from this use; it stands for tape archiver.\n"
"Despite the utility's name, Tar can direct its output to available devices,\n"
-"files, or other programs (using pipes), it can even access remote devices "
-"or\n"
+"files, or other programs (using pipes), it can even access remote devices or\n"
"files (as archives)."
msgstr ""
@@ -89,8 +87,7 @@ msgstr "Apliki malsamojn al originaloj, kun nedevigaj savkopioj"
#: gnu/packages/base.scm:175
msgid ""
"GNU Patch takes a patch file containing a difference listing produced by\n"
-"the diff program and applies those differences to one or more original "
-"files,\n"
+"the diff program and applies those differences to one or more original files,\n"
"producing patched versions."
msgstr ""
@@ -104,25 +101,21 @@ msgid ""
"differences between files.\n"
"\n"
"Computer users often find occasion to ask how two files differ. Perhaps one\n"
-"file is a newer version of the other file. Or maybe the two files started "
-"out\n"
+"file is a newer version of the other file. Or maybe the two files started out\n"
"as identical copies but were changed by different people.\n"
"\n"
"You can use the diff command to show differences between two files, or each\n"
-"corresponding file in two directories. diff outputs differences between "
-"files\n"
+"corresponding file in two directories. diff outputs differences between files\n"
"line by line in any of several formats, selectable by command line\n"
"options. This set of differences is often called a ‘diff’ or ‘patch’. For\n"
"files that are identical, diff normally produces no output; for\n"
-"binary (non-text) files, diff normally reports only that they are "
-"different.\n"
+"binary (non-text) files, diff normally reports only that they are different.\n"
"\n"
"You can use the cmp command to show the offsets and line numbers where two\n"
"files differ. cmp can also show all the characters that differ between the\n"
"two files, side by side.\n"
"\n"
-"You can use the diff3 command to show differences among three files. When "
-"two\n"
+"You can use the diff3 command to show differences among three files. When two\n"
"people have made independent changes to a common original, diff3 can report\n"
"the differences between the original and the two changed versions, and can\n"
"produce a merged file that contains both persons' changes together with\n"
@@ -139,8 +132,7 @@ msgstr "Operacio sur dosieroj kongruantaj al indikia kriterio"
msgid ""
"The GNU Find Utilities are the basic directory searching utilities of\n"
"the GNU operating system. These programs are typically used in conjunction\n"
-"with other programs to provide modular and powerful directory search and "
-"file\n"
+"with other programs to provide modular and powerful directory search and file\n"
"locating capabilities to other commands.\n"
"\n"
"The tools supplied with this package are:\n"
@@ -172,10 +164,8 @@ msgid ""
"non-source files of a program from the program's source files.\n"
"\n"
"Make gets its knowledge of how to build your program from a file called the\n"
-"makefile, which lists each of the non-source files and how to compute it "
-"from\n"
-"other files. When you write a program, you should write a makefile for it, "
-"so\n"
+"makefile, which lists each of the non-source files and how to compute it from\n"
+"other files. When you write a program, you should write a makefile for it, so\n"
"that it is possible to use Make to build and install the program."
msgstr ""
@@ -197,12 +187,10 @@ msgstr "La Biblioteko GNU C"
#: gnu/packages/base.scm:502
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"
+"defines the \"system calls\" and other basic facilities such as open, malloc,\n"
"printf, exit...\n"
"\n"
-"The GNU C library is used as the C library in the GNU system and most "
-"systems\n"
+"The GNU C library is used as the C library in the GNU system and most systems\n"
"with the Linux kernel."
msgstr ""
@@ -215,8 +203,7 @@ 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"
"representative locations around the globe. It is updated periodically to\n"
-"reflect changes made by political bodies to time zone boundaries, UTC "
-"offsets,\n"
+"reflect changes made by political bodies to time zone boundaries, UTC offsets,\n"
"and daylight-saving rules."
msgstr ""
@@ -227,8 +214,7 @@ msgstr "La ligila ĉirkaŭanto"
#: gnu/packages/base.scm:992
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"
+"missing `-rpath' flags, and to detect any misuse of libraries outside of the\n"
"store."
msgstr ""
@@ -262,8 +248,7 @@ msgid ""
"Guile-Reader is a simple framework for building readers for GNU Guile.\n"
"\n"
"The idea is to make it easy to build procedures that extend Guile’s read\n"
-"procedure. Readers supporting various syntax variants can easily be "
-"written,\n"
+"procedure. Readers supporting various syntax variants can easily be written,\n"
"possibly by re-using existing “token readers” of a standard Scheme\n"
"readers. For example, it is used to implement Skribilo’s R5RS-derived\n"
"document syntax.\n"
@@ -280,8 +265,7 @@ msgstr "Bindoj de Guile por ncurses"
#: gnu/packages/guile.scm:268
msgid ""
"GNU Guile-Ncurses is a library for the Guile Scheme interpreter that\n"
-"provides functions for creating text user interfaces. The text user "
-"interface\n"
+"provides functions for creating text user interfaces. The text user interface\n"
"functionality is built on the ncurses libraries: curses, form, panel, and\n"
"menu."
msgstr ""
@@ -293,33 +277,39 @@ msgstr "Lanĉi taskoj je antaŭplanitaj horoj"
#: gnu/packages/guile.scm:294
msgid ""
"The GNU package mcron (Mellor's cron) is a 100% compatible replacement\n"
-"for Vixie cron. It is written in pure Guile, and allows configuration "
-"files\n"
+"for Vixie cron. It is written in pure Guile, and allows configuration files\n"
"to be written in scheme (as well as Vixie's original format) for infinite\n"
-"flexibility in specifying when jobs should be run. Mcron was written by "
-"Dale\n"
+"flexibility in specifying when jobs should be run. Mcron was written by Dale\n"
"Mellor."
msgstr ""
+#: gnu/packages/guile.scm:323
+msgid "Collection of useful Guile Scheme modules"
+msgstr "Aro da utilaj moduloj de Guile Scheme"
+
+#: gnu/packages/guile.scm:325
+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"
+"modules into a coherent library. Think \"a down-scaled, limited-scope CPAN\n"
+"for Guile\"."
+msgstr ""
+
#: gnu/packages/lout.scm:109
msgid "Lout, a document layout system similar in style to LaTeX"
msgstr "Lout, dokument-aranĝa sistemo simila al LaTeX, laŭ stilo"
#: gnu/packages/lout.scm:111
msgid ""
-"The Lout document formatting system is now reads a high-level description "
-"of\n"
-"a document similar in style to LaTeX and produces a PostScript or plain "
-"text\n"
+"The Lout document formatting system is now reads a high-level description of\n"
+"a document similar in style to LaTeX and produces a PostScript or plain text\n"
"output file.\n"
"\n"
"Lout offers an unprecedented range of advanced features, including optimal\n"
"paragraph and page breaking, automatic hyphenation, PostScript EPS file\n"
-"inclusion and generation, equation formatting, tables, diagrams, rotation "
-"and\n"
+"inclusion and generation, equation formatting, tables, diagrams, rotation and\n"
"scaling, sorted indexes, bibliographic databases, running headers and\n"
-"odd-even pages, automatic cross referencing, multilingual documents "
-"including\n"
+"odd-even pages, automatic cross referencing, multilingual documents including\n"
"hyphenation (most European languages are supported), formatting of computer\n"
"programs, and much more, all ready to use. Furthermore, Lout is easily\n"
"extended with definitions which are very much easier to write than troff of\n"
@@ -408,25 +398,23 @@ msgstr ""
"\n"
" -n, --dry-run ne konstrui derivaĵojn"
-#: guix/scripts/build.scm:84 guix/scripts/package.scm:449
+#: guix/scripts/build.scm:84 guix/scripts/package.scm:519
msgid ""
"\n"
" --fallback fall back to building when the substituter fails"
msgstr ""
"\n"
-" --fallback retropaŝi al konstruado kiam la anstataŭiganto "
-"fiaskas"
+" --fallback retropaŝi al konstruado kiam la anstataŭiganto fiaskas"
-#: guix/scripts/build.scm:86 guix/scripts/package.scm:451
+#: guix/scripts/build.scm:86 guix/scripts/package.scm:521
msgid ""
"\n"
" --no-substitutes build instead of resorting to pre-built substitutes"
msgstr ""
"\n"
-" --no-substitutes konstrui anstataŭ provi jam-konstruitajn "
-"anstataŭigantojn"
+" --no-substitutes konstrui anstataŭ provi jam-konstruitajn anstataŭigantojn"
-#: guix/scripts/build.scm:88 guix/scripts/package.scm:453
+#: guix/scripts/build.scm:88 guix/scripts/package.scm:523
msgid ""
"\n"
" --max-silent-time=SECONDS\n"
@@ -434,8 +422,7 @@ msgid ""
msgstr ""
"\n"
" --max-silent-time=SEKUNDOJ\n"
-" marki la konstruo kiel fiaskinta post SEKUNDOJ da "
-"silento"
+" marki la konstruo kiel fiaskinta post SEKUNDOJ da silento"
#: guix/scripts/build.scm:91
msgid ""
@@ -452,8 +439,7 @@ msgid ""
" as a garbage collector root"
msgstr ""
"\n"
-" -r, --root=DOSIERO igi DOSIEROn simbola ligo al la rezulto, kaj "
-"registri\n"
+" -r, --root=DOSIERO igi DOSIEROn simbola ligo al la rezulto, kaj registri\n"
" ĝin kiel radikon de rubaĵ-kolektanto"
#: guix/scripts/build.scm:96
@@ -465,8 +451,9 @@ msgstr ""
" --verbosity=NIVELO uzi la indikitan detaligan NIVELOn"
#: guix/scripts/build.scm:99 guix/scripts/download.scm:53
-#: guix/scripts/package.scm:470 guix/scripts/gc.scm:58
-#: guix/scripts/hash.scm:51 guix/scripts/pull.scm:149
+#: guix/scripts/package.scm:540 guix/scripts/gc.scm:58
+#: guix/scripts/hash.scm:51 guix/scripts/pull.scm:152
+#: guix/scripts/substitute-binary.scm:463
msgid ""
"\n"
" -h, --help display this help and exit"
@@ -475,8 +462,9 @@ msgstr ""
" -h, --help montri ĉi tiun helpon kaj eliri"
#: guix/scripts/build.scm:101 guix/scripts/download.scm:55
-#: guix/scripts/package.scm:472 guix/scripts/gc.scm:60
-#: guix/scripts/hash.scm:53 guix/scripts/pull.scm:151
+#: guix/scripts/package.scm:542 guix/scripts/gc.scm:60
+#: guix/scripts/hash.scm:53 guix/scripts/pull.scm:154
+#: guix/scripts/substitute-binary.scm:465
msgid ""
"\n"
" -V, --version display version information and exit"
@@ -490,8 +478,8 @@ msgid "~a: not a number~%"
msgstr "~a: ne estas numero~%"
#: guix/scripts/build.scm:176 guix/scripts/download.scm:96
-#: guix/scripts/package.scm:554 guix/scripts/gc.scm:152
-#: guix/scripts/pull.scm:178
+#: guix/scripts/package.scm:628 guix/scripts/gc.scm:152
+#: guix/scripts/pull.scm:181
#, scheme-format
msgid "~A: unrecognized option~%"
msgstr "~A: nerekonata modifilo~%"
@@ -501,12 +489,12 @@ msgstr "~A: nerekonata modifilo~%"
msgid "failed to create GC root `~a': ~a~%"
msgstr "fiasko dum kreo de radiko GC '~a': ~a~%"
-#: guix/scripts/build.scm:226 guix/scripts/package.scm:600
+#: guix/scripts/build.scm:226 guix/scripts/package.scm:674
#, scheme-format
msgid "ambiguous package specification `~a'~%"
msgstr "plursenca pak-specifigo '~a'~%"
-#: guix/scripts/build.scm:227 guix/scripts/package.scm:602
+#: guix/scripts/build.scm:227 guix/scripts/package.scm:676
#, scheme-format
msgid "choosing ~a from ~a~%"
msgstr "ni elektas ~a el ~a~%"
@@ -560,42 +548,42 @@ msgstr "~a: analizo de URI fiaskis~%"
msgid "~a: download failed~%"
msgstr "~a: elŝuto fiaskis~%"
-#: guix/scripts/package.scm:225
+#: guix/scripts/package.scm:227
#, scheme-format
msgid "switching from generation ~a to ~a~%"
msgstr "alterno el generacio ~a al ~a~%"
-#: guix/scripts/package.scm:230
+#: guix/scripts/package.scm:232
#, scheme-format
msgid "profile `~a' does not exist~%"
msgstr "profilo '~a' ne ekzistas~%"
-#: guix/scripts/package.scm:234
+#: guix/scripts/package.scm:236
#, scheme-format
msgid "nothing to do: already at the empty profile~%"
msgstr "nenio por fari: jam estas ĉe la malplena profilo~%"
-#: guix/scripts/package.scm:243
+#: guix/scripts/package.scm:242
#, scheme-format
msgid "failed to build the empty profile~%"
msgstr "fiasko dum konstruo de malplena profilo~%"
-#: guix/scripts/package.scm:346
+#: guix/scripts/package.scm:413
#, scheme-format
msgid "looking for the latest release of GNU ~a..."
msgstr "ni serĉas la lastan eldonon de GNU ~a..."
-#: guix/scripts/package.scm:350
+#: guix/scripts/package.scm:417
#, scheme-format
msgid "~a: note: using ~a but ~a is available upstream~%"
msgstr "~a: rimarko: ni uzas ~a sed ~a disponeblas unuanivele~%"
-#: guix/scripts/package.scm:414
+#: guix/scripts/package.scm:481
#, scheme-format
msgid "The following environment variable definitions may be needed:~%"
msgstr "La jenaj medi-variablaj difinoj povos esti necesaj:~%"
-#: guix/scripts/package.scm:429
+#: guix/scripts/package.scm:496
msgid ""
"Usage: guix package [OPTION]... PACKAGES...\n"
"Install, remove, or upgrade PACKAGES in a single transaction.\n"
@@ -603,7 +591,7 @@ msgstr ""
"Uzmaniero: guix package [MODIFILO]... PAKOJ...\n"
"Instalas, forigas, aŭ ĝisdatigas PAKOJn en ununura ago.\n"
-#: guix/scripts/package.scm:431
+#: guix/scripts/package.scm:498
msgid ""
"\n"
" -i, --install=PACKAGE install PACKAGE"
@@ -611,7 +599,7 @@ msgstr ""
"\n"
" -i, --install=PAKO instali PAKOn"
-#: guix/scripts/package.scm:433
+#: guix/scripts/package.scm:500
msgid ""
"\n"
" -e, --install-from-expression=EXP\n"
@@ -621,7 +609,7 @@ msgstr ""
" -e, --install-from-expression=ESP\n"
" instali la pakon ESP rezultas al"
-#: guix/scripts/package.scm:436
+#: guix/scripts/package.scm:503
msgid ""
"\n"
" -r, --remove=PACKAGE remove PACKAGE"
@@ -629,16 +617,15 @@ msgstr ""
"\n"
" -r, --remove=PAKO forigi PAKOn"
-#: guix/scripts/package.scm:438
+#: guix/scripts/package.scm:505
msgid ""
"\n"
" -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP"
msgstr ""
"\n"
-" -u, --upgrade[=REGESP] ĝisdatigi ĉiujn instalitajn pakojn kongruantajn al "
-"REGESP"
+" -u, --upgrade[=REGESP] ĝisdatigi ĉiujn instalitajn pakojn kongruantajn al REGESP"
-#: guix/scripts/package.scm:440
+#: guix/scripts/package.scm:507
msgid ""
"\n"
" --roll-back roll back to the previous generation"
@@ -646,7 +633,7 @@ msgstr ""
"\n"
" --roll-back retropaŝi al la antaŭa generacio"
-#: guix/scripts/package.scm:442
+#: guix/scripts/package.scm:509
msgid ""
"\n"
" --search-paths display needed environment variable definitions"
@@ -654,16 +641,25 @@ msgstr ""
"\n"
" --search-paths montri necesajn medi-variablajn difinojn"
-#: guix/scripts/package.scm:445
+#: guix/scripts/package.scm:511
+msgid ""
+"\n"
+" -l, --list-generations[=PATTERN]\n"
+" list generations matching PATTERN"
+msgstr ""
+"\n"
+" -I, --list-generations[=ŜABLONO]\n"
+" listigi generaciojn kongruantajn al ŜABLONO"
+
+#: guix/scripts/package.scm:515
msgid ""
"\n"
" -p, --profile=PROFILE use PROFILE instead of the user's default profile"
msgstr ""
"\n"
-" -p, --profile=PROFILO uzi PROFILOn anstataŭ la apriora profilo de la "
-"uzanto"
+" -p, --profile=PROFILO uzi PROFILOn anstataŭ la apriora profilo de la uzanto"
-#: guix/scripts/package.scm:447
+#: guix/scripts/package.scm:517
msgid ""
"\n"
" -n, --dry-run show what would be done without actually doing it"
@@ -671,7 +667,7 @@ msgstr ""
"\n"
" -n, --dry-run montri kion estus farita sen fakte fari ĝin"
-#: guix/scripts/package.scm:456
+#: guix/scripts/package.scm:526
msgid ""
"\n"
" --bootstrap use the bootstrap Guile to build the profile"
@@ -679,7 +675,7 @@ msgstr ""
"\n"
" --bootstrap uzi la praŝargilon Guile por konstrui la profilon"
-#: guix/scripts/package.scm:458 guix/scripts/pull.scm:144
+#: guix/scripts/package.scm:528 guix/scripts/pull.scm:147
msgid ""
"\n"
" --verbose produce verbose output"
@@ -687,7 +683,7 @@ msgstr ""
"\n"
" --verbose produkti detalplenan eligon"
-#: guix/scripts/package.scm:461
+#: guix/scripts/package.scm:531
msgid ""
"\n"
" -s, --search=REGEXP search in synopsis and description using REGEXP"
@@ -695,7 +691,7 @@ msgstr ""
"\n"
" -s, --search=REGESP serĉi en resumo kaj priskribo uzante REGESP"
-#: guix/scripts/package.scm:463
+#: guix/scripts/package.scm:533
msgid ""
"\n"
" -I, --list-installed[=REGEXP]\n"
@@ -705,7 +701,7 @@ msgstr ""
" -I, --list-installed[=REGESP]\n"
" listigi instalitajn pakojn kongruantajn al REGESP"
-#: guix/scripts/package.scm:466
+#: guix/scripts/package.scm:536
msgid ""
"\n"
" -A, --list-available[=REGEXP]\n"
@@ -715,76 +711,91 @@ msgstr ""
" -A, --list-available[=REGESP]\n"
" listigi disponeblajn pakojn kongruantajn al REGESP"
-#: guix/scripts/package.scm:556
+#: guix/scripts/package.scm:630
#, scheme-format
msgid "~A: extraneous argument~%"
msgstr "~A: fremda argumento~%"
-#: guix/scripts/package.scm:584
+#: guix/scripts/package.scm:658
#, scheme-format
msgid "package `~a' lacks output `~a'~%"
msgstr "pako '~a' malhavas eligon '~a'~%"
-#: guix/scripts/package.scm:608
+#: guix/scripts/package.scm:682
#, scheme-format
msgid "~a: package not found~%"
msgstr "~a: pako ne trovita~%"
-#: guix/scripts/package.scm:631
+#: guix/scripts/package.scm:705
#, scheme-format
msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%"
msgstr "Provu \"info '(guix) Invoking guix package'\" por pli da informo.'%"
-#: guix/scripts/package.scm:653
+#: guix/scripts/package.scm:727
#, scheme-format
msgid "error: while creating directory `~a': ~a~%"
msgstr "eraro: dum kreo de dosierujo '~a': ~a~%"
-#: guix/scripts/package.scm:657
+#: guix/scripts/package.scm:731
#, scheme-format
msgid "Please create the `~a' directory, with you as the owner.~%"
msgstr "Bonvolu krei la dosierujon '~a', kun vi kiel posedanto.~%"
-#: guix/scripts/package.scm:664
+#: guix/scripts/package.scm:738
#, scheme-format
msgid "error: directory `~a' is not owned by you~%"
msgstr "eraro: dosierujo '~a' ne estas posedata de vi~%"
-#: guix/scripts/package.scm:667
+#: guix/scripts/package.scm:741
#, scheme-format
msgid "Please change the owner of `~a' to user ~s.~%"
msgstr "Bonvole ŝanĝu la posedanton de '~a' al la uzanto ~s.~%"
-#: guix/scripts/package.scm:725
+#: guix/scripts/package.scm:799
#, scheme-format
msgid "The following package would be removed:~% ~{~a~%~}~%"
msgstr "La jena pako devos esti forigata:~% ~{~a~%~}~%"
-#: guix/scripts/package.scm:730
+#: guix/scripts/package.scm:804
#, scheme-format
msgid "The following package will be removed:~% ~{~a~%~}~%"
msgstr "La jena pako estos forigata:~% ~{~a~%~}~%"
-#: guix/scripts/package.scm:742
+#: guix/scripts/package.scm:816
#, scheme-format
msgid "The following package would be installed:~%~{~a~%~}~%"
msgstr "La jena pako estus instalata:~% ~{~a~%~}~%"
-#: guix/scripts/package.scm:747
+#: guix/scripts/package.scm:821
#, scheme-format
msgid "The following package will be installed:~%~{~a~%~}~%"
msgstr "La jena pako estos instalata:~% ~{~a~%~}~%"
-#: guix/scripts/package.scm:859
+#: guix/scripts/package.scm:933
#, scheme-format
msgid "nothing to be done~%"
msgstr "nenio por fari~%"
-#: guix/scripts/package.scm:870
+#: guix/scripts/package.scm:944
#, scheme-format
msgid "~a package in profile~%"
msgstr "pako ~a en profilo~%"
+#: guix/scripts/package.scm:959
+#, scheme-format
+msgid "Generation ~a\t~a~%"
+msgstr "Generacio ~a\t~a~%"
+
+#: guix/scripts/package.scm:977
+#, scheme-format
+msgid "profile '~a' does not exist~%"
+msgstr "profilo '~a' ne ekzistas~%"
+
+#: guix/scripts/package.scm:986
+#, scheme-format
+msgid "invalid syntax: ~a~%"
+msgstr "malvalida sintakso: ~a~%"
+
#: guix/scripts/gc.scm:39
msgid ""
"Usage: guix gc [OPTION]... PATHS...\n"
@@ -885,7 +896,7 @@ msgstr ""
msgid "unrecognized option: ~a~%"
msgstr "nerekonata modifilo: ~a~%"
-#: guix/scripts/hash.scm:123 guix/ui.scm:183
+#: guix/scripts/hash.scm:123 guix/ui.scm:187
#, scheme-format
msgid "~a~%"
msgstr "~a~%"
@@ -895,7 +906,7 @@ msgstr "~a~%"
msgid "wrong number of arguments~%"
msgstr "malĝusta nombro da argumentoj~%"
-#: guix/scripts/pull.scm:142
+#: guix/scripts/pull.scm:145
msgid ""
"Usage: guix pull [OPTION]...\n"
"Download and deploy the latest version of Guix.\n"
@@ -903,7 +914,7 @@ msgstr ""
"Uzmaniero: guix pull [MODIFILO]...\n"
"Elŝuti kaj liveri la lastan version de Guix.\n"
-#: guix/scripts/pull.scm:146
+#: guix/scripts/pull.scm:149
msgid ""
"\n"
" --bootstrap use the bootstrap Guile to build the new Guix"
@@ -911,44 +922,89 @@ msgstr ""
"\n"
" --bootstrap uzi la 'bootstrap' Guile por konstrui novan Guix"
-#: guix/scripts/pull.scm:180
+#: guix/scripts/pull.scm:183
#, scheme-format
msgid "~A: unexpected argument~%"
msgstr "~A: neatendita argumento~%"
-#: guix/scripts/pull.scm:189
+#: guix/scripts/pull.scm:192
msgid "failed to download up-to-date source, exiting\n"
msgstr "fiasko dum elŝuto de aktuala fonto, ni ĉesas\n"
-#: guix/scripts/pull.scm:212
+#: guix/scripts/pull.scm:211
#, scheme-format
msgid "updated ~a successfully deployed under `~a'~%"
msgstr "ni ĝisdatigis ~a sukcese, liverita sur '~a'~%"
-#: guix/scripts/pull.scm:215
+#: guix/scripts/pull.scm:214
#, scheme-format
msgid "failed to update Guix, check the build log~%"
msgstr "fiasko dum ĝisdatigo de Guix, kontrolu la konstru-protokolon~%"
-#: guix/scripts/pull.scm:217
+#: guix/scripts/pull.scm:216
msgid "Guix already up to date\n"
msgstr "Guix jam estas ĝisdata\n"
-#: guix/scripts/substitute-binary.scm:163
+#: guix/scripts/substitute-binary.scm:162
#, scheme-format
msgid "while fetching ~a: server is unresponsive~%"
msgstr "dum havigo de ~a: servilo ne respondas~%"
-#: guix/scripts/substitute-binary.scm:165
+#: guix/scripts/substitute-binary.scm:164
#, scheme-format
msgid "try `--no-substitutes' if the problem persists~%"
msgstr "provu '--no-substituse' se la problemo persistos~%"
-#: guix/scripts/substitute-binary.scm:437
+#: guix/scripts/substitute-binary.scm:425
+#, scheme-format
+msgid "Downloading, please wait...~%"
+msgstr "Ni elŝutas, bonvolu atendi...~%"
+
+#: guix/scripts/substitute-binary.scm:427
+#, scheme-format
+msgid "(Please consider upgrading Guile to get proper progress report.)~%"
+msgstr "(Bonvolu konsideri pri ĝisdatigo de Guile por havigi ĝustan progres-raporton.)~%"
+
+#: guix/scripts/substitute-binary.scm:444
#, scheme-format
msgid "host name lookup error: ~a~%"
msgstr "eraro en serĉado de gastigant-nomo: ~a~%"
+#: guix/scripts/substitute-binary.scm:453
+msgid ""
+"Usage: guix substitute-binary [OPTION]...\n"
+"Internal tool to substitute a pre-built binary to a local build.\n"
+msgstr ""
+"Uzmaniero: guix substitute-binary [MODIFILO]...\n"
+"Interna ilo por anstataŭigi antaŭ-konstruitan duumaĵon al loka kompilaĵo.\n"
+
+#: guix/scripts/substitute-binary.scm:455
+msgid ""
+"\n"
+" --query report on the availability of substitutes for the\n"
+" store file names passed on the standard input"
+msgstr ""
+"\n"
+" --query raporti pri la disponebleco de anstataŭigoj por la\n"
+" konservaj dosier-nomoj indikitaj per la ĉefenigujo"
+
+#: guix/scripts/substitute-binary.scm:458
+msgid ""
+"\n"
+" --substitute STORE-FILE DESTINATION\n"
+" download STORE-FILE and store it as a Nar in file\n"
+" DESTINATION"
+msgstr ""
+"\n"
+" --substitute KONSERV-DOSIERO CELO\n"
+" elŝuti KONSERV-DOSIEROn kaj konservi ĝin kiel Nar en la\n"
+" dosiero CELO"
+
+#: guix/scripts/substitute-binary.scm:567
+#, scheme-format
+msgid "~a: unrecognized options~%"
+msgstr "~a: nerekonata modifiloj~%"
+
#: guix/gnu-maintenance.scm:344
#, scheme-format
msgid "signature verification failed for `~a'~%"
@@ -969,12 +1025,12 @@ msgstr "~a: ne eblis trovi fontan dosieron"
msgid "~a: ~a: no `version' field in source; skipping~%"
msgstr "~a: ~a: neniu kampo 'version' en la fonto; ni saltas~%"
-#: guix/ui.scm:116
+#: guix/ui.scm:120
#, scheme-format
msgid "failed to install locale: ~a~%"
msgstr "fiasko dum instalo de lokaĵaro: ~a~%"
-#: guix/ui.scm:138
+#: guix/ui.scm:142
#, scheme-format
msgid ""
"\n"
@@ -983,7 +1039,7 @@ msgstr ""
"\n"
"Raportu program-misojn al: ~a."
-#: guix/ui.scm:140
+#: guix/ui.scm:144
#, scheme-format
msgid ""
"\n"
@@ -992,7 +1048,7 @@ msgstr ""
"\n"
"hejm-paĝo de ~a: <~a>"
-#: guix/ui.scm:142
+#: guix/ui.scm:146
msgid ""
"\n"
"General help using GNU software: <http://www.gnu.org/gethelp/>"
@@ -1000,90 +1056,90 @@ msgstr ""
"\n"
"Ĝenerala helpo por uzi programaron de GNU: <http://www.gnu.org/gethelp/>"
-#: guix/ui.scm:149
+#: guix/ui.scm:153
#, scheme-format
msgid "~a: invalid number~%"
msgstr "~a: nevalida numero~%"
-#: guix/ui.scm:160
+#: guix/ui.scm:164
#, scheme-format
msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%"
msgstr "~a:~a:~a: pako '~a' havas malvalidan enigon: ~s~%"
-#: guix/ui.scm:167
+#: guix/ui.scm:171
#, scheme-format
msgid "~a: ~a: build system `~a' does not support cross builds~%"
msgstr "~a: ~a: konstrui sistemon '~a' ne subtenas crucajn konstruojn~%"
-#: guix/ui.scm:172
+#: guix/ui.scm:176
#, scheme-format
msgid "failed to connect to `~a': ~a~%"
msgstr "fiasko dum konekto al '~a': ~a~%"
-#: guix/ui.scm:177
+#: guix/ui.scm:181
#, scheme-format
msgid "build failed: ~a~%"
msgstr "konstruo fiakis: ~a~%"
-#: guix/ui.scm:193
+#: guix/ui.scm:197
#, scheme-format
msgid "failed to read expression ~s: ~s~%"
msgstr "fiasko dum lego de esprimo ~s: ~s~%"
-#: guix/ui.scm:199
+#: guix/ui.scm:203
#, scheme-format
msgid "failed to evaluate expression `~a': ~s~%"
msgstr "fiasko dum analizo de esprimo '~a': ~a~%"
-#: guix/ui.scm:203
+#: guix/ui.scm:207
#, scheme-format
msgid "expression `~s' does not evaluate to a package~%"
msgstr "la esprimo '~s' ne rezultas pakon~%"
-#: guix/ui.scm:248
+#: guix/ui.scm:253
#, scheme-format
msgid "~:[The following derivation would be built:~%~{ ~a~%~}~;~]"
msgstr "~:[La jena derivo povus esti konstruata:~%~{ ~a~%~}~;~]"
-#: guix/ui.scm:253
+#: guix/ui.scm:258
#, scheme-format
msgid "~:[The following file would be downloaded:~%~{ ~a~%~}~;~]"
msgstr "~:[La jena derivo povus esti elŝutata:~%~{ ~a~%~}~;~]"
-#: guix/ui.scm:259
+#: guix/ui.scm:264
#, scheme-format
msgid "~:[The following derivation will be built:~%~{ ~a~%~}~;~]"
msgstr "~:[La jena derivo estos esti konstruata:~%~{ ~a~%~}~;~]"
-#: guix/ui.scm:264
+#: guix/ui.scm:269
#, scheme-format
msgid "~:[The following file will be downloaded:~%~{ ~a~%~}~;~]"
msgstr "~:[La jena derivo estos esti elŝutata:~%~{ ~a~%~}~;~]"
-#: guix/ui.scm:281
+#: guix/ui.scm:286
msgid "<unknown location>"
msgstr "<nekonata loko>"
-#: guix/ui.scm:309
+#: guix/ui.scm:314
#, scheme-format
msgid "failed to create configuration directory `~a': ~a~%"
msgstr "fiasko dum kreo de agorda dosierujo '~a': ~a~%"
-#: guix/ui.scm:385 guix/ui.scm:395
+#: guix/ui.scm:390 guix/ui.scm:400
msgid "unknown"
msgstr "nekonata"
-#: guix/ui.scm:415
+#: guix/ui.scm:484
#, scheme-format
msgid "invalid argument: ~a~%"
msgstr "malvalida argumento: ~a~%"
-#: guix/ui.scm:420
+#: guix/ui.scm:489
#, scheme-format
msgid "Try `guix --help' for more information.~%"
msgstr "Provu 'guix --help' por pli da informo.~%"
-#: guix/ui.scm:447
+#: guix/ui.scm:516
msgid ""
"Usage: guix COMMAND ARGS...\n"
"Run COMMAND with ARGS.\n"
@@ -1091,21 +1147,21 @@ msgstr ""
"Uzmaniero: guix KOMANDO ARGj...\n"
"Lanĉas KOMANDOn kun ARGj.\n"
-#: guix/ui.scm:450
+#: guix/ui.scm:519
msgid "COMMAND must be one of the sub-commands listed below:\n"
msgstr "KOMANDO devas esti unu el la sub-komandoj sube listataj:\n"
-#: guix/ui.scm:469
+#: guix/ui.scm:538
#, scheme-format
msgid "guix: ~a: command not found~%"
msgstr "guix: ~a: komando ne trovita~%"
-#: guix/ui.scm:487
+#: guix/ui.scm:556
#, scheme-format
msgid "guix: missing command name~%"
msgstr "guix: mankas komanda nomo~%"
-#: guix/ui.scm:495
+#: guix/ui.scm:564
#, scheme-format
msgid "guix: unrecognized option '~a'~%"
msgstr "guix: nerekonata modifilo: '~a'~%"
diff --git a/tests/guix-package.sh b/tests/guix-package.sh
index b09a9c0173..5f97aff026 100644
--- a/tests/guix-package.sh
+++ b/tests/guix-package.sh
@@ -79,12 +79,16 @@ then
# Search.
test "`guix package -s "An example GNU package" | grep ^name:`" = \
"name: hello"
- test "`guix package -s "n0t4r341p4ck4g3"`" = ""
+ test -z "`guix package -s "n0t4r341p4ck4g3"`"
# List generations.
test "`guix package -p "$profile" -l | cut -f1 | grep guile | head -n1`" \
= " guile-bootstrap"
+ # Exit with 1 when a generation does not exist.
+ if guix package -p "$profile" --list-generations=42;
+ then false; else true; fi
+
# Remove a package.
guix package --bootstrap -p "$profile" -r "guile-bootstrap"
test -L "$profile-3-link"
@@ -107,11 +111,17 @@ then
test "`readlink_base "$profile"`" = "$profile-0-link"
done
+ # Test that '--list-generations' does not output the zeroth generation.
+ test -z "`guix package -p "$profile" -l 0`"
+
# Reinstall after roll-back to the empty profile.
guix package --bootstrap -p "$profile" -e "$boot_make"
test "`readlink_base "$profile"`" = "$profile-1-link"
test -x "$profile/bin/guile" && ! test -x "$profile/bin/make"
+ # Check that the first generation is the current one.
+ test "`guix package -p "$profile" -l 1 | cut -f3 | head -n1`" = "(current)"
+
# Roll-back to generation 0, and install---all at once.
guix package --bootstrap -p "$profile" --roll-back -i guile-bootstrap
test "`readlink_base "$profile"`" = "$profile-1-link"
diff --git a/tests/guix-register.sh b/tests/guix-register.sh
index b76a1af54f..ca28fb0d95 100644
--- a/tests/guix-register.sh
+++ b/tests/guix-register.sh
@@ -38,9 +38,10 @@ cp -r "$to_copy" "$new_store_dir"
copied="$new_store_dir/`basename $to_copy`"
# Create a file representing a closure with zero references, and with an empty
-# "deriver" field.
+# "deriver" field. Note that we give the file name as it appears in the
+# original store, and 'guix-register' translates it to match the prefix.
cat >> "$closure" <<EOF
-$copied
+$to_copy
0
EOF
@@ -49,26 +50,37 @@ EOF
guix-register -p "$new_store" < "$closure"
# Doing it a second time shouldn't hurt.
-guix-register -p "$new_store" "$closure"
+guix-register --prefix "$new_store" "$closure"
# Now make sure this is recognized as valid.
NIX_IGNORE_SYMLINK_STORE=1
NIX_STORE_DIR="$new_store_dir"
-NIX_LOCALSTATE_DIR="$new_store$localstatedir"
+NIX_STATE_DIR="$new_store$localstatedir"
NIX_LOG_DIR="$new_store$localstatedir/log/nix"
NIX_DB_DIR="$new_store$localstatedir/nix/db"
-export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR NIX_LOCALSTATE_DIR \
+export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR NIX_STATE_DIR \
NIX_LOG_DIR NIX_DB_DIR
guix-daemon --disable-chroot &
subdaemon_pid=$!
exit_hook="kill $subdaemon_pid"
+final_name="$storedir/`basename $to_copy`"
+
# At this point the copy in $new_store must be valid, and unreferenced.
+# The database under $new_store uses the $final_name, but we can't use
+# that name in a 'valid-path?' query because 'assertStorePath' would kill
+# us because of the wrong prefix. So we just list dead paths instead.
guile -c "
(use-modules (guix store))
(define s (open-connection))
- (exit (and (valid-path? s \"$copied\")
- (equal? (list \"$copied\") (dead-paths s))))"
+ (exit (equal? (list \"$copied\") (dead-paths s)))"
+
+# When 'sqlite3' is available, check the name in the database.
+if type -P sqlite3
+then
+ echo "select * from ValidPaths where path=\"$final_name\";" | \
+ sqlite3 $NIX_DB_DIR/db.sqlite
+fi