channels: Dependencies listed in '.guix-channel' can have an introduction.

Suggested by Ricardo Wurmus and Simon Tournier.

* guix/channels.scm (sexp->channel-introduction): New procedure.
(read-channel-metadata): Use it.
(profile-channels)[sexp->channel-introduction]: Remove.
* tests/channels.scm ("latest-channel-instances, authenticate dependency"):
New test.
* doc/guix.texi (Channels)[Declaring Channel Dependencies]: Augment example.
This commit is contained in:
Ludovic Courtès 2020-07-01 23:32:25 +02:00
parent 884df77640
commit d774c7b121
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
3 changed files with 70 additions and 10 deletions

View file

@ -536,4 +536,54 @@
#:keyring-reference-prefix "")
'failed)))))))
(unless (gpg+git-available?) (test-skip 1))
(test-equal "latest-channel-instances, authenticate dependency"
#t
;; Make sure that a channel dependency that has an introduction is
;; authenticated. This test checks that an authentication error is raised
;; as it should when authenticating the dependency.
(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)))))))))
(test-end "channels")