channels: 'latest-channel-instances' doesn't leak internal state.

* guix/channels.scm (latest-channel-instances): Remove
'previous-channels' argument.  Introduce 'loop' and use it.
This commit is contained in:
Ludovic Courtès 2020-05-20 15:55:37 +02:00
parent c098c11be8
commit 9b049de84e
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -231,10 +231,9 @@ (define (dot-git? file stat)
#:select? (negate dot-git?))))
(channel-instance channel commit checkout))))
(define* (latest-channel-instances store channels #:optional (previous-channels '()))
(define* (latest-channel-instances store channels)
"Return a list of channel instances corresponding to the latest checkouts of
CHANNELS and the channels on which they depend. PREVIOUS-CHANNELS is a list
of previously processed channels."
CHANNELS and the channels on which they depend."
;; Only process channels that are unique, or that are more specific than a
;; previous channel specification.
(define (ignore? channel others)
@ -245,38 +244,38 @@ (define (ignore? channel others)
(not (or (channel-commit a)
(channel-commit b))))))))
;; Accumulate a list of instances. A list of processed channels is also
;; accumulated to decide on duplicate channel specifications.
(define-values (resulting-channels instances)
(fold2 (lambda (channel previous-channels instances)
(if (ignore? channel previous-channels)
(values previous-channels instances)
(begin
(format (current-error-port)
(G_ "Updating channel '~a' from Git repository at '~a'...~%")
(channel-name channel)
(channel-url channel))
(let ((instance (latest-channel-instance store channel)))
(let-values (((new-instances new-channels)
(latest-channel-instances
store
(channel-instance-dependencies instance)
previous-channels)))
(values (append (cons channel new-channels)
previous-channels)
(append (cons instance new-instances)
instances)))))))
previous-channels
'() ;instances
channels))
(let loop ((channels channels)
(previous-channels '()))
;; Accumulate a list of instances. A list of processed channels is also
;; accumulated to decide on duplicate channel specifications.
(define-values (resulting-channels instances)
(fold2 (lambda (channel previous-channels instances)
(if (ignore? channel previous-channels)
(values previous-channels instances)
(begin
(format (current-error-port)
(G_ "Updating channel '~a' from Git repository at '~a'...~%")
(channel-name channel)
(channel-url channel))
(let ((instance (latest-channel-instance store channel)))
(let-values (((new-instances new-channels)
(loop (channel-instance-dependencies instance)
previous-channels)))
(values (append (cons channel new-channels)
previous-channels)
(append (cons instance new-instances)
instances)))))))
previous-channels
'() ;instances
channels))
(let ((instance-name (compose channel-name channel-instance-channel)))
;; Remove all earlier channel specifications if they are followed by a
;; more specific one.
(values (delete-duplicates instances
(lambda (a b)
(eq? (instance-name a) (instance-name b))))
resulting-channels)))
(let ((instance-name (compose channel-name channel-instance-channel)))
;; Remove all earlier channel specifications if they are followed by a
;; more specific one.
(values (delete-duplicates instances
(lambda (a b)
(eq? (instance-name a) (instance-name b))))
resulting-channels))))
(define* (checkout->channel-instance checkout
#:key commit