[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Channel dependencies
From: |
Ludovic Courtès |
Subject: |
Re: Channel dependencies |
Date: |
Mon, 15 Oct 2018 11:29:18 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Hello,
Ricardo Wurmus <address@hidden> skribis:
>>> (define (latest-channel-instances store channels)
>>> "Return a list of channel instances corresponding to the latest
>>> checkouts of
>>> -CHANNELS."
>>> - (map (lambda (channel)
>>> - (format (current-error-port)
>>> - (G_ "Updating channel '~a' from Git repository at
>>> '~a'...~%")
>>> - (channel-name channel)
>>> - (channel-url channel))
>>> - (let-values (((checkout commit)
>>> - (latest-repository-commit store (channel-url
>>> channel)
>>> - #:ref (channel-reference
>>> - channel))))
>>> - (channel-instance channel commit checkout)))
>>> - channels))
>>> +CHANNELS and the channels on which they depend."
>>> + (append-map (lambda (channel)
>>> + (format (current-error-port)
>>> + (G_ "Updating channel '~a' from Git repository at
>>> '~a'...~%")
>>> + (channel-name channel)
>>> + (channel-url channel))
>>> + (let-values (((checkout commit)
>>> + (latest-repository-commit store (channel-url
>>> channel)
>>> + #:ref
>>> (channel-reference
>>> + channel))))
>>> + (let ((instance (channel-instance channel commit
>>> checkout)))
>>> + (cons instance (latest-channel-instances
>>> + store
>>> + (channel-instance-dependencies
>>> instance))))))
>>> + channels))
>>
>> What happens if the dependency list contains duplicate channels? This
>> might happen if two unrelated channels mutually depend upon a third
>> channel.
>>
>> What happens if the dependency list contains two channels that differ
>> only in their branch (or commit), and are the same in every other way?
>> This might happen if two unrelated channels mutually depend upon two
>> different versions of the same third channel.
We should error out in this case because at run time, there can be only
one Guile module with a given name. Thus, conflicting dependencies
cannot be honored. (Not like Node.js, for better or worse. ;-))
> I was going to write an email about this just now. This is indeed a
> problem with this naive implementation.
>
> For reproducibility a user may want to pin all channels to a certain
> commit, but channels that are dependencies are exempt from that
> mechanism as they are added to the list of channels to be instantiated
> during the run of “guix pull”.
>
> It should be possible to pin *all* channels, even if they are
> dependencies of other channels. One way is to treat all channels and
> their dependencies as a unique set where duplicates are replaced with
> the most specific description (e.g. those specifying a commit). This
> way users could fully specify dependencies, which would then be used
> instead of the channel’s declared dependency.
Of course it’s easier to pin all channels when they are directly
expressed in ~/.config/guix/channels.scm.
Say, I need channel A, which depends on B.
What we could do is that if B is already in ~/.config/guix/channels.scm,
then we take this particular B; if it’s not there, we take the latest
version.
In terms of the dependency code, it means that dependencies found in
.guix-channels file are added if and only if they are not already
present in the user-provided channel list.
Does that make sense?
Thanks!
Ludo’.
Re: Channel dependencies, Ludovic Courtès, 2018/10/15
Re: Channel dependencies, Ludovic Courtès, 2018/10/22