mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05:00
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:
parent
c098c11be8
commit
9b049de84e
1 changed files with 33 additions and 34 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue