unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Move /gnu/store to another filesystem
@ 2022-05-25 16:56 Théo Maxime Tyburn
  2022-05-26 10:28 ` Giovanni Biscuolo
  0 siblings, 1 reply; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-25 16:56 UTC (permalink / raw)
  To: guix-devel

Hello,

I am running out of space on my 128GB SDD. It seems to be too small for
holding 2 months of store with regular updates. So I want to "transfer"
it to an interal HDD which is much larger and has a btrfs on it.

This is what I tried so far. I created a btrfs subvolume on my HDD and
called it gnu-store. I then booted from a usb-stick, and copied
/gnu/store/* directly into the subvolume. As a final preparation I moved
/gnu/store to /gnu/store-backup and created an empty /gnu/store folder. I finally
booted from a system which basically mounts gnu-store on /gnu/store (see
the definition below). Note that I ran "guix system reconfigure ..." before
doing the copy, so the stores are identical. It boots but
complains that there is "no such language scheme".

Maybe this portion of the system definition will make it clearer:

--8<---------------cut here---------------start------------->8---
(define %boot-fs
  (file-system (device (file-system-label "boot-fs"))
	       (mount-point "/boot")
	       (type "ext2")))

(define %root-fs
  (file-system (device (file-system-label "root-fs"))
	       (mount-point "/")
	       (type "ext3")))

(define %store-fs ;; <--- This is what I want to add.
  (file-system (device (file-system-label "storage-fs"))
	       (mount-point mt-point)
	       (type "/gnu/store")
	       (options (string-append "subvol=" "gnu-store"))
	       (needed-for-boot? #t)
	       (dependencies %root-fs)))

(operating-system
 [...]   
 (file-systems (append
		(list %boot-fs %root-fs %store-fs)
                %base-file-systems))
 [...])
--8<---------------cut here---------------end--------------->8---

What am I doing wrong here? I though with this config root would be mounted first then the store
will be mounted on it. But this error seems to tell that something is
missing.

Anyway this is probably not the right way to do it. Simply coping
/gnu/store around looks a bit brutal. 

I’d appreciate any kind of help :)

Théo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-25 16:56 Move /gnu/store to another filesystem Théo Maxime Tyburn
@ 2022-05-26 10:28 ` Giovanni Biscuolo
  2022-05-26 10:44   ` Théo Maxime Tyburn
  0 siblings, 1 reply; 16+ messages in thread
From: Giovanni Biscuolo @ 2022-05-26 10:28 UTC (permalink / raw)
  To: Théo Maxime Tyburn, guix-devel

[-- Attachment #1: Type: text/plain, Size: 975 bytes --]

Hello Théo 

Théo Maxime Tyburn <theo.tyburn@gmail.com> writes:

[...]

> (define %store-fs ;; <--- This is what I want to add.
>   (file-system (device (file-system-label "storage-fs"))
> 	       (mount-point mt-point)
> 	       (type "/gnu/store")

maybe you misconfigured "mount-point" and "type"?

what about:

--8<---------------cut here---------------start------------->8---

 (define %store-fs ;; <--- This is what I want to add.
   (file-system (device (file-system-label "storage-fs"))
 	       (mount-point "/gnu/store")
 	       (type "btrfs")

--8<---------------cut here---------------end--------------->8---

WDYT?

[...]

> Anyway this is probably not the right way to do it. Simply coping
> /gnu/store around looks a bit brutal.

AFAIK we can move /gnu/store anywhere **if** the system is not live,
like you did booting in "rescue mode"

[...]

Happy hacking! Gio'

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 849 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-26 10:28 ` Giovanni Biscuolo
@ 2022-05-26 10:44   ` Théo Maxime Tyburn
  2022-05-26 16:24     ` Kaelyn
  0 siblings, 1 reply; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-26 10:44 UTC (permalink / raw)
  To: Giovanni Biscuolo; +Cc: guix-devel


Hi Gio,

Giovanni Biscuolo <g@xelera.eu> writes:

[...]

> maybe you misconfigured "mount-point" and "type"?
>
> what about:
>
> --8<---------------cut here---------------start------------->8---
>
>  (define %store-fs ;; <--- This is what I want to add.
>    (file-system (device (file-system-label "storage-fs"))
>  	       (mount-point "/gnu/store")
>  	       (type "btrfs")
>
> --8<---------------cut here---------------end--------------->8---
>
> WDYT?

Oh yes sorry, I did a mistake while copy-pasting. What you suggested
is actually what I am using.

>> Anyway this is probably not the right way to do it. Simply coping
>> /gnu/store around looks a bit brutal.
>
> AFAIK we can move /gnu/store anywhere **if** the system is not live,
> like you did booting in "rescue mode"

Well then I don’t see what could have gone wrong. I’ll try it agin.

> Happy hacking! Gio'

Tks!


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-26 10:44   ` Théo Maxime Tyburn
@ 2022-05-26 16:24     ` Kaelyn
  2022-05-26 19:48       ` Théo Maxime Tyburn
  0 siblings, 1 reply; 16+ messages in thread
From: Kaelyn @ 2022-05-26 16:24 UTC (permalink / raw)
  To: Théo Maxime Tyburn; +Cc: Giovanni Biscuolo, guix-devel

Hi Théo,

n Thursday, May 26th, 2022 at 3:44 AM, Théo Maxime Tyburn <theo.tyburn@gmail.com> wrote:


> Hi Gio,
>
> Giovanni Biscuolo g@xelera.eu writes:
>
>
> [...]
>
> > maybe you misconfigured "mount-point" and "type"?
> >
> > what about:
> >
> > --8<---------------cut here---------------start------------->8---
> >
> > (define %store-fs ;; <--- This is what I want to add.
> > (file-system (device (file-system-label "storage-fs"))
> > (mount-point "/gnu/store")
> > (type "btrfs")
> >
> > --8<---------------cut here---------------end--------------->8---
> >
> > WDYT?
>
>
> Oh yes sorry, I did a mistake while copy-pasting. What you suggested
> is actually what I am using.

If you have the new /gnu/store as a btrfs subvolume, you may need to tell `mount` which subvolume to mount there. I haven't tried moving /gnu/store, but my systems have / and /gnu/store as separate btrfs subvolumes in the same LUKS-encrypted partition. Here is the `file-systems` stanza of one of my system's operating-system declaration, in case it is helpful:

  (file-systems
    (let ((rootfs (file-system
             (mount-point "/")
             (device "/dev/mapper/cryptroot1")
             (type "btrfs")
             (check? #f)
             (options "compress=zstd,subvol=@guix")
             (dependencies mapped-devices))))
    (cons* rootfs
           (file-system
             (mount-point "/boot/efi")
             (device (file-system-label "EFI"))
             (type "vfat")
             (mount-may-fail? #t)
             (dependencies mapped-devices))
           (file-system
             (mount-point "/gnu")
             (device "/dev/mapper/cryptroot1")
             (type "btrfs")
             (check? #f)
             (options "compress=zstd,subvol=@gnu_store")
             (dependencies (cons rootfs mapped-devices)))
           %base-file-systems)))

Cheers,
Kaelyn

>
> > > Anyway this is probably not the right way to do it. Simply coping
> > > /gnu/store around looks a bit brutal.
> >
> > AFAIK we can move /gnu/store anywhere if the system is not live,
> > like you did booting in "rescue mode"
>
>
> Well then I don’t see what could have gone wrong. I’ll try it agin.
>
> > Happy hacking! Gio'
>
>
> Tks!


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-26 16:24     ` Kaelyn
@ 2022-05-26 19:48       ` Théo Maxime Tyburn
  2022-05-27  5:56         ` Giovanni Biscuolo
  2022-05-27 11:28         ` Tobias Geerinckx-Rice
  0 siblings, 2 replies; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-26 19:48 UTC (permalink / raw)
  To: Kaelyn; +Cc: Giovanni Biscuolo, guix-devel


Hello Gio and Kaelyn,

I figured out where the problem came from. I forgot to use the -p option
while copying the store with cp. Because of this some scheme files where
newer than their compiled counterpart, which forced to compile them anew.

Just did everything again with cp -p and it worked like a charm.

Thanks for the support!

Théo

Kaelyn <kaelyn.alexi@protonmail.com> writes:

> Hi Théo,
>
> n Thursday, May 26th, 2022 at 3:44 AM, Théo Maxime Tyburn <theo.tyburn@gmail.com> wrote:
>
>
>> Hi Gio,
>>
>> Giovanni Biscuolo g@xelera.eu writes:
>>
>>
>> [...]
>>
>> > maybe you misconfigured "mount-point" and "type"?
>> >
>> > what about:
>> >
>> > --8<---------------cut here---------------start------------->8---
>> >
>> > (define %store-fs ;; <--- This is what I want to add.
>> > (file-system (device (file-system-label "storage-fs"))
>> > (mount-point "/gnu/store")
>> > (type "btrfs")
>> >
>> > --8<---------------cut here---------------end--------------->8---
>> >
>> > WDYT?
>>
>>
>> Oh yes sorry, I did a mistake while copy-pasting. What you suggested
>> is actually what I am using.
>
> If you have the new /gnu/store as a btrfs subvolume, you may need to tell `mount` which subvolume to mount there. I haven't tried moving /gnu/store, but my systems have / and /gnu/store as separate btrfs subvolumes in the same LUKS-encrypted partition. Here is the `file-systems` stanza of one of my system's operating-system declaration, in case it is helpful:
>
>   (file-systems
>     (let ((rootfs (file-system
>              (mount-point "/")
>              (device "/dev/mapper/cryptroot1")
>              (type "btrfs")
>              (check? #f)
>              (options "compress=zstd,subvol=@guix")
>              (dependencies mapped-devices))))
>     (cons* rootfs
>            (file-system
>              (mount-point "/boot/efi")
>              (device (file-system-label "EFI"))
>              (type "vfat")
>              (mount-may-fail? #t)
>              (dependencies mapped-devices))
>            (file-system
>              (mount-point "/gnu")
>              (device "/dev/mapper/cryptroot1")
>              (type "btrfs")
>              (check? #f)
>              (options "compress=zstd,subvol=@gnu_store")
>              (dependencies (cons rootfs mapped-devices)))
>            %base-file-systems)))
>
> Cheers,
> Kaelyn
>
>>
>> > > Anyway this is probably not the right way to do it. Simply coping
>> > > /gnu/store around looks a bit brutal.
>> >
>> > AFAIK we can move /gnu/store anywhere if the system is not live,
>> > like you did booting in "rescue mode"
>>
>>
>> Well then I don’t see what could have gone wrong. I’ll try it agin.
>>
>> > Happy hacking! Gio'
>>
>>
>> Tks!



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-26 19:48       ` Théo Maxime Tyburn
@ 2022-05-27  5:56         ` Giovanni Biscuolo
  2022-05-27  9:34           ` Théo Maxime Tyburn
  2022-05-27 11:08           ` Théo Maxime Tyburn
  2022-05-27 11:28         ` Tobias Geerinckx-Rice
  1 sibling, 2 replies; 16+ messages in thread
From: Giovanni Biscuolo @ 2022-05-27  5:56 UTC (permalink / raw)
  To: Théo Maxime Tyburn; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 827 bytes --]

Hello Théo

Théo Maxime Tyburn <theo.tyburn@gmail.com> writes:

> I figured out where the problem came from. I forgot to use the -p option
> while copying the store with cp. Because of this some scheme files where
> newer than their compiled counterpart, which forced to compile them anew.
>
> Just did everything again with cp -p and it worked like a charm.

Great!  IMHO it'd be useful for other users to have a "Move store to
another device" section in our cookbook: would you like to try to add a
patch to it and see if maintainers accept it?  I can help if needed.

[...]

>> If you have the new /gnu/store as a btrfs subvolume, you may need to
>> tell `mount` which subvolume to mount there.

good point Kaelyn!

[...]

Happy Hacking! Gio'

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 849 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27  5:56         ` Giovanni Biscuolo
@ 2022-05-27  9:34           ` Théo Maxime Tyburn
  2022-05-27 11:08           ` Théo Maxime Tyburn
  1 sibling, 0 replies; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27  9:34 UTC (permalink / raw)
  To: Giovanni Biscuolo; +Cc: guix-devel

Hi Gio’

Giovanni Biscuolo <g@xelera.eu> writes:

> Great!  IMHO it'd be useful for other users to have a "Move store to
> another device" section in our cookbook: would you like to try to add a
> patch to it and see if maintainers accept it?  I can help if needed.

Yes good idea. I’ll try to setup my guix git repo. I’ll let you know if
I have troubles.

> Happy Hacking! Gio'
 
Cheers, Théo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27  5:56         ` Giovanni Biscuolo
  2022-05-27  9:34           ` Théo Maxime Tyburn
@ 2022-05-27 11:08           ` Théo Maxime Tyburn
  2022-05-27 12:48             ` Giovanni Biscuolo
  1 sibling, 1 reply; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27 11:08 UTC (permalink / raw)
  To: Giovanni Biscuolo; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 236 bytes --]

Hi again,

I ran into 2 errors when running the tests after running make in
the repo. One error has to do with crate. I guess there is a dependency
missing. The other error has to do with channels. Not sure why. 

Here are my test logs 

[-- Attachment #2: test logs --]
[-- Type: text/plain, Size: 143666 bytes --]

==================================================
   GNU Guix 1.3.0.19080-38bf6: ./test-suite.log
==================================================

# TOTAL: 2207
# PASS:  2186
# SKIP:  18
# XFAIL: 1
# FAIL:  2
# XPASS: 0
# ERROR: 0

.. contents:: :depth: 2

FAIL: tests/channels
====================

test-name: channel-instance-metadata returns default if .guix-channel does not exist
location: /data/src/guix/tests/channels.scm:117
source:
+ (test-equal
+   "channel-instance-metadata returns default if .guix-channel does not exist"
+   '("/" ())
+   (let ((metadata
+           (channel-instance-metadata instance--boring)))
+     (list (channel-metadata-directory metadata)
+           (channel-metadata-dependencies metadata))))
expected-value: ("/" ())
actual-value: ("/" ())
result: PASS

test-name: channel-instance-metadata and default dependencies
location: /data/src/guix/tests/channels.scm:123
source:
+ (test-equal
+   "channel-instance-metadata and default dependencies"
+   '()
+   (channel-metadata-dependencies
+     (channel-instance-metadata instance--no-deps)))
expected-value: ()
actual-value: ()
result: PASS

test-name: channel-instance-metadata and directory
location: /data/src/guix/tests/channels.scm:127
source:
+ (test-equal
+   "channel-instance-metadata and directory"
+   "/modules"
+   (channel-metadata-directory
+     (channel-instance-metadata
+       instance--sub-directory)))
expected-value: "/modules"
actual-value: "/modules"
result: PASS

test-name: channel-instance-metadata rejects unsupported version
location: /data/src/guix/tests/channels.scm:132
source:
+ (test-equal
+   "channel-instance-metadata rejects unsupported version"
+   1
+   (guard (c ((and (message-condition? c) (error-location? c))
+              (location-line (error-location c))))
+          (channel-instance-metadata
+            instance--unsupported-version)))
expected-value: 1
actual-value: 1
result: PASS

test-name: channel-instance-metadata returns <channel-metadata>
location: /data/src/guix/tests/channels.scm:138
source:
+ (test-assert
+   "channel-instance-metadata returns <channel-metadata>"
+   (every (@@ (guix channels) channel-metadata?)
+          (map channel-instance-metadata
+               (list instance--no-deps
+                     instance--simple
+                     instance--with-dupes))))
actual-value: #t
result: PASS

test-name: channel-instance-metadata dependencies are channels
location: /data/src/guix/tests/channels.scm:145
source:
+ (test-assert
+   "channel-instance-metadata dependencies are channels"
+   (let ((deps ((@@ (guix channels)
+                    channel-metadata-dependencies)
+                (channel-instance-metadata instance--simple))))
+     (match deps (((? channel? dep)) #t) (_ #f))))
actual-value: #t
result: PASS

test-name: latest-channel-instances includes channel dependencies
location: /data/src/guix/tests/channels.scm:152
source:
+ (test-assert
+   "latest-channel-instances includes channel dependencies"
+   (let* ((channel (channel (name 'test) (url "test")))
+          (test-dir
+            (channel-instance-checkout instance--simple)))
+     (mock ((guix git)
+            update-cached-checkout
+            (lambda* (url #:key ref starting-commit)
+              (match url
+                     ("test" (values test-dir "caf3cabba9e" #f))
+                     (_ (values
+                          (channel-instance-checkout instance--no-deps)
+                          "abcde1234"
+                          #f)))))
+           (with-store
+             store
+             (let ((instances
+                     (latest-channel-instances store (list channel))))
+               (and (eq? 2 (length instances))
+                    (lset= eq?
+                           '(test test-channel)
+                           (map (compose
+                                  channel-name
+                                  channel-instance-channel)
+                                instances))))))))
actual-value: #t
result: PASS

test-name: latest-channel-instances excludes duplicate channel dependencies
location: /data/src/guix/tests/channels.scm:171
source:
+ (test-assert
+   "latest-channel-instances excludes duplicate channel dependencies"
+   (let* ((channel (channel (name 'test) (url "test")))
+          (test-dir
+            (channel-instance-checkout instance--with-dupes)))
+     (mock ((guix git)
+            update-cached-checkout
+            (lambda* (url #:key ref starting-commit)
+              (match url
+                     ("test" (values test-dir "caf3cabba9e" #f))
+                     (_ (values
+                          (channel-instance-checkout instance--no-deps)
+                          "abcde1234"
+                          #f)))))
+           (with-store
+             store
+             (let ((instances
+                     (latest-channel-instances store (list channel))))
+               (and (= 2 (length instances))
+                    (lset= eq?
+                           '(test test-channel)
+                           (map (compose
+                                  channel-name
+                                  channel-instance-channel)
+                                instances))
+                    (find (lambda (instance)
+                            (and (eq? (channel-name
+                                        (channel-instance-channel instance))
+                                      'test-channel)
+                                 (string=?
+                                   (channel-commit
+                                     (channel-instance-channel instance))
+                                   "abc1234")))
+                          instances)))))))
actual-value: #<<channel-instance> channel: #<<channel> name: test-channel url: "https://example.com/test-channel" branch: "master" commit: "abc1234" introduction: #f location: ((filename . "guix/channels.scm") (line . 262) (column . 19))> commit: "abcde1234" checkout: "/data/src/guix/test-tmp/store/nwds585cl9sivbcxz12b5lb7611a9zsc-test-channel-abcde12">
result: PASS

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.xhmL8p/.git/
[master (root-commit) 21c0010] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
[master 2d50a03] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 b.scm
test-name: latest-channel-instances #:validate-pull
location: /data/src/guix/tests/channels.scm:201
source:
+ (test-equal
+   "latest-channel-instances #:validate-pull"
+   'descendant
+   (let/ec
+     return
+     (with-temporary-git-repository
+       directory
+       '((add "a.txt" "A")
+         (commit "first commit")
+         (add "b.scm" "#t")
+         (commit "second commit"))
+       (with-repository
+         directory
+         repository
+         (let* ((commit1 (find-commit repository "first"))
+                (commit2 (find-commit repository "second"))
+                (spec (channel
+                        (url (string-append "file://" directory))
+                        (name 'foo)))
+                (new (channel
+                       (inherit spec)
+                       (commit (oid->string (commit-id commit2)))))
+                (old (channel
+                       (inherit spec)
+                       (commit (oid->string (commit-id commit1))))))
+           (define (validate-pull channel current commit relation)
+             (return
+               (and (eq? channel old)
+                    (string=?
+                      (oid->string (commit-id commit2))
+                      current)
+                    (string=?
+                      (oid->string (commit-id commit1))
+                      commit)
+                    relation)))
+           (with-store
+             store
+             (latest-channel-instances
+               store
+               (list old)
+               #:current-channels
+               (list new)
+               #:validate-pull
+               validate-pull)))))))
expected-value: descendant
actual-value: descendant
result: PASS

test-name: channel-instances->manifest
location: /data/src/guix/tests/channels.scm:234
source:
+ (test-assert
+   "channel-instances->manifest"
+   (let* ((spec (lambda deps
+                  `(channel
+                     (version 0)
+                     (dependencies
+                       ,@(map (lambda (dep)
+                                `(channel
+                                   (name ,dep)
+                                   (url "http://example.org")))
+                              deps)))))
+          (guix (make-instance #:name 'guix))
+          (instance0 (make-instance #:name 'a))
+          (instance1
+            (make-instance #:name 'b #:spec (spec 'a)))
+          (instance2
+            (make-instance #:name 'c #:spec (spec 'b)))
+          (instance3
+            (make-instance #:name 'd #:spec (spec 'c 'a))))
+     (%graft? #f)
+     (let ((source (channel-instance-checkout guix)))
+       (mkdir (string-append source "/build-aux"))
+       (call-with-output-file
+         (string-append
+           source
+           "/build-aux/build-self.scm")
+         (lambda (port)
+           (write '(begin
+                     (use-modules (guix) (gnu packages bootstrap))
+                     (lambda _ (package->derivation %bootstrap-guile)))
+                  port))))
+     (with-store
+       store
+       (let ()
+         (define manifest
+           (run-with-store
+             store
+             (channel-instances->manifest
+               (list guix
+                     instance0
+                     instance1
+                     instance2
+                     instance3))))
+         (define entries (manifest-entries manifest))
+         (define (depends? drv in out)
+           (let ((set (list->set
+                        (requisites
+                          store
+                          (list (derivation-file-name drv)))))
+                 (in (map derivation-file-name in))
+                 (out (map derivation-file-name out)))
+             (and (every (cut set-contains? set <>) in)
+                  (not (any (cut set-contains? set <>) out)))))
+         (define (lookup name)
+           (run-with-store
+             store
+             (lower-object
+               (manifest-entry-item
+                 (manifest-lookup
+                   manifest
+                   (manifest-pattern (name name)))))))
+         (let ((drv-guix (lookup "guix"))
+               (drv0 (lookup "a"))
+               (drv1 (lookup "b"))
+               (drv2 (lookup "c"))
+               (drv3 (lookup "d")))
+           (and (depends?
+                  drv-guix
+                  '()
+                  (list drv0 drv1 drv2 drv3))
+                (depends? drv0 (list) (list drv1 drv2 drv3))
+                (depends? drv1 (list drv0) (list drv2 drv3))
+                (depends? drv2 (list drv1) (list drv3))
+                (depends? drv3 (list drv2 drv0) (list))))))))
actual-value: #t
result: PASS

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.X6mqT5/.git/
[master (root-commit) e7978b4] the commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
test-name: channel-news, no news
location: /data/src/guix/tests/channels.scm:311
source:
+ (test-equal
+   "channel-news, no news"
+   '()
+   (with-temporary-git-repository
+     directory
+     '((add "a.txt" "A") (commit "the commit"))
+     (with-repository
+       directory
+       repository
+       (let ((channel
+               (channel
+                 (url (string-append "file://" directory))
+                 (name 'foo)))
+             (latest (reference-name->oid repository "HEAD")))
+         (channel-news-for-commit
+           channel
+           (oid->string latest))))))
expected-value: ()
actual-value: ()
result: PASS

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.7jW8Xf/.git/
[master (root-commit) 0c3914c] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 .guix-channel
[master f4247e9] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 src/a.txt
[master 7a1eba7] third commit
 1 file changed, 1 insertion(+)
 create mode 100644 news.scm
[master 69359fa] fourth commit
 1 file changed, 1 insertion(+)
 create mode 100644 src/b.txt
[master daa4999] fifth commit
 1 file changed, 1 insertion(+), 1 deletion(-)
test-name: channel-news, one entry
location: /data/src/guix/tests/channels.scm:323
source:
+ (test-assert
+   "channel-news, one entry"
+   (with-temporary-git-repository
+     directory
+     `((add ".guix-channel"
+            ,(object->string
+               '(channel (version 0) (news-file "news.scm"))))
+       (commit "first commit")
+       (add "src/a.txt" "A")
+       (commit "second commit")
+       (tag "tag-for-first-news-entry")
+       (add "news.scm"
+            ,(lambda (repository)
+               (let ((previous
+                       (reference-name->oid repository "HEAD")))
+                 (object->string
+                   `(channel-news
+                      (version 0)
+                      (entry (commit ,(oid->string previous))
+                             (title (en "New file!") (eo "Nova dosiero!"))
+                             (body (en "Yeah, a.txt."))))))))
+       (commit "third commit")
+       (add "src/b.txt" "B")
+       (commit "fourth commit")
+       (add "news.scm"
+            ,(lambda (repository)
+               (let ((second
+                       (commit-id
+                         (find-commit repository "second commit")))
+                     (previous
+                       (reference-name->oid repository "HEAD")))
+                 (object->string
+                   `(channel-news
+                      (version 0)
+                      (entry (commit ,(oid->string previous))
+                             (title (en "Another file!"))
+                             (body (en "Yeah, b.txt.")))
+                      (entry (tag "tag-for-first-news-entry")
+                             (title (en "Old news.") (eo "Malnova?oj."))
+                             (body (en "For a.txt"))))))))
+       (commit "fifth commit"))
+     (with-repository
+       directory
+       repository
+       (define (find-commit* message)
+         (oid->string
+           (commit-id (find-commit repository message))))
+       (let ((channel
+               (channel
+                 (url (string-append "file://" directory))
+                 (name 'foo)))
+             (commit1 (find-commit* "first commit"))
+             (commit2 (find-commit* "second commit"))
+             (commit3 (find-commit* "third commit"))
+             (commit4 (find-commit* "fourth commit"))
+             (commit5 (find-commit* "fifth commit")))
+         (and (null? (channel-news-for-commit channel commit2))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit5))
+                     (list commit2 commit4))
+              (lset= equal?
+                     (map channel-news-entry-title
+                          (channel-news-for-commit channel commit5))
+                     '((("en" . "Another file!"))
+                       (("en" . "Old news.") ("eo" . "Malnova?oj."))))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit3))
+                     (list commit2))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit3 commit1))
+                     (list commit2))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit5 commit3))
+                     (list commit4))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit5 commit1))
+                     (list commit4 commit2))
+              (lset= equal?
+                     (map channel-news-entry-tag
+                          (channel-news-for-commit channel commit5 commit1))
+                     '(#f "tag-for-first-news-entry")))))))
actual-value: #f
result: FAIL

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.5Uqx3x/.git/
[master (root-commit) d8da0bb] first commit
 2 files changed, 2 insertions(+)
 create mode 100644 .guix-channel
 create mode 100644 src/a.txt
[master b2d8390] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 news.scm
test-name: channel-news, annotated tag
location: /data/src/guix/tests/channels.scm:411
source:
+ (test-assert
+   "channel-news, annotated tag"
+   (with-temporary-git-repository
+     directory
+     `((add ".guix-channel"
+            ,(object->string
+               '(channel (version 0) (news-file "news.scm"))))
+       (add "src/a.txt" "A")
+       (commit "first commit")
+       (tag "tag-for-first-news-entry"
+            "This is an annotated tag.")
+       (add "news.scm"
+            ,(lambda (repository)
+               (let ((previous
+                       (reference-name->oid repository "HEAD")))
+                 (object->string
+                   `(channel-news
+                      (version 0)
+                      (entry (tag "tag-for-first-news-entry")
+                             (title (en "New file!"))
+                             (body (en "Yeah, a.txt."))))))))
+       (commit "second commit"))
+     (with-repository
+       directory
+       repository
+       (define (find-commit* message)
+         (oid->string
+           (commit-id (find-commit repository message))))
+       (let ((channel
+               (channel
+                 (url (string-append "file://" directory))
+                 (name 'foo)))
+             (commit1 (find-commit* "first commit"))
+             (commit2 (find-commit* "second commit")))
+         (and (null? (channel-news-for-commit channel commit1))
+              (lset= equal?
+                     (map channel-news-entry-title
+                          (channel-news-for-commit channel commit2))
+                     '((("en" . "New file!"))))
+              (lset= string=?
+                     (map channel-news-entry-tag
+                          (channel-news-for-commit channel commit2))
+                     (list "tag-for-first-news-entry"))
+              (lset= string=?
+                     (map channel-news-entry-commit
+                          (channel-news-for-commit channel commit2))
+                     (list commit1)))))))
actual-value: #t
result: PASS

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.cxwIpE/.git/
[master (root-commit) a630402] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
[master 9956d6a] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 b.scm
test-name: latest-channel-instances, missing introduction for 'guix'
location: /data/src/guix/tests/channels.scm:458
source:
+ (test-assert
+   "latest-channel-instances, missing introduction for 'guix'"
+   (with-temporary-git-repository
+     directory
+     '((add "a.txt" "A")
+       (commit "first commit")
+       (add "b.scm" "#t")
+       (commit "second commit"))
+     (with-repository
+       directory
+       repository
+       (let* ((commit1 (find-commit repository "first"))
+              (commit2 (find-commit repository "second"))
+              (channel
+                (channel
+                  (url (string-append "file://" directory))
+                  (name 'guix))))
+         (guard (c ((formatted-message? c)
+                    (->bool
+                      (string-contains
+                        (formatted-message-string c)
+                        "introduction"))))
+                (with-store
+                  store
+                  (latest-channel-instances store (list channel))
+                  #f))))))
actual-value: #t
result: PASS

test-name: authenticate-channel, wrong first commit signer
location: /data/src/guix/tests/channels.scm:479
source:
+ (test-equal
+   "authenticate-channel, wrong first commit signer"
+   #t
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add ".guix-channel"
+              ,(object->string
+                 '(channel
+                    (version 0)
+                    (keyring-reference "master"))))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "random" ,(random-text))
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let* ((commit1 (find-commit repository "first"))
+                (commit2 (find-commit repository "second"))
+                (intro (make-channel-introduction
+                         (commit-id-string commit1)
+                         (openpgp-public-key-fingerprint
+                           (read-openpgp-packet %ed25519-2-public-key-file))))
+                (channel
+                  (channel
+                    (name 'example)
+                    (url (string-append "file://" directory))
+                    (introduction intro))))
+           (guard (c ((formatted-message? c)
+                      (and (string-contains
+                             (formatted-message-string c)
+                             "initial commit")
+                           (equal?
+                             (formatted-message-arguments c)
+                             (list (oid->string (commit-id commit1))
+                                   (key-fingerprint %ed25519-public-key-file)
+                                   (key-fingerprint
+                                     %ed25519-2-public-key-file))))))
+                  (authenticate-channel
+                    channel
+                    directory
+                    (commit-id-string commit2)
+                    #:keyring-reference-prefix
+                    "")
+                  'failed))))))
result: SKIP

test-name: authenticate-channel, not a descendant of introductory commit
location: /data/src/guix/tests/channels.scm:529
source:
+ (test-equal
+   "authenticate-channel, not a descendant of introductory commit"
+   #t
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add ".guix-channel"
+              ,(object->string
+                 '(channel
+                    (version 0)
+                    (keyring-reference "master"))))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (branch "alternate-branch")
+         (checkout "alternate-branch")
+         (add "something.txt" ,(random-text))
+         (commit
+           "intro commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (checkout "master")
+         (add "random" ,(random-text))
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let* ((commit1 (find-commit repository "first"))
+                (commit2 (find-commit repository "second"))
+                (commit0
+                  (commit-lookup
+                    repository
+                    (reference-target
+                      (branch-lookup repository "alternate-branch"))))
+                (intro (make-channel-introduction
+                         (commit-id-string commit0)
+                         (openpgp-public-key-fingerprint
+                           (read-openpgp-packet %ed25519-public-key-file))))
+                (channel
+                  (channel
+                    (name 'example)
+                    (url (string-append "file://" directory))
+                    (introduction intro))))
+           (guard (c ((formatted-message? c)
+                      (and (string-contains
+                             (formatted-message-string c)
+                             "not a descendant")
+                           (equal?
+                             (formatted-message-arguments c)
+                             (list (oid->string (commit-id commit2))
+                                   (oid->string (commit-id commit0)))))))
+                  (authenticate-channel
+                    channel
+                    directory
+                    (commit-id-string commit2)
+                    #:keyring-reference-prefix
+                    "")
+                  'failed))))))
result: SKIP

test-name: authenticate-channel, .guix-authorizations
location: /data/src/guix/tests/channels.scm:587
source:
+ (test-equal
+   "authenticate-channel, .guix-authorizations"
+   #t
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add ".guix-channel"
+              ,(object->string
+                 '(channel
+                    (version 0)
+                    (keyring-reference "channel-keyring"))))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "b.txt" "B")
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "c.txt" "C")
+         (commit
+           "third commit"
+           (signer
+             ,(key-fingerprint %ed25519-2-public-key-file)))
+         (branch "channel-keyring")
+         (checkout "channel-keyring")
+         (add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add "other.key"
+              ,(call-with-input-file
+                 %ed25519-2-public-key-file
+                 get-string-all))
+         (commit "keyring commit")
+         (checkout "master"))
+       (with-repository
+         directory
+         repository
+         (let* ((commit1 (find-commit repository "first"))
+                (commit2 (find-commit repository "second"))
+                (commit3 (find-commit repository "third"))
+                (intro (make-channel-introduction
+                         (commit-id-string commit1)
+                         (openpgp-public-key-fingerprint
+                           (read-openpgp-packet %ed25519-public-key-file))))
+                (channel
+                  (channel
+                    (name 'example)
+                    (url (string-append "file://" directory))
+                    (introduction intro))))
+           (and (authenticate-channel
+                  channel
+                  directory
+                  (commit-id-string commit2)
+                  #:keyring-reference-prefix
+                  "")
+                (guard (c ((unauthorized-commit-error? c)
+                           (and (oid=? (git-authentication-error-commit c)
+                                       (commit-id commit3))
+                                (bytevector=?
+                                  (openpgp-public-key-fingerprint
+                                    (unauthorized-commit-error-signing-key c))
+                                  (openpgp-public-key-fingerprint
+                                    (read-openpgp-packet
+                                      %ed25519-2-public-key-file))))))
+                       (authenticate-channel
+                         channel
+                         directory
+                         (commit-id-string commit3)
+                         #:keyring-reference-prefix
+                         "")
+                       'failed)))))))
result: SKIP

test-name: latest-channel-instances, authenticate dependency
location: /data/src/guix/tests/channels.scm:656
source:
+ (test-equal
+   "latest-channel-instances, authenticate dependency"
+   #t
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (with-temporary-git-repository
+       dependency-directory
+       `((add ".guix-channel"
+              ,(object->string
+                 '(channel
+                    (version 0)
+                    (keyring-reference "master"))))
+         (add ".guix-authorizations"
+              ,(object->string `(authorizations (version 0) ())))
+         (add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (commit
+           "zeroth commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "foo.txt" "evil")
+         (commit "unsigned commit"))
+       (with-repository
+         dependency-directory
+         dependency
+         (let* ((commit0 (find-commit dependency "zeroth"))
+                (commit1 (find-commit dependency "unsigned"))
+                (intro `(channel-introduction
+                          (version 0)
+                          (commit ,(commit-id-string commit0))
+                          (signer
+                            ,(openpgp-format-fingerprint
+                               (openpgp-public-key-fingerprint
+                                 (read-openpgp-packet
+                                   %ed25519-public-key-file)))))))
+           (with-temporary-git-repository
+             directory
+             `((add ".guix-channel"
+                    ,(object->string
+                       `(channel
+                          (version 0)
+                          (dependencies
+                            (channel
+                              (name test-channel)
+                              (url ,dependency-directory)
+                              (introduction ,intro))))))
+               (commit "single commit"))
+             (let ((channel (channel (name 'test) (url directory))))
+               (guard (c ((unsigned-commit-error? c)
+                          (oid=? (git-authentication-error-commit c)
+                                 (commit-id commit1))))
+                      (with-store
+                        store
+                        (latest-channel-instances store (list channel))
+                        'failed)))))))))
result: SKIP

Updating channel 'test' from Git repository at 'test'...
Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'...
Updating channel 'test' from Git repository at 'test'...
Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'...
Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'...
Updating channel 'foo' from Git repository at 'file:///tmp/guix-directory.xhmL8p'...
Updating channel 'guix' from Git repository at 'file:///tmp/guix-directory.cxwIpE'...

SKIP: tests/cpio
================

test-name: file->cpio-header + write-cpio-header + read-cpio-header
location: /data/src/guix/tests/cpio.scm:37
source:
+ (test-assert
+   "file->cpio-header + write-cpio-header + read-cpio-header"
+   (let* ((file (search-path %load-path "guix.scm"))
+          (header (file->cpio-header file)))
+     (call-with-values
+       (lambda () (open-bytevector-output-port))
+       (lambda (port get-bv)
+         (write-cpio-header header port)
+         (let ((port (open-bytevector-input-port (get-bv))))
+           (equal? header (read-cpio-header port)))))))
actual-value: #t
result: PASS

test-name: bit-identical to GNU cpio's output
location: /data/src/guix/tests/cpio.scm:49
source:
+ (test-assert
+   "bit-identical to GNU cpio's output"
+   (call-with-temporary-output-file
+     (lambda (link _)
+       (delete-file link)
+       (symlink "chbouib" link)
+       (let ((files (cons* "/"
+                           (canonicalize-path
+                             (dirname (search-path %load-path "guix.scm")))
+                           link
+                           (map (compose
+                                  canonicalize-path
+                                  (cut search-path %load-path <>))
+                                '("guix.scm"
+                                  "guix/build/syscalls.scm"
+                                  "guix/packages.scm")))))
+         (call-with-temporary-output-file
+           (lambda (ref-file _)
+             (let ((pipe (open-pipe*
+                           OPEN_WRITE
+                           %cpio-program
+                           "-o"
+                           "-O"
+                           ref-file
+                           "-H"
+                           "newc"
+                           "--null")))
+               (for-each
+                 (lambda (file) (format pipe "~a\x00" file))
+                 files)
+               (and (zero? (close-pipe pipe))
+                    (call-with-temporary-output-file
+                      (lambda (file port)
+                        (write-cpio-archive files port)
+                        (close-port port)
+                        (or (file=? ref-file file)
+                            (throw 'cpio-archives-differ
+                                   files
+                                   ref-file
+                                   file
+                                   (stat:size (stat ref-file))
+                                   (stat:size (stat file))))))))))))))
result: SKIP


FAIL: tests/crate
=================

test-name: guix-package->crate-name
location: /data/src/guix/tests/crate.scm:326
source:
+ (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")))))))
expected-value: "rustc-serialize"
actual-value: "rustc-serialize"
result: PASS

test-name: crate->guix-package
location: /data/src/guix/tests/crate.scm:335
source:
+ (test-assert
+   "crate->guix-package"
+   (mock ((guix http-client)
+          http-fetch
+          (lambda (url . rest)
+            (match url
+                   ("https://crates.io/api/v1/crates/foo"
+                    (open-input-string test-foo-crate))
+                   ("https://crates.io/api/v1/crates/foo/1.0.3/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.3/dependencies"
+                    (open-input-string test-foo-dependencies))
+                   ("https://crates.io/api/v1/crates/leaf-alice"
+                    (open-input-string test-leaf-alice-crate))
+                   ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/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/leaf-alice/0.7.5/dependencies"
+                    (open-input-string test-leaf-alice-dependencies))
+                   (_ (error "Unexpected URL: " url)))))
+         (match (crate->guix-package "foo")
+                ((define-public 'rust-foo-1
+                   (package
+                     (name "rust-foo")
+                     (version "1.0.3")
+                     (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)
+                     (arguments
+                       ('quasiquote
+                        (#:skip-build?
+                         #t
+                         #:cargo-inputs
+                         (("rust-leaf-alice"
+                           ('unquote 'rust-leaf-alice-0.7))))))
+                     (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)))))
actual-value: #t
result: PASS

test-name: cargo-recursive-import
location: /data/src/guix/tests/crate.scm:388
source:
+ (test-assert
+   "cargo-recursive-import"
+   (mock ((guix http-client)
+          http-fetch
+          (lambda (url . rest)
+            (match url
+                   ("https://crates.io/api/v1/crates/root"
+                    (open-input-string test-root-crate))
+                   ("https://crates.io/api/v1/crates/root/1.0.4/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/root/1.0.4/dependencies"
+                    (open-input-string test-root-dependencies))
+                   ("https://crates.io/api/v1/crates/intermediate-a"
+                    (open-input-string test-intermediate-a-crate))
+                   ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/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/intermediate-a/1.0.42/dependencies"
+                    (open-input-string
+                      test-intermediate-a-dependencies))
+                   ("https://crates.io/api/v1/crates/intermediate-b"
+                    (open-input-string test-intermediate-b-crate))
+                   ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/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/intermediate-b/1.2.3/dependencies"
+                    (open-input-string
+                      test-intermediate-b-dependencies))
+                   ("https://crates.io/api/v1/crates/leaf-alice"
+                    (open-input-string test-leaf-alice-crate))
+                   ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/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/leaf-alice/0.7.5/dependencies"
+                    (open-input-string test-leaf-alice-dependencies))
+                   ("https://crates.io/api/v1/crates/leaf-bob"
+                    (open-input-string test-leaf-bob-crate))
+                   ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/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/leaf-bob/3.0.1/dependencies"
+                    (open-input-string test-leaf-bob-dependencies))
+                   (_ (error "Unexpected URL: " url)))))
+         (match (crate-recursive-import "root")
+                (((define-public 'rust-leaf-alice-0.7
+                    (package
+                      (name "rust-leaf-alice")
+                      (version "0.7.5")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "leaf-alice" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments ('quasiquote (#:skip-build? #t)))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0))))
+                  (define-public 'rust-leaf-bob-3
+                    (package
+                      (name "rust-leaf-bob")
+                      (version "3.0.1")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "leaf-bob" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments ('quasiquote (#:skip-build? #t)))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0))))
+                  (define-public 'rust-intermediate-b-1
+                    (package
+                      (name "rust-intermediate-b")
+                      (version "1.2.3")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "intermediate-b" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments
+                        ('quasiquote
+                         (#:skip-build?
+                          #t
+                          #:cargo-inputs
+                          (("rust-leaf-bob" ('unquote rust-leaf-bob-3))))))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0))))
+                  (define-public 'rust-intermediate-a-1
+                    (package
+                      (name "rust-intermediate-a")
+                      (version "1.0.42")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "intermediate-a" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments
+                        ('quasiquote
+                         (#:skip-build?
+                          #t
+                          #:cargo-inputs
+                          (("rust-intermediate-b"
+                            ('unquote rust-intermediate-b-1))
+                           ("rust-leaf-alice"
+                            ('unquote 'rust-leaf-alice-0.7))
+                           ("rust-leaf-bob" ('unquote rust-leaf-bob-3))))))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0))))
+                  (define-public 'rust-root-1
+                    (package
+                      (name "rust-root")
+                      (version "1.0.4")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "root" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments
+                        ('quasiquote
+                         (#:cargo-inputs
+                          (("rust-intermediate-a"
+                            ('unquote rust-intermediate-a-1))
+                           ("rust-intermediate-b"
+                            ('unquote rust-intermediate-b-1))
+                           ("rust-leaf-alice"
+                            ('unquote 'rust-leaf-alice-0.7))
+                           ("rust-leaf-bob" ('unquote rust-leaf-bob-3))))))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0)))))
+                 #t)
+                (x (pk 'fail x #f)))))
actual-value: #t
result: PASS

test-name: licenses: MIT OR Apache-2.0
location: /data/src/guix/tests/crate.scm:562
source:
+ (test-equal
+   "licenses: MIT OR Apache-2.0"
+   '(license:expat license:asl2.0)
+   (string->license "MIT OR Apache-2.0"))
expected-value: (license:expat license:asl2.0)
actual-value: (license:expat license:asl2.0)
result: PASS

test-name: licenses: Apache-2.0 / MIT
location: /data/src/guix/tests/crate.scm:566
source:
+ (test-equal
+   "licenses: Apache-2.0 / MIT"
+   '(license:asl2.0 license:expat)
+   (string->license "Apache-2.0 / MIT"))
expected-value: (license:asl2.0 license:expat)
actual-value: (license:asl2.0 license:expat)
result: PASS

test-name: licenses: Apache-2.0 WITH LLVM-exception
location: /data/src/guix/tests/crate.scm:570
source:
+ (test-equal
+   "licenses: Apache-2.0 WITH LLVM-exception"
+   '(license:asl2.0 unknown-license!)
+   (string->license
+     "Apache-2.0 WITH LLVM-exception"))
expected-value: (license:asl2.0 unknown-license!)
actual-value: (license:asl2.0 unknown-license!)
result: PASS

test-name: licenses: MIT/Apache-2.0 AND BSD-2-Clause
location: /data/src/guix/tests/crate.scm:574
source:
+ (test-equal
+   "licenses: MIT/Apache-2.0 AND BSD-2-Clause"
+   '(license:expat license:asl2.0 unknown-license!)
+   (string->license
+     "MIT/Apache-2.0 AND BSD-2-Clause"))
expected-value: (license:expat license:asl2.0 unknown-license!)
actual-value: (license:expat license:asl2.0 license:bsd-2)
result: FAIL

test-name: licenses: MIT/Apache-2.0
location: /data/src/guix/tests/crate.scm:578
source:
+ (test-equal
+   "licenses: MIT/Apache-2.0"
+   '(license:expat license:asl2.0)
+   (string->license "MIT/Apache-2.0"))
expected-value: (license:expat license:asl2.0)
actual-value: (license:expat license:asl2.0)
result: PASS

test-name: self-test: rust-docopt 0.8.x is gone, please adjust the test case
location: /data/src/guix/tests/crate.scm:619
source:
+ (test-assert
+   "self-test: rust-docopt 0.8.x is gone, please adjust the test case"
+   (not (null? (find-packages-by-name "rust-docopt" "0.8"))))
actual-value: #t
result: PASS

test-name: cargo-recursive-import-hoors-existing-packages
location: /data/src/guix/tests/crate.scm:623
source:
+ (test-assert
+   "cargo-recursive-import-hoors-existing-packages"
+   (mock ((guix http-client)
+          http-fetch
+          (lambda (url . rest)
+            (match url
+                   ("https://crates.io/api/v1/crates/doctool"
+                    (open-input-string test-doctool-crate))
+                   ("https://crates.io/api/v1/crates/doctool/2.2.2/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/doctool/2.2.2/dependencies"
+                    (open-input-string test-doctool-dependencies))
+                   (_ (error "Unexpected URL: " url)))))
+         (match (crate-recursive-import "doctool")
+                (((define-public 'rust-doctool-2
+                    (package
+                      (name "rust-doctool")
+                      (version "2.2.2")
+                      (source
+                        (origin
+                          (method url-fetch)
+                          (uri (crate-uri "doctool" version))
+                          (file-name
+                            (string-append name "-" version ".tar.gz"))
+                          (sha256 (base32 (? string? hash)))))
+                      (build-system cargo-build-system)
+                      (arguments
+                        ('quasiquote
+                         (#:cargo-inputs
+                          (("rust-docopt" ('unquote 'rust-docopt-0.8))))))
+                      (home-page "http://example.com")
+                      (synopsis "summary")
+                      (description "summary")
+                      (license (list license:expat license:asl2.0)))))
+                 #t)
+                (x (pk 'fail x #f)))))
actual-value: #t
result: PASS


SKIP: tests/git-authenticate
============================

hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/guix-directory.dpSDkE/.git/
[master (root-commit) 08f3bdb] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
[master 0865cb5] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 b.txt
test-name: unsigned commits
location: /data/src/guix/tests/git-authenticate.scm:48
source:
+ (test-assert
+   "unsigned commits"
+   (with-temporary-git-repository
+     directory
+     '((add "a.txt" "A")
+       (commit "first commit")
+       (add "b.txt" "B")
+       (commit "second commit"))
+     (with-repository
+       directory
+       repository
+       (let ((commit1 (find-commit repository "first"))
+             (commit2 (find-commit repository "second")))
+         (guard (c ((unsigned-commit-error? c)
+                    (oid=? (git-authentication-error-commit c)
+                           (commit-id commit1))))
+                (authenticate-commits
+                  repository
+                  (list commit1 commit2)
+                  #:keyring-reference
+                  "master")
+                'failed)))))
actual-value: #t
result: PASS

test-name: signed commits, SHA1 signature
location: /data/src/guix/tests/git-authenticate.scm:65
source:
+ (test-assert
+   "signed commits, SHA1 signature"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (call-with-output-file
+       (string-append (getenv "GNUPGHOME") "/gpg.conf")
+       (lambda (port) (display "digest-algo sha1" port)))
+     (with-temporary-git-repository
+       directory
+       `((add "a.txt" "A")
+         (add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((commit (find-commit repository "first")))
+           (guard (c ((unsigned-commit-error? c)
+                      (oid=? (git-authentication-error-commit c)
+                             (commit-id commit))))
+                  (authenticate-commits
+                    repository
+                    (list commit)
+                    #:keyring-reference
+                    "master")
+                  'failed))))))
result: SKIP

test-name: signed commits, default authorizations
location: /data/src/guix/tests/git-authenticate.scm:94
source:
+ (test-assert
+   "signed commits, default authorizations"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "b.txt" "B")
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((commit1 (find-commit repository "first"))
+               (commit2 (find-commit repository "second")))
+           (authenticate-commits
+             repository
+             (list commit1 commit2)
+             #:default-authorizations
+             (list (openpgp-public-key-fingerprint
+                     (read-openpgp-packet %ed25519-public-key-file)))
+             #:keyring-reference
+             "master"))))))
result: SKIP

test-name: signed commits, .guix-authorizations
location: /data/src/guix/tests/git-authenticate.scm:118
source:
+ (test-assert
+   "signed commits, .guix-authorizations"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add ".guix-authorizations"
+              ,(object->string `(authorizations (version 0) ())))
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "b.txt" "B")
+         (commit
+           "third commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((commit1 (find-commit repository "first"))
+               (commit2 (find-commit repository "second"))
+               (commit3 (find-commit repository "third")))
+           (and (authenticate-commits
+                  repository
+                  (list commit1 commit2)
+                  #:keyring-reference
+                  "master")
+                (guard (c ((unauthorized-commit-error? c)
+                           (and (oid=? (git-authentication-error-commit c)
+                                       (commit-id commit3))
+                                (bytevector=?
+                                  (openpgp-public-key-fingerprint
+                                    (unauthorized-commit-error-signing-key c))
+                                  (openpgp-public-key-fingerprint
+                                    (read-openpgp-packet
+                                      %ed25519-public-key-file))))))
+                       (authenticate-commits
+                         repository
+                         (list commit1 commit2 commit3)
+                         #:keyring-reference
+                         "master")
+                       'failed)))))))
result: SKIP

test-name: signed commits, .guix-authorizations, unauthorized merge
location: /data/src/guix/tests/git-authenticate.scm:166
source:
+ (test-assert
+   "signed commits, .guix-authorizations, unauthorized merge"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add "signer1.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add "signer2.key"
+              ,(call-with-input-file
+                 %ed25519-2-public-key-file
+                 get-string-all))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Alice"))))))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (branch "devel")
+         (checkout "devel")
+         (add "devel/1.txt" "1")
+         (commit
+           "first devel commit"
+           (signer
+             ,(key-fingerprint %ed25519-2-public-key-file)))
+         (checkout "master")
+         (add "b.txt" "B")
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (merge "devel"
+                "merge"
+                (signer
+                  ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((master1 (find-commit repository "first commit"))
+               (master2
+                 (find-commit repository "second commit"))
+               (devel1
+                 (find-commit repository "first devel commit"))
+               (merge (find-commit repository "merge")))
+           (define (correct? c commit)
+             (and (oid=? (git-authentication-error-commit c)
+                         (commit-id commit))
+                  (bytevector=?
+                    (openpgp-public-key-fingerprint
+                      (unauthorized-commit-error-signing-key c))
+                    (openpgp-public-key-fingerprint
+                      (read-openpgp-packet %ed25519-2-public-key-file)))))
+           (and (authenticate-commits
+                  repository
+                  (list master1 master2)
+                  #:keyring-reference
+                  "master")
+                (guard (c ((unauthorized-commit-error? c)
+                           (correct? c devel1)))
+                       (authenticate-commits
+                         repository
+                         (list master1 devel1)
+                         #:keyring-reference
+                         "master")
+                       #f)
+                (guard (c ((unauthorized-commit-error? c)
+                           (correct? c devel1)))
+                       (authenticate-commits
+                         repository
+                         (list master1 master2 devel1 merge)
+                         #:keyring-reference
+                         "master")
+                       #f)))))))
result: SKIP

test-name: signed commits, .guix-authorizations, authorized merge
location: /data/src/guix/tests/git-authenticate.scm:235
source:
+ (test-assert
+   "signed commits, .guix-authorizations, authorized merge"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add "signer1.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add "signer2.key"
+              ,(call-with-input-file
+                 %ed25519-2-public-key-file
+                 get-string-all))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Alice"))))))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (branch "devel")
+         (checkout "devel")
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Alice"))
+                     (,(key-fingerprint %ed25519-2-public-key-file))))))
+         (commit
+           "first devel commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "devel/2.txt" "2")
+         (commit
+           "second devel commit"
+           (signer
+             ,(key-fingerprint %ed25519-2-public-key-file)))
+         (checkout "master")
+         (add "b.txt" "B")
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (merge "devel"
+                "merge"
+                (signer
+                  ,(key-fingerprint %ed25519-public-key-file)))
+         (add "c.txt" "C")
+         (commit
+           "third commit"
+           (signer
+             ,(key-fingerprint %ed25519-2-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((master1 (find-commit repository "first commit"))
+               (master2
+                 (find-commit repository "second commit"))
+               (devel1
+                 (find-commit repository "first devel commit"))
+               (devel2
+                 (find-commit repository "second devel commit"))
+               (merge (find-commit repository "merge"))
+               (master3 (find-commit repository "third commit")))
+           (authenticate-commits
+             repository
+             (list master1
+                   master2
+                   devel1
+                   devel2
+                   merge
+                   master3)
+             #:keyring-reference
+             "master"))))))
result: SKIP

test-name: signed commits, .guix-authorizations removed
location: /data/src/guix/tests/git-authenticate.scm:295
source:
+ (test-assert
+   "signed commits, .guix-authorizations removed"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (with-temporary-git-repository
+       directory
+       `((add "signer.key"
+              ,(call-with-input-file
+                 %ed25519-public-key-file
+                 get-string-all))
+         (add ".guix-authorizations"
+              ,(object->string
+                 `(authorizations
+                    (version 0)
+                    ((,(key-fingerprint %ed25519-public-key-file)
+                      (name "Charlie"))))))
+         (commit "zeroth commit")
+         (add "a.txt" "A")
+         (commit
+           "first commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (remove ".guix-authorizations")
+         (commit
+           "second commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file)))
+         (add "b.txt" "B")
+         (commit
+           "third commit"
+           (signer
+             ,(key-fingerprint %ed25519-public-key-file))))
+       (with-repository
+         directory
+         repository
+         (let ((commit1 (find-commit repository "first"))
+               (commit2 (find-commit repository "second"))
+               (commit3 (find-commit repository "third")))
+           (and (authenticate-commits
+                  repository
+                  (list commit1 commit2)
+                  #:keyring-reference
+                  "master")
+                (guard (c ((unauthorized-commit-error? c)
+                           (oid=? (git-authentication-error-commit c)
+                                  (commit-id commit2))))
+                       (authenticate-commits
+                         repository
+                         (list commit1 commit2 commit3)
+                         #:keyring-reference
+                         "master")
+                       'failed)))))))
result: SKIP

test-name: introductory commit, valid signature
location: /data/src/guix/tests/git-authenticate.scm:336
source:
+ (test-assert
+   "introductory commit, valid signature"
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (let ((fingerprint
+             (key-fingerprint %ed25519-public-key-file)))
+       (with-temporary-git-repository
+         directory
+         `((add "signer.key"
+                ,(call-with-input-file
+                   %ed25519-public-key-file
+                   get-string-all))
+           (add ".guix-authorizations"
+                ,(object->string
+                   `(authorizations
+                      (version 0)
+                      ((,(key-fingerprint %ed25519-public-key-file)
+                        (name "Charlie"))))))
+           (commit "zeroth commit" (signer ,fingerprint))
+           (add "a.txt" "A")
+           (commit "first commit" (signer ,fingerprint)))
+         (with-repository
+           directory
+           repository
+           (let ((commit0 (find-commit repository "zero"))
+                 (commit1 (find-commit repository "first")))
+             (authenticate-repository
+               repository
+               (commit-id commit0)
+               (openpgp-fingerprint fingerprint)
+               #:keyring-reference
+               "master"
+               #:cache-key
+               (random-text))))))))
result: SKIP

test-name: introductory commit, missing signature
location: /data/src/guix/tests/git-authenticate.scm:363
source:
+ (test-equal
+   "introductory commit, missing signature"
+   'intro-lacks-signature
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (let ((fingerprint
+             (key-fingerprint %ed25519-public-key-file)))
+       (with-temporary-git-repository
+         directory
+         `((add "signer.key"
+                ,(call-with-input-file
+                   %ed25519-public-key-file
+                   get-string-all))
+           (add ".guix-authorizations"
+                ,(object->string
+                   `(authorizations
+                      (version 0)
+                      ((,(key-fingerprint %ed25519-public-key-file)
+                        (name "Charlie"))))))
+           (commit "zeroth commit")
+           (add "a.txt" "A")
+           (commit "first commit" (signer ,fingerprint)))
+         (with-repository
+           directory
+           repository
+           (let ((commit0 (find-commit repository "zero")))
+             (guard (c ((formatted-message? c)
+                        (and (equal?
+                               (formatted-message-arguments c)
+                               (list (oid->string (commit-id commit0))))
+                             'intro-lacks-signature)))
+                    (authenticate-repository
+                      repository
+                      (commit-id commit0)
+                      (openpgp-fingerprint fingerprint)
+                      #:keyring-reference
+                      "master"
+                      #:cache-key
+                      (random-text)))))))))
result: SKIP

test-name: introductory commit, wrong signature
location: /data/src/guix/tests/git-authenticate.scm:395
source:
+ (test-equal
+   "introductory commit, wrong signature"
+   'wrong-intro-signing-key
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file
+           %ed25519-2-public-key-file
+           %ed25519-2-secret-key-file)
+     (let ((fingerprint
+             (key-fingerprint %ed25519-public-key-file))
+           (wrong-fingerprint
+             (key-fingerprint %ed25519-2-public-key-file)))
+       (with-temporary-git-repository
+         directory
+         `((add "signer1.key"
+                ,(call-with-input-file
+                   %ed25519-public-key-file
+                   get-string-all))
+           (add "signer2.key"
+                ,(call-with-input-file
+                   %ed25519-2-public-key-file
+                   get-string-all))
+           (add ".guix-authorizations"
+                ,(object->string
+                   `(authorizations
+                      (version 0)
+                      ((,(key-fingerprint %ed25519-public-key-file)
+                        (name "Charlie"))))))
+           (commit
+             "zeroth commit"
+             (signer ,wrong-fingerprint))
+           (add "a.txt" "A")
+           (commit "first commit" (signer ,fingerprint)))
+         (with-repository
+           directory
+           repository
+           (let ((commit0 (find-commit repository "zero"))
+                 (commit1 (find-commit repository "first")))
+             (guard (c ((formatted-message? c)
+                        (and (equal?
+                               (formatted-message-arguments c)
+                               (list (oid->string (commit-id commit0))
+                                     wrong-fingerprint
+                                     fingerprint))
+                             'wrong-intro-signing-key)))
+                    (authenticate-repository
+                      repository
+                      (commit-id commit0)
+                      (openpgp-fingerprint fingerprint)
+                      #:keyring-reference
+                      "master"
+                      #:cache-key
+                      (random-text)))))))))
result: SKIP

test-name: authenticate-repository, target not a descendant of intro
location: /data/src/guix/tests/git-authenticate.scm:435
source:
+ (test-equal
+   "authenticate-repository, target not a descendant of intro"
+   'target-commit-not-a-descendant-of-intro
+   (with-fresh-gnupg-setup
+     (list %ed25519-public-key-file
+           %ed25519-secret-key-file)
+     (let ((fingerprint
+             (key-fingerprint %ed25519-public-key-file)))
+       (with-temporary-git-repository
+         directory
+         `((add "signer.key"
+                ,(call-with-input-file
+                   %ed25519-public-key-file
+                   get-string-all))
+           (add ".guix-authorizations"
+                ,(object->string
+                   `(authorizations
+                      (version 0)
+                      ((,(key-fingerprint %ed25519-public-key-file)
+                        (name "Charlie"))))))
+           (commit "zeroth commit" (signer ,fingerprint))
+           (branch "pre-intro-branch")
+           (checkout "pre-intro-branch")
+           (add "b.txt" "B")
+           (commit "alternate commit" (signer ,fingerprint))
+           (checkout "master")
+           (add "a.txt" "A")
+           (commit "first commit" (signer ,fingerprint))
+           (add "c.txt" "C")
+           (commit "second commit" (signer ,fingerprint)))
+         (with-repository
+           directory
+           repository
+           (let ((commit1 (find-commit repository "first"))
+                 (commit-alt
+                   (commit-lookup
+                     repository
+                     (reference-target
+                       (branch-lookup repository "pre-intro-branch")))))
+             (guard (c ((formatted-message? c)
+                        (and (equal?
+                               (formatted-message-arguments c)
+                               (list (oid->string (commit-id commit-alt))
+                                     (oid->string (commit-id commit1))))
+                             'target-commit-not-a-descendant-of-intro)))
+                    (authenticate-repository
+                      repository
+                      (commit-id commit1)
+                      (openpgp-fingerprint fingerprint)
+                      #:end
+                      (commit-id commit-alt)
+                      #:keyring-reference
+                      "master"
+                      #:cache-key
+                      (random-text)))))))))
result: SKIP


SKIP: tests/hackage
===================


Starting download of /tmp/guix-file.w9P7Co
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.w9P7Co
From https://web.archive.org/web/20220527122906/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122906/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.w9P7Co...
could not find its Disarchive specification
failed to download "/tmp/guix-file.w9P7Co" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 1
location: /data/src/guix/tests/hackage.scm:189
source:
+ (test-assert
+   "hackage->guix-package test 1"
+   (eval-test-with-cabal test-cabal-1 match-ghc-foo))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.MpO2s4
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.MpO2s4
From https://web.archive.org/web/20220527122910/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122910/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.MpO2s4...
could not find its Disarchive specification
failed to download "/tmp/guix-file.MpO2s4" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 2
location: /data/src/guix/tests/hackage.scm:192
source:
+ (test-assert
+   "hackage->guix-package test 2"
+   (eval-test-with-cabal test-cabal-2 match-ghc-foo))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.4Nf5S1
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.4Nf5S1
From https://web.archive.org/web/20220527122912/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122912/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.4Nf5S1...
could not find its Disarchive specification
failed to download "/tmp/guix-file.4Nf5S1" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 3
location: /data/src/guix/tests/hackage.scm:195
source:
+ (test-assert
+   "hackage->guix-package test 3"
+   (eval-test-with-cabal
+     test-cabal-3
+     match-ghc-foo
+     #:cabal-environment
+     '(("impl" . "ghc-7.8"))))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.XoTojc
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.XoTojc
From https://web.archive.org/web/20220527122913/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122913/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.XoTojc...
could not find its Disarchive specification
failed to download "/tmp/guix-file.XoTojc" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 4
location: /data/src/guix/tests/hackage.scm:199
source:
+ (test-assert
+   "hackage->guix-package test 4"
+   (eval-test-with-cabal
+     test-cabal-4
+     match-ghc-foo
+     #:cabal-environment
+     '(("impl" . "ghc-7.8"))))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.oYLjYo
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.oYLjYo
From https://web.archive.org/web/20220527122915/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122915/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.oYLjYo...
could not find its Disarchive specification
failed to download "/tmp/guix-file.oYLjYo" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 5
location: /data/src/guix/tests/hackage.scm:203
source:
+ (test-assert
+   "hackage->guix-package test 5"
+   (eval-test-with-cabal
+     test-cabal-5
+     match-ghc-foo
+     #:cabal-environment
+     '(("impl" . "ghc-7.8"))))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.2dXblr
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.2dXblr
From https://web.archive.org/web/20220527122916/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122916/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.2dXblr...
could not find its Disarchive specification
failed to download "/tmp/guix-file.2dXblr" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test 6
location: /data/src/guix/tests/hackage.scm:226
source:
+ (test-assert
+   "hackage->guix-package test 6"
+   (eval-test-with-cabal
+     test-cabal-6
+     match-ghc-foo-6))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.Za5ehc
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.Za5ehc
From https://web.archive.org/web/20220527122917/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122917/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.Za5ehc...
could not find its Disarchive specification
failed to download "/tmp/guix-file.Za5ehc" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test multiline desc (layout)
location: /data/src/guix/tests/hackage.scm:244
source:
+ (test-assert
+   "hackage->guix-package test multiline desc (layout)"
+   (eval-test-with-cabal
+     test-cabal-multiline-layout
+     match-ghc-foo))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.ycm4Gn
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.ycm4Gn
From https://web.archive.org/web/20220527122918/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122918/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.ycm4Gn...
could not find its Disarchive specification
failed to download "/tmp/guix-file.ycm4Gn" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test multiline desc (braced)
location: /data/src/guix/tests/hackage.scm:264
source:
+ (test-assert
+   "hackage->guix-package test multiline desc (braced)"
+   (eval-test-with-cabal
+     test-cabal-multiline-braced
+     match-ghc-foo))
actual-value: #t
result: PASS

Syntax error: unexpected token : (ghc-options (-Wall)) (at line 11, column 2)
Syntax error: unexpected end of input

;;; (fail #f #f)
test-name: hackage->guix-package test mixed layout
location: /data/src/guix/tests/hackage.scm:284
source:
+ (test-assert
+   "hackage->guix-package test mixed layout"
+   (eval-test-with-cabal
+     test-cabal-mixed-layout
+     match-ghc-foo))
actual-value: #f
result: XFAIL


Starting download of /tmp/guix-file.1G42Pv
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.1G42Pv
From https://web.archive.org/web/20220527122920/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122920/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.1G42Pv...
could not find its Disarchive specification
failed to download "/tmp/guix-file.1G42Pv" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test flag executable
location: /data/src/guix/tests/hackage.scm:309
source:
+ (test-assert
+   "hackage->guix-package test flag executable"
+   (eval-test-with-cabal
+     test-cabal-flag-executable
+     match-ghc-foo))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.pI2PJT
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.pI2PJT
From https://web.archive.org/web/20220527122921/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122921/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.pI2PJT...
could not find its Disarchive specification
failed to download "/tmp/guix-file.pI2PJT" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test cabal revision
location: /data/src/guix/tests/hackage.scm:349
source:
+ (test-assert
+   "hackage->guix-package test cabal revision"
+   (eval-test-with-cabal
+     test-cabal-revision
+     match-ghc-foo-revision))
actual-value: #t
result: PASS

test-name: read-cabal test 1
location: /data/src/guix/tests/hackage.scm:352
source:
+ (test-assert
+   "read-cabal test 1"
+   (match (call-with-input-string
+            test-read-cabal-1
+            read-cabal)
+          ((("name" ("test-me"))
+            ('section
+             'library
+             (('if
+               ('flag "base4point8")
+               (("build-depends" ("base >= 4.8 && < 5")))
+               (('if
+                 ('flag "base4")
+                 (("build-depends" ("base >= 4 && < 4.8")))
+                 (('if
+                   ('flag "base3")
+                   (("build-depends" ("base >= 3 && < 4")))
+                   (("build-depends" ("base < 3"))))))))
+              ('if
+               ('or
+                ('flag "base4point8")
+                ('and ('flag "base4") ('flag "base3")))
+               (("build-depends" ("random")))
+               ())
+              ("build-depends" ("containers"))
+              ("exposed-modules" ("Test.QuickCheck.Exception")))))
+           #t)
+          (x (pk 'fail x #f))))
actual-value: #t
result: PASS


Starting download of /tmp/guix-file.oeodD8
From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "Not Found"

Starting download of /tmp/guix-file.oeodD8
From https://web.archive.org/web/20220527122922/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz...
download failed "https://web.archive.org/web/20220527122922/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" 404 "NOT FOUND"
Trying to use Disarchive to assemble /tmp/guix-file.oeodD8...
could not find its Disarchive specification
failed to download "/tmp/guix-file.oeodD8" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz"
test-name: hackage->guix-package test cabal import
location: /data/src/guix/tests/hackage.scm:406
source:
+ (test-assert
+   "hackage->guix-package test cabal import"
+   (eval-test-with-cabal
+     test-cabal-import
+     match-ghc-foo-import))
actual-value: #t
result: PASS


SKIP: tests/inferior
====================

test-name: open-inferior
location: /data/src/guix/tests/inferior.scm:54
source:
+ (test-equal
+   "open-inferior"
+   '(42 #t)
+   (let ((inferior
+           (open-inferior
+             %top-builddir
+             #:command
+             "scripts/guix")))
+     (and (inferior? inferior)
+          (let ((a (inferior-eval '(apply * '(6 7)) inferior))
+                (b (inferior-eval
+                     '(@ (gnu packages base) coreutils)
+                     inferior)))
+            (close-inferior inferior)
+            (list a (inferior-object? b))))))
expected-value: (42 #t)
actual-value: (42 #t)
result: PASS

test-name: close-inferior
location: /data/src/guix/tests/inferior.scm:65
source:
+ (test-equal
+   "close-inferior"
+   '((hello) (world))
+   (let* ((inferior1
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (lst1 (inferior-eval '(list 'hello) inferior1))
+          (inferior2
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (lst2 (inferior-eval '(list 'world) inferior2)))
+     (close-inferior inferior1)
+     (close-inferior inferior2)
+     (list lst1 lst2)))
expected-value: ((hello) (world))
actual-value: ((hello) (world))
result: PASS

test-name: &inferior-exception
location: /data/src/guix/tests/inferior.scm:79
source:
+ (test-equal
+   "&inferior-exception"
+   '(a b c d)
+   (let ((inferior
+           (open-inferior
+             %top-builddir
+             #:command
+             "scripts/guix")))
+     (guard (c ((inferior-exception? c)
+                (close-inferior inferior)
+                (and (eq? inferior (inferior-exception-inferior c))
+                     (match (inferior-exception-stack c)
+                            (((_ (files lines columns)) ..1)
+                             (member "guix/repl.scm" files)))
+                     (inferior-exception-arguments c))))
+            (inferior-eval '(throw 'a 'b 'c 'd) inferior)
+            'badness)))
expected-value: (a b c d)
actual-value: (a b c d)
result: PASS

test-name: &inferior-exception, legacy mode
location: /data/src/guix/tests/inferior.scm:93
source:
+ (test-equal
+   "&inferior-exception, legacy mode"
+   '(a b c d)
+   (let ((inferior (open-inferior %top-builddir)))
+     (guard (c ((inferior-exception? c)
+                (close-inferior inferior)
+                (and (eq? inferior (inferior-exception-inferior c))
+                     (inferior-exception-arguments c))))
+            (inferior-eval '(throw 'a 'b 'c 'd) inferior)
+            'badness)))
expected-value: (a b c d)
actual-value: (a b c d)
result: PASS

test-name: inferior-packages
location: /data/src/guix/tests/inferior.scm:105
source:
+ (test-equal
+   "inferior-packages"
+   (take (sort (fold-packages
+                 (lambda (package lst)
+                   (cons (list (package-name package)
+                               (package-version package)
+                               (package-home-page package)
+                               (package-location package))
+                         lst))
+                 '())
+               (lambda (x y) (string<? (car x) (car y))))
+         10)
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (packages (inferior-packages inferior)))
+     (and (every string?
+                 (map inferior-package-synopsis packages))
+          (let ()
+            (define result
+              (take (sort (map (lambda (package)
+                                 (list (inferior-package-name package)
+                                       (inferior-package-version package)
+                                       (inferior-package-home-page package)
+                                       (inferior-package-location package)))
+                               packages)
+                          (lambda (x y) (string<? (car x) (car y))))
+                    10))
+            (close-inferior inferior)
+            result))))
expected-value: (("0ad" "0.0.25b-alpha" "https://play0ad.com" #<<location> file: "gnu/packages/games.scm" line: 6666 column: 2>) ("0ad-data" "0.0.25b-alpha" "https://play0ad.com" #<<location> file: "gnu/packages/games.scm" line: 6619 column: 2>) ("0xffff" "0.9" "https://github.com/pali/0xFFFF" #<<location> file: "gnu/packages/flashing-tools.scm" line: 106 column: 2>) ("389-ds-base" "1.4.4.17" "https://directory.fedoraproject.org" #<<location> file: "gnu/packages/openldap.scm" line: 245 column: 2>) ("4dtris" "0.4.3" "https://launchpad.net/4dtris/" #<<location> file: "gnu/packages/games.scm" line: 8713 column: 2>) ("4store" "1.1.6" "https://github.com/4store/4store" #<<location> file: "gnu/packages/databases.scm" line: 180 column: 2>) ("4ti2" "1.6.9" "http://www.4ti2.de/" #<<location> file: "gnu/packages/maths.scm" line: 692 column: 2>) ("7kaa" "2.15.4p1" "https://7kfans.com/" #<<location> file: "gnu/packages/games.scm" line: 12089 column: 2>) ("a2jmidid" "9" "https://github.com/jackaudio/a2jmidid" #<<location> file: "gnu/packages/music.scm" line: 6746 column: 2>) ("a2ps" "4.14" "https://www.gnu.org/software/a2ps/" #<<location> file: "gnu/packages/pretty-print.scm" line: 51 column: 2>))
actual-value: (("0ad" "0.0.25b-alpha" "https://play0ad.com" #<<location> file: "gnu/packages/games.scm" line: 6666 column: 2>) ("0ad-data" "0.0.25b-alpha" "https://play0ad.com" #<<location> file: "gnu/packages/games.scm" line: 6619 column: 2>) ("0xffff" "0.9" "https://github.com/pali/0xFFFF" #<<location> file: "gnu/packages/flashing-tools.scm" line: 106 column: 2>) ("389-ds-base" "1.4.4.17" "https://directory.fedoraproject.org" #<<location> file: "gnu/packages/openldap.scm" line: 245 column: 2>) ("4dtris" "0.4.3" "https://launchpad.net/4dtris/" #<<location> file: "gnu/packages/games.scm" line: 8713 column: 2>) ("4store" "1.1.6" "https://github.com/4store/4store" #<<location> file: "gnu/packages/databases.scm" line: 180 column: 2>) ("4ti2" "1.6.9" "http://www.4ti2.de/" #<<location> file: "gnu/packages/maths.scm" line: 692 column: 2>) ("7kaa" "2.15.4p1" "https://7kfans.com/" #<<location> file: "gnu/packages/games.scm" line: 12089 column: 2>) ("a2jmidid" "9" "https://github.com/jackaudio/a2jmidid" #<<location> file: "gnu/packages/music.scm" line: 6746 column: 2>) ("a2ps" "4.14" "https://www.gnu.org/software/a2ps/" #<<location> file: "gnu/packages/pretty-print.scm" line: 51 column: 2>))
result: PASS

test-name: inferior-available-packages
location: /data/src/guix/tests/inferior.scm:134
source:
+ (test-equal
+   "inferior-available-packages"
+   (take (sort (fold-available-packages
+                 (lambda* (name
+                           version
+                           result
+                           #:key
+                           supported?
+                           deprecated?
+                           #:allow-other-keys)
+                   (if (and supported? (not deprecated?))
+                     (alist-cons name version result)
+                     result))
+                 '())
+               (lambda (x y) (string<? (car x) (car y))))
+         10)
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (packages (inferior-available-packages inferior)))
+     (close-inferior inferior)
+     (take (sort packages
+                 (lambda (x y) (string<? (car x) (car y))))
+           10)))
expected-value: (("0ad" . "0.0.25b-alpha") ("0ad-data" . "0.0.25b-alpha") ("0xffff" . "0.9") ("389-ds-base" . "1.4.4.17") ("4dtris" . "0.4.3") ("4store" . "1.1.6") ("4ti2" . "1.6.9") ("7kaa" . "2.15.4p1") ("a2jmidid" . "9") ("a2ps" . "4.14"))
actual-value: (("0ad" . "0.0.25b-alpha") ("0ad-data" . "0.0.25b-alpha") ("0xffff" . "0.9") ("389-ds-base" . "1.4.4.17") ("4dtris" . "0.4.3") ("4store" . "1.1.6") ("4ti2" . "1.6.9") ("7kaa" . "2.15.4p1") ("a2jmidid" . "9") ("a2ps" . "4.14"))
result: PASS

test-name: lookup-inferior-packages
location: /data/src/guix/tests/inferior.scm:154
source:
+ (test-equal
+   "lookup-inferior-packages"
+   (let ((->list
+           (lambda (package)
+             (list (package-name package)
+                   (package-version package)
+                   (package-location package)))))
+     (list (map ->list (find-packages-by-name "guile" #f))
+           (map ->list
+                (find-packages-by-name "guile" "2.2"))))
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (->list
+            (lambda (package)
+              (list (inferior-package-name package)
+                    (inferior-package-version package)
+                    (inferior-package-location package))))
+          (lst1 (map ->list
+                     (lookup-inferior-packages inferior "guile")))
+          (lst2 (map ->list
+                     (lookup-inferior-packages inferior "guile" "2.2"))))
+     (close-inferior inferior)
+     (list lst1 lst2)))
expected-value: ((("guile" "3.0.8" #<<location> file: "gnu/packages/guile.scm" line: 392 column: 2>) ("guile" "3.0.7" #<<location> file: "gnu/packages/guile.scm" line: 310 column: 2>) ("guile" "2.2.7" #<<location> file: "gnu/packages/guile.scm" line: 250 column: 2>) ("guile" "2.2.4" #<<location> file: "gnu/packages/guile.scm" line: 297 column: 2>) ("guile" "2.0.14" #<<location> file: "gnu/packages/guile.scm" line: 147 column: 2>) ("guile" "1.8.8" #<<location> file: "gnu/packages/guile.scm" line: 76 column: 2>)) (("guile" "2.2.7" #<<location> file: "gnu/packages/guile.scm" line: 250 column: 2>) ("guile" "2.2.4" #<<location> file: "gnu/packages/guile.scm" line: 297 column: 2>)))
actual-value: ((("guile" "3.0.8" #<<location> file: "gnu/packages/guile.scm" line: 392 column: 2>) ("guile" "3.0.7" #<<location> file: "gnu/packages/guile.scm" line: 310 column: 2>) ("guile" "2.2.7" #<<location> file: "gnu/packages/guile.scm" line: 250 column: 2>) ("guile" "2.2.4" #<<location> file: "gnu/packages/guile.scm" line: 297 column: 2>) ("guile" "2.0.14" #<<location> file: "gnu/packages/guile.scm" line: 147 column: 2>) ("guile" "1.8.8" #<<location> file: "gnu/packages/guile.scm" line: 76 column: 2>)) (("guile" "2.2.7" #<<location> file: "gnu/packages/guile.scm" line: 250 column: 2>) ("guile" "2.2.4" #<<location> file: "gnu/packages/guile.scm" line: 297 column: 2>)))
result: PASS

test-name: lookup-inferior-packages and eq?-ness
location: /data/src/guix/tests/inferior.scm:175
source:
+ (test-assert
+   "lookup-inferior-packages and eq?-ness"
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (lst1 (lookup-inferior-packages inferior "guile"))
+          (lst2 (lookup-inferior-packages inferior "guile")))
+     (close-inferior inferior)
+     (every eq? lst1 lst2)))
actual-value: #t
result: PASS

test-name: inferior-package-inputs
location: /data/src/guix/tests/inferior.scm:183
source:
+ (test-equal
+   "inferior-package-inputs"
+   (let ((->list
+           (match-lambda
+             ((label (? package? package) . rest)
+              `(,label
+                (package
+                  ,(package-name package)
+                  ,(package-version package)
+                  ,(package-location package))
+                ,@rest)))))
+     (list (map ->list (package-inputs guile-3.0-latest))
+           (map ->list
+                (package-native-inputs guile-3.0-latest))
+           (map ->list
+                (package-propagated-inputs guile-3.0-latest))))
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (guile (first (lookup-inferior-packages inferior "guile")))
+          (->list
+            (match-lambda
+              ((label (? inferior-package? package) . rest)
+               `(,label
+                 (package
+                   ,(inferior-package-name package)
+                   ,(inferior-package-version package)
+                   ,(inferior-package-location package))
+                 ,@rest))))
+          (result
+            (list (map ->list (inferior-package-inputs guile))
+                  (map ->list
+                       (inferior-package-native-inputs guile))
+                  (map ->list
+                       (inferior-package-propagated-inputs guile)))))
+     (close-inferior inferior)
+     result))
expected-value: ((("libffi" (package "libffi" "3.3" #<<location> file: "gnu/packages/libffi.scm" line: 44 column: 2>)) ("bash" (package "bash-minimal" "5.1.8" #<<location> file: "gnu/packages/bash.scm" line: 215 column: 2>))) (("pkgconfig" (package "pkg-config" "0.29.2" #<<location> file: "gnu/packages/pkg-config.scm" line: 36 column: 2>))) (("libunistring" (package "libunistring" "0.9.10" #<<location> file: "gnu/packages/libunistring.scm" line: 35 column: 2>)) ("bdw-gc" (package "libgc" "8.0.4" #<<location> file: "gnu/packages/bdw-gc.scm" line: 33 column: 2>))))
actual-value: ((("libffi" (package "libffi" "3.3" #<<location> file: "gnu/packages/libffi.scm" line: 44 column: 2>)) ("bash" (package "bash-minimal" "5.1.8" #<<location> file: "gnu/packages/bash.scm" line: 215 column: 2>))) (("pkgconfig" (package "pkg-config" "0.29.2" #<<location> file: "gnu/packages/pkg-config.scm" line: 36 column: 2>))) (("libunistring" (package "libunistring" "0.9.10" #<<location> file: "gnu/packages/libunistring.scm" line: 35 column: 2>)) ("bdw-gc" (package "libgc" "8.0.4" #<<location> file: "gnu/packages/bdw-gc.scm" line: 33 column: 2>))))
result: PASS

test-name: inferior-package-search-paths
location: /data/src/guix/tests/inferior.scm:213
source:
+ (test-equal
+   "inferior-package-search-paths"
+   (package-native-search-paths guile-3.0)
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (guile (first (lookup-inferior-packages inferior "guile")))
+          (result
+            (inferior-package-native-search-paths guile)))
+     (close-inferior inferior)
+     result))
expected-value: (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>)
actual-value: (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>)
result: PASS

test-name: inferior-eval-with-store
location: /data/src/guix/tests/inferior.scm:222
source:
+ (test-equal
+   "inferior-eval-with-store"
+   (add-text-to-store %store "foo" "Hello, world!")
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix")))
+     (inferior-eval-with-store
+       inferior
+       %store
+       '(lambda (store)
+          (add-text-to-store store "foo" "Hello, world!")))))
expected-value: "/data/src/guix/test-tmp/store/4583q1sfgrllsgxh67x5m0l3xmxdajm7-foo"
actual-value: "/data/src/guix/test-tmp/store/4583q1sfgrllsgxh67x5m0l3xmxdajm7-foo"
result: PASS

test-name: inferior-eval-with-store, &store-protocol-error
location: /data/src/guix/tests/inferior.scm:231
source:
+ (test-assert
+   "inferior-eval-with-store, &store-protocol-error"
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix")))
+     (guard (c ((store-protocol-error? c)
+                (string-contains
+                  (store-protocol-error-message c)
+                  "invalid character")))
+            (inferior-eval-with-store
+              inferior
+              %store
+              '(lambda (store)
+                 (add-text-to-store store "we|rd/?!@" "uh uh")))
+            #f)))
actual-value: 0
result: PASS

test-name: inferior-eval-with-store, exception
location: /data/src/guix/tests/inferior.scm:243
source:
+ (test-equal
+   "inferior-eval-with-store, exception"
+   '(the-answer = 42)
+   (let ((inferior
+           (open-inferior
+             %top-builddir
+             #:command
+             "scripts/guix")))
+     (guard (c ((inferior-exception? c)
+                (close-inferior inferior)
+                (inferior-exception-arguments c)))
+            (inferior-eval-with-store
+              inferior
+              %store
+              '(lambda (store) (throw 'the-answer '= 42))))))
expected-value: (the-answer = 42)
actual-value: (the-answer = 42)
result: PASS

test-name: inferior-eval-with-store, not a procedure
location: /data/src/guix/tests/inferior.scm:254
source:
+ (test-equal
+   "inferior-eval-with-store, not a procedure"
+   'wrong-type-arg
+   (let ((inferior
+           (open-inferior
+             %top-builddir
+             #:command
+             "scripts/guix")))
+     (guard (c ((inferior-exception? c)
+                (close-inferior inferior)
+                (car (inferior-exception-arguments c))))
+            (inferior-eval-with-store
+              inferior
+              %store
+              '(+ 1 2)))))
expected-value: wrong-type-arg
actual-value: wrong-type-arg
result: PASS

test-name: inferior-package-derivation
location: /data/src/guix/tests/inferior.scm:263
source:
+ (test-equal
+   "inferior-package-derivation"
+   (map derivation-file-name
+        (list (package-derivation
+                %store
+                %bootstrap-guile
+                "x86_64-linux")
+              (package-derivation
+                %store
+                %bootstrap-guile
+                "armhf-linux")))
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (packages (inferior-packages inferior))
+          (guile (find (lambda (package)
+                         (string=?
+                           (package-name %bootstrap-guile)
+                           (inferior-package-name package)))
+                       packages)))
+     (map derivation-file-name
+          (list (inferior-package-derivation
+                  %store
+                  guile
+                  "x86_64-linux")
+                (inferior-package-derivation
+                  %store
+                  guile
+                  "armhf-linux")))))
expected-value: ("/data/src/guix/test-tmp/store/lygim61fny1awb72s0xrni55mj6l2f51-guile-bootstrap-2.0.drv" "/data/src/guix/test-tmp/store/iwc444k8qikcqkffnwv9ai90ghigy7ih-guile-bootstrap-2.0.drv")
actual-value: ("/data/src/guix/test-tmp/store/lygim61fny1awb72s0xrni55mj6l2f51-guile-bootstrap-2.0.drv" "/data/src/guix/test-tmp/store/iwc444k8qikcqkffnwv9ai90ghigy7ih-guile-bootstrap-2.0.drv")
result: PASS

test-name: inferior-package-replacement
location: /data/src/guix/tests/inferior.scm:281
source:
+ (test-equal
+   "inferior-package-replacement"
+   (package-derivation
+     %store
+     (package-replacement sqlite)
+     "x86_64-linux")
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (packages (inferior-packages inferior)))
+     (match (lookup-inferior-packages
+              inferior
+              (package-name sqlite)
+              (package-version sqlite))
+            ((inferior-sqlite rest ...)
+             (inferior-package-derivation
+               %store
+               (inferior-package-replacement inferior-sqlite)
+               "x86_64-linux")))))
result: SKIP

test-name: inferior-package->manifest-entry
location: /data/src/guix/tests/inferior.scm:297
source:
+ (test-equal
+   "inferior-package->manifest-entry"
+   (manifest-entry->list
+     (package->manifest-entry
+       (first (find-best-packages-by-name "guile" #f))))
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (guile (first (lookup-inferior-packages inferior "guile")))
+          (entry (inferior-package->manifest-entry guile)))
+     (close-inferior inferior)
+     (manifest-entry->list entry)))
expected-value: ("guile" "3.0.8" "out" (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "0.9.10" "out" () ()) ("libgc" "8.0.4" "out" () ())))
actual-value: ("guile" "3.0.8" "out" (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "0.9.10" "out" () ()) ("libgc" "8.0.4" "out" () ())))
result: PASS

test-name: packages->manifest
location: /data/src/guix/tests/inferior.scm:307
source:
+ (test-equal
+   "packages->manifest"
+   (map manifest-entry->list
+        (manifest-entries
+          (packages->manifest
+            (find-best-packages-by-name "guile" #f))))
+   (let* ((inferior
+            (open-inferior
+              %top-builddir
+              #:command
+              "scripts/guix"))
+          (guile (first (lookup-inferior-packages inferior "guile")))
+          (manifest (packages->manifest (list guile))))
+     (close-inferior inferior)
+     (map manifest-entry->list
+          (manifest-entries manifest))))
expected-value: (("guile" "3.0.8" "out" (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "0.9.10" "out" () ()) ("libgc" "8.0.4" "out" () ()))))
actual-value: (("guile" "3.0.8" "out" (#<<search-path-specification> variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #<<search-path-specification> variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "0.9.10" "out" () ()) ("libgc" "8.0.4" "out" () ()))))
result: PASS


SKIP: tests/pypi
================

test-name: guix-package->pypi-name, old URL style
location: /data/src/guix/tests/pypi.scm:137
source:
+ (test-equal
+   "guix-package->pypi-name, old URL style"
+   "psutil"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri "https://pypi.org/packages/source/p/psutil/psutil-4.3.0.tar.gz"))))))
expected-value: "psutil"
actual-value: "psutil"
result: PASS

test-name: guix-package->pypi-name, new URL style
location: /data/src/guix/tests/pypi.scm:145
source:
+ (test-equal
+   "guix-package->pypi-name, new URL style"
+   "certbot"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri "https://pypi.org/packages/a2/3b/4756e6a0ceb14e084042a2a65c615d68d25621c6fd446d0fc10d14c4ce7d/certbot-0.8.1.tar.gz"))))))
expected-value: "certbot"
actual-value: "certbot"
result: PASS

test-name: guix-package->pypi-name, several URLs
location: /data/src/guix/tests/pypi.scm:153
source:
+ (test-equal
+   "guix-package->pypi-name, several URLs"
+   "cram"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri (list "https://bitheap.org/cram/cram-0.7.tar.gz"
+                      (pypi-uri "cram" "0.7"))))))))
expected-value: "cram"
actual-value: "cram"
result: PASS

test-name: guix-package->pypi-name, honor 'upstream-name'
location: /data/src/guix/tests/pypi.scm:162
source:
+ (test-equal
+   "guix-package->pypi-name, honor 'upstream-name'"
+   "bar-3"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (properties '((upstream-name . "bar-3"))))))
expected-value: "bar-3"
actual-value: "bar-3"
result: PASS

test-name: specification->requirement-name
location: /data/src/guix/tests/pypi.scm:169
source:
+ (test-equal
+   "specification->requirement-name"
+   '("Fizzy"
+     "PickyThing"
+     "SomethingWithMarker"
+     "requests"
+     "pip")
+   (map specification->requirement-name
+        test-specifications))
expected-value: ("Fizzy" "PickyThing" "SomethingWithMarker" "requests" "pip")
actual-value: ("Fizzy" "PickyThing" "SomethingWithMarker" "requests" "pip")
result: PASS

test-name: parse-requires.txt
location: /data/src/guix/tests/pypi.scm:173
source:
+ (test-equal
+   "parse-requires.txt"
+   (list '("foo" "bar") '("pytest"))
+   (mock ((ice-9 ports)
+          call-with-input-file
+          call-with-input-string)
+         (parse-requires.txt test-requires.txt)))
expected-value: (("foo" "bar") ("pytest"))
actual-value: (("foo" "bar") ("pytest"))
result: PASS

test-name: parse-requires.txt - Beaker
location: /data/src/guix/tests/pypi.scm:179
source:
+ (test-equal
+   "parse-requires.txt - Beaker"
+   (list '() '("Mock" "coverage"))
+   (mock ((ice-9 ports)
+          call-with-input-file
+          call-with-input-string)
+         (parse-requires.txt test-requires.txt-beaker)))
expected-value: (() ("Mock" "coverage"))
actual-value: (() ("Mock" "coverage"))
result: PASS

test-name: parse-wheel-metadata, with extras
location: /data/src/guix/tests/pypi.scm:185
source:
+ (test-equal
+   "parse-wheel-metadata, with extras"
+   (list '("wrapt" "bar") '("tox" "bumpversion"))
+   (mock ((ice-9 ports)
+          call-with-input-file
+          call-with-input-string)
+         (parse-wheel-metadata test-metadata-with-extras)))
expected-value: (("wrapt" "bar") ("tox" "bumpversion"))
actual-value: (("wrapt" "bar") ("tox" "bumpversion"))
result: PASS

test-name: parse-wheel-metadata, with extras - Jedi
location: /data/src/guix/tests/pypi.scm:191
source:
+ (test-equal
+   "parse-wheel-metadata, with extras - Jedi"
+   (list '("parso") '("pytest"))
+   (mock ((ice-9 ports)
+          call-with-input-file
+          call-with-input-string)
+         (parse-wheel-metadata
+           test-metadata-with-extras-jedi)))
expected-value: (("parso") ("pytest"))
actual-value: (("parso") ("pytest"))
result: PASS

test-name: find-project-url, with numpy
location: /data/src/guix/tests/pypi.scm:197
source:
+ (test-equal
+   "find-project-url, with numpy"
+   "numpy"
+   (find-project-url
+     "numpy"
+     "https://files.pythonhosted.org/packages/0a/c8/a62767a6b374a0dfb02d2a0456e5f56a372cdd1689dbc6ffb6bf1ddedbc0/numpy-1.22.1.zip"))
expected-value: "numpy"
actual-value: "numpy"
result: PASS

test-name: find-project-url, uWSGI
location: /data/src/guix/tests/pypi.scm:203
source:
+ (test-equal
+   "find-project-url, uWSGI"
+   "uwsgi"
+   (find-project-url
+     "uWSGI"
+     "https://files.pythonhosted.org/packages/24/fd/93851e4a076719199868d4c918cc93a52742e68370188c1c570a6e42a54f/uwsgi-2.0.20.tar.gz"))
expected-value: "uwsgi"
actual-value: "uwsgi"
result: PASS

test-name: find-project-url, flake8-array-spacing
location: /data/src/guix/tests/pypi.scm:209
source:
+ (test-equal
+   "find-project-url, flake8-array-spacing"
+   "flake8_array_spacing"
+   (find-project-url
+     "flake8-array-spacing"
+     "https://files.pythonhosted.org/packages/a4/21/ff29b901128b681b7de7a2787b3aeb3e1f3cba4a8c0cffa9712cbff016bc/flake8_array_spacing-0.2.0.tar.gz"))
expected-value: "flake8_array_spacing"
actual-value: "flake8_array_spacing"
result: PASS

test-name: find-project-url, foo/goo
location: /data/src/guix/tests/pypi.scm:215
source:
+ (test-equal
+   "find-project-url, foo/goo"
+   "foo"
+   (find-project-url
+     "foo"
+     "https://files.pythonhosted.org/packages/f0/f00/goo-0.0.0.tar.gz"))
expected-value: "foo"
actual-value: "foo"
result: PASS

test-name: pypi->guix-package, no wheel
location: /data/src/guix/tests/pypi.scm:221
source:
+ (test-assert
+   "pypi->guix-package, no wheel"
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-1.0.0.tar.gz"
+                    (begin
+                      (mkdir-p "foo-1.0.0/src/bizarre.egg-info")
+                      (with-output-to-file
+                        "foo-1.0.0/src/bizarre.egg-info/requires.txt"
+                        (lambda () (display test-requires.txt)))
+                      (parameterize
+                        ((current-output-port (%make-void-port "rw+")))
+                        (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 . rest)
+                  (match url
+                         ("https://pypi.org/pypi/foo/json"
+                          (values
+                            (open-input-string test-json-1)
+                            (string-length test-json-1)))
+                         ("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 ('pypi-uri "foo" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('build-system 'python-build-system)
+                        ('propagated-inputs
+                         ('list 'python-bar 'python-foo))
+                        ('native-inputs ('list 'python-pytest))
+                        ('home-page "http://example.com")
+                        ('synopsis "summary")
+                        ('description "summary")
+                        ('license 'license:lgpl2.0))
+                       (and (string=?
+                              (bytevector->nix-base32-string test-source-hash)
+                              hash)
+                            (equal?
+                              (pypi->guix-package "foo" #:version "1.0.0")
+                              (pypi->guix-package "foo"))
+                            (guard (c ((error? c) #t))
+                                   (pypi->guix-package
+                                     "foo"
+                                     #:version
+                                     "42"))))
+                      (x (pk 'fail x #f))))))
actual-value: #t
result: PASS

test-name: pypi->guix-package, wheels
location: /data/src/guix/tests/pypi.scm:276
source:
+ (test-assert
+   "pypi->guix-package, wheels"
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-1.0.0.tar.gz"
+                    (begin
+                      (mkdir-p "foo-1.0.0/foo.egg-info/")
+                      (with-output-to-file
+                        "foo-1.0.0/foo.egg-info/requires.txt"
+                        (lambda ()
+                          (display
+                            "wrong data to make sure we're testing wheels ")))
+                      (parameterize
+                        ((current-output-port (%make-void-port "rw+")))
+                        (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"
+                    (begin
+                      (mkdir "foo-1.0.0.dist-info")
+                      (with-output-to-file
+                        "foo-1.0.0.dist-info/METADATA"
+                        (lambda () (display test-metadata)))
+                      (let ((zip-file (string-append file-name ".zip")))
+                        (system*
+                          "zip"
+                          "-q"
+                          zip-file
+                          "foo-1.0.0.dist-info/METADATA")
+                        (rename-file zip-file file-name))
+                      (delete-file-recursively "foo-1.0.0.dist-info")))
+                   (_ (error "Unexpected URL: " url)))))
+         (mock ((guix http-client)
+                http-fetch
+                (lambda (url . rest)
+                  (match url
+                         ("https://pypi.org/pypi/foo/json"
+                          (values
+                            (open-input-string test-json-1)
+                            (string-length test-json-1)))
+                         ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                          #f)
+                         (_ (error "Unexpected URL: " url)))))
+               (invalidate-memoization! pypi->guix-package)
+               (match (pypi->guix-package "foo")
+                      (('package
+                        ('name "python-foo")
+                        ('version "1.0.0")
+                        ('source
+                         ('origin
+                          ('method 'url-fetch)
+                          ('uri ('pypi-uri "foo" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('build-system 'python-build-system)
+                        ('propagated-inputs
+                         ('list 'python-bar 'python-baz))
+                        ('native-inputs ('list 'python-pytest))
+                        ('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))))))
result: SKIP

test-name: pypi->guix-package, no usable requirement file.
location: /data/src/guix/tests/pypi.scm:339
source:
+ (test-assert
+   "pypi->guix-package, no usable requirement file."
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-1.0.0.tar.gz"
+                    (mkdir-p "foo-1.0.0/foo.egg-info/")
+                    (parameterize
+                      ((current-output-port (%make-void-port "rw+")))
+                      (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 . rest)
+                  (match url
+                         ("https://pypi.org/pypi/foo/json"
+                          (values
+                            (open-input-string test-json-1)
+                            (string-length test-json-1)))
+                         ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                          #f)
+                         (_ (error "Unexpected URL: " url)))))
+               (invalidate-memoization! pypi->guix-package)
+               (match (pypi->guix-package "foo")
+                      (('package
+                        ('name "python-foo")
+                        ('version "1.0.0")
+                        ('source
+                         ('origin
+                          ('method 'url-fetch)
+                          ('uri ('pypi-uri "foo" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('build-system 'python-build-system)
+                        ('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))))))
actual-value: #t
result: PASS

test-name: pypi->guix-package, package name contains "-" followed by digits
location: /data/src/guix/tests/pypi.scm:385
source:
+ (test-assert
+   "pypi->guix-package, package name contains \"-\" followed by digits"
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-99-1.0.0.tar.gz"
+                    (begin
+                      (mkdir-p "foo-99-1.0.0/src/bizarre.egg-info")
+                      (with-output-to-file
+                        "foo-99-1.0.0/src/bizarre.egg-info/requires.txt"
+                        (lambda () (display test-requires.txt)))
+                      (parameterize
+                        ((current-output-port (%make-void-port "rw+")))
+                        (system* "tar" "czvf" file-name "foo-99-1.0.0/"))
+                      (delete-file-recursively "foo-99-1.0.0")
+                      (set! test-source-hash
+                        (call-with-input-file file-name port-sha256))))
+                   ("https://example.com/foo-99-1.0.0-py2.py3-none-any.whl"
+                    #f)
+                   (_ (error "Unexpected URL: " url)))))
+         (mock ((guix http-client)
+                http-fetch
+                (lambda (url . rest)
+                  (match url
+                         ("https://pypi.org/pypi/foo-99/json"
+                          (values
+                            (open-input-string test-json-2)
+                            (string-length test-json-2)))
+                         ("https://example.com/foo-99-1.0.0-py2.py3-none-any.whl"
+                          #f)
+                         (_ (error "Unexpected URL: " url)))))
+               (match (pypi->guix-package "foo-99")
+                      (('package
+                        ('name "python-foo-99")
+                        ('version "1.0.0")
+                        ('source
+                         ('origin
+                          ('method 'url-fetch)
+                          ('uri ('pypi-uri "foo-99" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('properties
+                         ('quote (("upstream-name" . "foo-99"))))
+                        ('build-system 'python-build-system)
+                        ('propagated-inputs
+                         ('list 'python-bar 'python-foo))
+                        ('native-inputs ('list 'python-pytest))
+                        ('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))))))
actual-value: #t
result: PASS

warning: project name foo does not appear verbatim in the PyPI URI
hint: The PyPI URI is:
`https://files.pythonhosted.org/packages/f0/f00/goo-0.0.0.tar.gz'.  You
should review the pypi-uri declaration in the generated package.  You may
need to replace "foo" with a substring of the PyPI URI that identifies the
package.

warning: Cannot guess requirements from source archive: no requires.txt file found.

RUN: tests/services/configuration
=================================

test-name: default value, no serialization
location: /data/src/guix/tests/services/configuration.scm:39
source:
+ (test-equal
+   "default value, no serialization"
+   80
+   (port-configuration-port (port-configuration)))
expected-value: 80
actual-value: 80
result: PASS

test-name: default value, custom serializer
location: /data/src/guix/tests/services/configuration.scm:46
source:
+ (test-equal
+   "default value, custom serializer"
+   80
+   (port-configuration-cs-port
+     (port-configuration-cs)))
expected-value: 80
actual-value: 80
result: PASS

test-name: no default value, provided
location: /data/src/guix/tests/services/configuration.scm:54
source:
+ (test-equal
+   "no default value, provided"
+   55
+   (port-configuration-ndv-port
+     (port-configuration-ndv (port 55))))
expected-value: 55
actual-value: 55
result: PASS

test-name: no default value, not provided
location: /data/src/guix/tests/services/configuration.scm:59
source:
+ (test-assert
+   "no default value, not provided"
+   (guard (c ((configuration-error? c) #t))
+          (port-configuration-ndv-port
+            (port-configuration-ndv))))
actual-value: #t
result: PASS

test-name: serialize-configuration
location: /data/src/guix/tests/services/configuration.scm:70
source:
+ (test-assert
+   "serialize-configuration"
+   (gexp? (let ((config (serializable-configuration)))
+            (serialize-configuration
+              config
+              serializable-configuration-fields))))
actual-value: #t
result: PASS

test-name: serialize-configuration with no-serialization
location: /data/src/guix/tests/services/configuration.scm:79
source:
+ (test-assert
+   "serialize-configuration with no-serialization"
+   (not (false-if-exception
+          (let ((config (serializable-configuration)))
+            (serialize-configuration
+              config
+              serializable-configuration-fields)))))
actual-value: #t
result: PASS

test-name: serialize-configuration with prefix
location: /data/src/guix/tests/services/configuration.scm:92
source:
+ (test-assert
+   "serialize-configuration with prefix"
+   (gexp? (let ((config (configuration-with-prefix)))
+            (serialize-configuration
+              config
+              configuration-with-prefix-fields))))
actual-value: #t
result: PASS

test-name: maybe value serialization
location: /data/src/guix/tests/services/configuration.scm:109
source:
+ (test-equal
+   "maybe value serialization"
+   "port=80"
+   (serialize-maybe-number "port" 80))
expected-value: "port=80"
actual-value: "port=80"
result: PASS

test-name: maybe value without serialization no procedure bound
location: /data/src/guix/tests/services/configuration.scm:119
source:
+ (test-assert
+   "maybe value without serialization no procedure bound"
+   (not (defined? 'serialize-maybe-string)))
actual-value: #t
result: PASS


SKIP: tests/upstream
====================

test-name: coalesce-sources same version
location: /data/src/guix/tests/upstream.scm:38
source:
+ (test-equal
+   "coalesce-sources same version"
+   (list (upstream-source
+           (package "foo")
+           (version "1")
+           (urls '("ftp://example.org/foo-1.tar.xz"
+                   "ftp://example.org/foo-1.tar.gz"))
+           (signature-urls
+             '("ftp://example.org/foo-1.tar.xz.sig"
+               "ftp://example.org/foo-1.tar.gz.sig"))))
+   (coalesce-sources
+     (list (upstream-source
+             (package "foo")
+             (version "1")
+             (urls '("ftp://example.org/foo-1.tar.gz"))
+             (signature-urls
+               '("ftp://example.org/foo-1.tar.gz.sig")))
+           (upstream-source
+             (package "foo")
+             (version "1")
+             (urls '("ftp://example.org/foo-1.tar.xz"))
+             (signature-urls
+               '("ftp://example.org/foo-1.tar.xz.sig"))))))
result: SKIP

test-name: changed-inputs returns no changes
location: /data/src/guix/tests/upstream.scm:105
source:
+ (test-equal
+   "changed-inputs returns no changes"
+   '()
+   (changed-inputs test-package test-package-sexp))
expected-value: ()
actual-value: ()
result: PASS

test-name: changed-inputs returns changes to labelled input list
location: /data/src/guix/tests/upstream.scm:109
source:
+ (test-assert
+   "changed-inputs returns changes to labelled input list"
+   (let ((changes
+           (changed-inputs
+             (package
+               (inherit test-package)
+               (inputs `(("hello" ,hello) ("sed" ,sed))))
+             test-package-sexp)))
+     (match changes
+            (((? upstream-input-change? item))
+             (and (equal?
+                    (upstream-input-change-type item)
+                    'regular)
+                  (equal?
+                    (upstream-input-change-action item)
+                    'remove)
+                  (string=?
+                    (upstream-input-change-name item)
+                    "sed")))
+            (else (pk else #f)))))
actual-value: #t
result: PASS

test-name: changed-inputs returns changes to all labelled input lists
location: /data/src/guix/tests/upstream.scm:127
source:
+ (test-assert
+   "changed-inputs returns changes to all labelled input lists"
+   (let ((changes
+           (changed-inputs
+             (package
+               (inherit test-package)
+               (inputs '())
+               (native-inputs '())
+               (propagated-inputs '()))
+             test-package-sexp)))
+     (match changes
+            (((? upstream-input-change? items) ...)
+             (and (equal?
+                    (map upstream-input-change-type items)
+                    '(regular native native propagated))
+                  (equal?
+                    (map upstream-input-change-action items)
+                    '(add add add add))
+                  (equal?
+                    (map upstream-input-change-name items)
+                    '("hello" "sed" "tar" "grep"))))
+            (else (pk else #f)))))
actual-value: #t
result: PASS

test-name: changed-inputs returns changes to plain input list
location: /data/src/guix/tests/upstream.scm:178
source:
+ (test-assert
+   "changed-inputs returns changes to plain input list"
+   (let ((changes
+           (changed-inputs
+             (package
+               (inherit test-new-package)
+               (inputs (list hello sed)))
+             test-new-package-sexp)))
+     (match changes
+            (((? upstream-input-change? item))
+             (and (equal?
+                    (upstream-input-change-type item)
+                    'regular)
+                  (equal?
+                    (upstream-input-change-action item)
+                    'remove)
+                  (string=?
+                    (upstream-input-change-name item)
+                    "sed")))
+            (else (pk else #f)))))
actual-value: #t
result: PASS

test-name: changed-inputs returns changes to all plain input lists
location: /data/src/guix/tests/upstream.scm:195
source:
+ (test-assert
+   "changed-inputs returns changes to all plain input lists"
+   (let ((changes
+           (changed-inputs
+             (package
+               (inherit test-new-package)
+               (inputs '())
+               (native-inputs '())
+               (propagated-inputs '()))
+             test-new-package-sexp)))
+     (match changes
+            (((? upstream-input-change? items) ...)
+             (and (equal?
+                    (map upstream-input-change-type items)
+                    '(regular native native propagated))
+                  (equal?
+                    (map upstream-input-change-action items)
+                    '(add add add add))
+                  (equal?
+                    (map upstream-input-change-name items)
+                    '("hello" "sed" "tar" "grep"))))
+            (else (pk else #f)))))
actual-value: #t
result: PASS


RUN: tests/offload
==================

test-name: #f
location: /data/src/guix/tests/offload.scm:55
source:
+ (test-assert
+   (machine-matches?
+     (deprecated-build-machine "i686-linux")
+     (build-requirements (system "i686-linux"))))
actual-value: #t
result: PASS

test-name: #f
location: /data/src/guix/tests/offload.scm:60
source:
+ (test-assert
+   (machine-matches?
+     (new-build-machine '("i686-linux"))
+     (build-requirements (system "i686-linux"))))
actual-value: #t
result: PASS

test-name: #f
location: /data/src/guix/tests/offload.scm:66
source:
+ (test-assert
+   (machine-matches?
+     (new-build-machine
+       '("armhf-linux"
+         "aarch64-linux"
+         "i686-linux"
+         "x86_64-linux"))
+     (build-requirements (system "armhf-linux"))))
actual-value: #t
result: PASS

/data/src/guix/tests/offload.scm:41:2: warning: The 'system' field is deprecated, please use 'systems' instead.


[-- Attachment #3: Type: text/plain, Size: 37 bytes --]

The env was made usign this manifest 

[-- Attachment #4: manifest --]
[-- Type: text/plain, Size: 1207 bytes --]

;; generated from
;; guix environment guix --pure --ad-hoc help2man git strace autoconf automake gettext texinfo graphviz guile-ssh guile-zstd guile-semver guile-lib libgcrypt sqlite gcc-toolchain
;; ./pre-inst-env guix package --export-manifest -p $GUIX_ENVIRONMENT/
;; and edited afterwards.

(specifications->manifest
 (list
  "gcc-toolchain"
  "sqlite"
  "libgcrypt"
  "guile-lib"
  "guile-semver"
  "guile-zstd"
  "guile-ssh"
  "graphviz"
  "texinfo"
  "gettext"
  "automake"
  "autoconf"
  "strace"
  "git"
  "help2man"
  "pkg-config"
  "guile"
  "gnutls"
  "guile-avahi"
  "guile-gcrypt"
  "guile-json"
  "guile-sqlite3"
  "guile-zlib"
  "guile-lzlib"
  "guile-git"
  "autoconf"
  "automake"
  "gettext-minimal"
  "po4a"
  "bzip2"
  "gzip"
  "sqlite"
  "util-linux"
  "disarchive"
  ;; "glibc-utf8-locales"
  "tar"
  "gzip"
  "bzip2"
  "xz"
  "file"
  "diffutils"
  "patch"
  "findutils"
  "gawk"
  "sed"
  "grep"
  "coreutils"
  "make"
  "bash-minimal"
  "ld-wrapper"
  "binutils"
  ;; "gcc"
  "glibc"
  "glibc:static"
  ;; "glibc-utf8-locales"
  "libunistring"
  ;; "libgc"
  "zlib"
  "nettle"
  "libidn2"
  "libtasn1"
  "guile-bytestructures"
  "libgpg-error"
  ;; "linux-libre-headers"
  "gmp"))

[-- Attachment #5: Type: text/plain, Size: 346 bytes --]

I also pulled guix today as well as the guix git repository.
Tell me if you need more details.

Anyway I can already start writing some things in the cookbook. Should I
directly edit doc/guix-cookbok.texi? I have no expereince writing docs
in texinfo, so I’ll try my best. Are there any recommendations or guidelines?

Cheers,

Théo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-26 19:48       ` Théo Maxime Tyburn
  2022-05-27  5:56         ` Giovanni Biscuolo
@ 2022-05-27 11:28         ` Tobias Geerinckx-Rice
  2022-05-27 11:37           ` Tobias Geerinckx-Rice
  2022-05-27 13:56           ` Théo Maxime Tyburn
  1 sibling, 2 replies; 16+ messages in thread
From: Tobias Geerinckx-Rice @ 2022-05-27 11:28 UTC (permalink / raw)
  To: Théo Maxime Tyburn; +Cc: Kaelyn, Giovanni Biscuolo, guix-devel

[-- Attachment #1: Type: text/plain, Size: 779 bytes --]

Hi Théo,

Théo Maxime Tyburn 写道:
> I figured out where the problem came from. I forgot to use the 
> -p option
> while copying the store with cp.

I think this will probably work (I mean—it obviously did, but also 
longer-term).

However, ‘cp -p’ does not preserve everything, including hard 
links.  Applications shouldn't care but you might be surprised at 
how much disc space hard links save on my system:

~ λ du -hs /gnu/store
86G	/gnu/store
~ λ du -hs --count-links /gnu/store
192G	/gnu/store

I was!

‘cp -a’ should preserve hard links but I personally recommend 
using rsync instead, with a paranoid helping of -aHAX flags. 
Unlike cp, it's resumable, which is nice when copying 100s of 
gigabytes.

Kind regards,

T G-R

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 247 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 11:28         ` Tobias Geerinckx-Rice
@ 2022-05-27 11:37           ` Tobias Geerinckx-Rice
  2022-05-27 14:09             ` Théo Maxime Tyburn
  2022-05-27 13:56           ` Théo Maxime Tyburn
  1 sibling, 1 reply; 16+ messages in thread
From: Tobias Geerinckx-Rice @ 2022-05-27 11:37 UTC (permalink / raw)
  Cc: Théo Maxime Tyburn, Kaelyn, Giovanni Biscuolo, guix-devel

[-- Attachment #1: Type: text/plain, Size: 156 bytes --]

I forgot to add:

You can probably reclaim most of that space by deleting the (now 
bogus) /gnu/store/.links directory.  That's safe.

Kind regards,

T G-R

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 247 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 11:08           ` Théo Maxime Tyburn
@ 2022-05-27 12:48             ` Giovanni Biscuolo
  2022-05-27 14:12               ` Théo Maxime Tyburn
  0 siblings, 1 reply; 16+ messages in thread
From: Giovanni Biscuolo @ 2022-05-27 12:48 UTC (permalink / raw)
  To: Théo Maxime Tyburn; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 1363 bytes --]

Hi Théo

Théo Maxime Tyburn <theo.tyburn@gmail.com> writes:

> Hi again,

> I ran into 2 errors when running the tests after running make in
> the repo. One error has to do with crate. I guess there is a dependency
> missing. The other error has to do with channels. Not sure why. 

[...]

Sorry, now I can't help with setting up a Guix development environment,
all I can suggest you is to read the "19 Contrubuting" manual section,
in particular "19.1 Building from Git" and "19.2 Running Guix Before It
Is Installed".

> I also pulled guix today as well as the guix git repository.
> Tell me if you need more details.
>
> Anyway I can already start writing some things in the cookbook. Should I
> directly edit doc/guix-cookbok.texi?

Yes, and propose a patch

> I have no expereince writing docs
> in texinfo, so I’ll try my best. Are there any recommendations or
> guidelines?

The texinfo manual is
https://www.gnu.org/software/texinfo/manual/texinfo/

Anyway if you are still not familiar with texinfo and all pthe
contributing process, please just write the Cookbook session in any
format you like (that I can read with free software) or in plain text, I
can convert it to texinfo and propose a patch

...but please don't hold your breath :-)

Thanks! Gio'

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 849 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 11:28         ` Tobias Geerinckx-Rice
  2022-05-27 11:37           ` Tobias Geerinckx-Rice
@ 2022-05-27 13:56           ` Théo Maxime Tyburn
  1 sibling, 0 replies; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27 13:56 UTC (permalink / raw)
  To: Tobias Geerinckx-Rice; +Cc: Kaelyn, Giovanni Biscuolo, guix-devel

Hi Tobias,

Tobias Geerinckx-Rice <me@tobias.gr> writes:

> However, ‘cp -p’ does not preserve everything, including hard links.
> Applications shouldn't care but you might be surprised at how much
> disc space hard links save on my system:
>
> ~ λ du -hs /gnu/store
> 86G	/gnu/store
> ~ λ du -hs --count-links /gnu/store
> 192G	/gnu/store
>
> I was!

Wow!

> ‘cp -a’ should preserve hard links but I personally recommend using
> rsync instead, with a paranoid helping of -aHAX flags. Unlike cp, it's
> resumable, which is nice when copying 100s of gigabytes.

Yes I wasn’t sure if keeping links could not break something. But I
guess it shouldn’t harm since after mounting everything will have the
same place on the filesystem.

I agree that rsync -aHAX seems a much better option. I would have
resorted to that if things kept breaking with cp. That’s what I meant by
"just using cp is a bit brutal". I wasn’t sure which of
the uncountable options of rsync to use though ^^

> Kind regards,
>
> T G-R

Thanks for the feedback,

Théo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 11:37           ` Tobias Geerinckx-Rice
@ 2022-05-27 14:09             ` Théo Maxime Tyburn
  0 siblings, 0 replies; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27 14:09 UTC (permalink / raw)
  To: Tobias Geerinckx-Rice; +Cc: Kaelyn, Giovanni Biscuolo, guix-devel

Hi Tobias,

Tobias Geerinckx-Rice <me@tobias.gr> writes:
> I forgot to add:
>
> You can probably reclaim most of that space by deleting the (now
> bogus) /gnu/store/.links directory.  That's safe.

Can you elaborate on that? In my case since I used cp without the -a
option all elements of /gnu/store/.links are just hard copies, right?
That’s why it is safe to delete them? Can I force guix to generate the
links again once i removed the directory?

Thanks,

Théo




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 12:48             ` Giovanni Biscuolo
@ 2022-05-27 14:12               ` Théo Maxime Tyburn
  2022-05-27 15:55                 ` Giovanni Biscuolo
  0 siblings, 1 reply; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27 14:12 UTC (permalink / raw)
  To: Giovanni Biscuolo; +Cc: guix-devel

Hi Gio’

[...]

> Sorry, now I can't help with setting up a Guix development environment,
> all I can suggest you is to read the "19 Contrubuting" manual section,
> in particular "19.1 Building from Git" and "19.2 Running Guix Before It
> Is Installed".

No problem. I will post that to guix devel directly.

[...]

> The texinfo manual is
> https://www.gnu.org/software/texinfo/manual/texinfo/
>
> Anyway if you are still not familiar with texinfo and all pthe
> contributing process, please just write the Cookbook session in any
> format you like (that I can read with free software) or in plain text, I
> can convert it to texinfo and propose a patch

I’ll try my best!

> ...but please don't hold your breath :-)

What do you mean? ^^

Thanks,

Théo


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 14:12               ` Théo Maxime Tyburn
@ 2022-05-27 15:55                 ` Giovanni Biscuolo
  2022-05-27 16:37                   ` Théo Maxime Tyburn
  0 siblings, 1 reply; 16+ messages in thread
From: Giovanni Biscuolo @ 2022-05-27 15:55 UTC (permalink / raw)
  To: Théo Maxime Tyburn; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 321 bytes --]

Théo Maxime Tyburn <theo.tyburn@gmail.com> writes:

[...]

> I’ll try my best!

Thank you

>> ...but please don't hold your breath :-)
>
> What do you mean? ^^

Oh sorry, I mean I don't know when I'll succeed in doing what I want :-)

Thanks, Gio'

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 849 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Move /gnu/store to another filesystem
  2022-05-27 15:55                 ` Giovanni Biscuolo
@ 2022-05-27 16:37                   ` Théo Maxime Tyburn
  0 siblings, 0 replies; 16+ messages in thread
From: Théo Maxime Tyburn @ 2022-05-27 16:37 UTC (permalink / raw)
  To: Giovanni Biscuolo; +Cc: guix-devel


Giovanni Biscuolo <g@xelera.eu> writes:

>>> ...but please don't hold your breath :-)
>>
>> What do you mean? ^^
>
> Oh sorry, I mean I don't know when I'll succeed in doing what I want :-)

Ah I get it :) No problem!


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-05-27 16:45 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-25 16:56 Move /gnu/store to another filesystem Théo Maxime Tyburn
2022-05-26 10:28 ` Giovanni Biscuolo
2022-05-26 10:44   ` Théo Maxime Tyburn
2022-05-26 16:24     ` Kaelyn
2022-05-26 19:48       ` Théo Maxime Tyburn
2022-05-27  5:56         ` Giovanni Biscuolo
2022-05-27  9:34           ` Théo Maxime Tyburn
2022-05-27 11:08           ` Théo Maxime Tyburn
2022-05-27 12:48             ` Giovanni Biscuolo
2022-05-27 14:12               ` Théo Maxime Tyburn
2022-05-27 15:55                 ` Giovanni Biscuolo
2022-05-27 16:37                   ` Théo Maxime Tyburn
2022-05-27 11:28         ` Tobias Geerinckx-Rice
2022-05-27 11:37           ` Tobias Geerinckx-Rice
2022-05-27 14:09             ` Théo Maxime Tyburn
2022-05-27 13:56           ` Théo Maxime Tyburn

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).