channels: Use 'fold2'.
* guix/channels.scm (latest-channel-instances): Use 'fold2' instead of 'fold'.master
parent
ab6025b52c
commit
f58f676b12
|
@ -26,6 +26,7 @@
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (guix profiles)
|
#:use-module (guix profiles)
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix i18n)
|
#:use-module (guix i18n)
|
||||||
#:use-module ((guix utils)
|
#:use-module ((guix utils)
|
||||||
|
@ -162,44 +163,43 @@ of previously processed channels."
|
||||||
(or (channel-commit b)
|
(or (channel-commit b)
|
||||||
(not (or (channel-commit a)
|
(not (or (channel-commit a)
|
||||||
(channel-commit b))))))))
|
(channel-commit b))))))))
|
||||||
|
|
||||||
;; Accumulate a list of instances. A list of processed channels is also
|
;; Accumulate a list of instances. A list of processed channels is also
|
||||||
;; accumulated to decide on duplicate channel specifications.
|
;; accumulated to decide on duplicate channel specifications.
|
||||||
(match (fold (lambda (channel acc)
|
(define-values (resulting-channels instances)
|
||||||
(match acc
|
(fold2 (lambda (channel previous-channels instances)
|
||||||
((#:channels previous-channels #:instances instances)
|
(if (ignore? channel previous-channels)
|
||||||
(if (ignore? channel previous-channels)
|
(values previous-channels instances)
|
||||||
acc
|
(begin
|
||||||
(begin
|
(format (current-error-port)
|
||||||
(format (current-error-port)
|
(G_ "Updating channel '~a' from Git repository at '~a'...~%")
|
||||||
(G_ "Updating channel '~a' from Git repository at '~a'...~%")
|
(channel-name channel)
|
||||||
(channel-name channel)
|
(channel-url channel))
|
||||||
(channel-url channel))
|
(let-values (((checkout commit)
|
||||||
(let-values (((checkout commit)
|
(latest-repository-commit store (channel-url channel)
|
||||||
(latest-repository-commit store (channel-url channel)
|
#:ref (channel-reference
|
||||||
#:ref (channel-reference
|
channel))))
|
||||||
channel))))
|
(let ((instance (channel-instance channel commit checkout)))
|
||||||
(let ((instance (channel-instance channel commit checkout)))
|
(let-values (((new-instances new-channels)
|
||||||
(let-values (((new-instances new-channels)
|
(latest-channel-instances
|
||||||
(latest-channel-instances
|
store
|
||||||
store
|
(channel-instance-dependencies instance)
|
||||||
(channel-instance-dependencies instance)
|
previous-channels)))
|
||||||
previous-channels)))
|
(values (append (cons channel new-channels)
|
||||||
`(#:channels
|
previous-channels)
|
||||||
,(append (cons channel new-channels)
|
(append (cons instance new-instances)
|
||||||
previous-channels)
|
instances))))))))
|
||||||
#:instances
|
previous-channels
|
||||||
,(append (cons instance new-instances)
|
'() ;instances
|
||||||
instances))))))))))
|
channels))
|
||||||
`(#:channels ,previous-channels #:instances ())
|
|
||||||
channels)
|
(let ((instance-name (compose channel-name channel-instance-channel)))
|
||||||
((#:channels channels #:instances instances)
|
;; Remove all earlier channel specifications if they are followed by a
|
||||||
(let ((instance-name (compose channel-name channel-instance-channel)))
|
;; more specific one.
|
||||||
;; Remove all earlier channel specifications if they are followed by a
|
(values (delete-duplicates instances
|
||||||
;; more specific one.
|
(lambda (a b)
|
||||||
(values (delete-duplicates instances
|
(eq? (instance-name a) (instance-name b))))
|
||||||
(lambda (a b)
|
resulting-channels)))
|
||||||
(eq? (instance-name a) (instance-name b))))
|
|
||||||
channels)))))
|
|
||||||
|
|
||||||
(define* (checkout->channel-instance checkout
|
(define* (checkout->channel-instance checkout
|
||||||
#:key commit
|
#:key commit
|
||||||
|
|
Reference in New Issue