Ludovic Courtès writes:
Toggle quote (30 lines)
> Hi Alex,>> Alex Sassmannshausen <alex@pompo.co> skribis:>>> Ludovic Courtès writes:>> [...]>>>> I just had a bright idea (yes!): this can be addressed by writing>>> something like this in ~/.config/guix/channels.scm:>>>>>> (map latest-commit-with-substitutes-available>>> %default-channels)>>>>>> The hypothetical ‘latest-commit-with-substitutes-available’ would use>>> (git) and (guix ci) to find the latest commit for which substitutes of>>> interest are available, and would return:>>>>>> (channel>>> ;; …>>> (commit "cabbag3")) ;the ideal commit>>>> This sounds incredibly interesting — and it is testament once again to>> the power of Guix that this kind of solution could be feasible!>> Just to be clear: I don’t think this would be a substitute for a> “stable” branch; rather, I view as a way to have user-defined policies> such as “pull up to the latest commit for which there’s a substitute for> IceCat.”
Ah, I understand now.
So the example you provided is a user-defined policy to install thelatest version of Guix that is downloadable using substitutes (if guixpublish has published those already).
As you say, in a similar vein, the end user could for themselves definea policy that searches for a commit containing a specific successfulbuild, or a set of specific successful builds.
Toggle quote (7 lines)
>> Thinking this through in my head somewhat, I had the following thoughts:>> - This procedure is invoked client side, where the channel is defined>> - That means the git searching is done client side, on every invocation>> of guix (I guess this might be cacheable?)>> On every invocation of ‘guix pull’ only.
That makes sense, and is way better than I feared :-)
Toggle quote (8 lines)
>> I have no idea what the performance cost would be. I guess you would>> use "guix weather" to turn the set of requested packages into a manifest>> which can then be checked with it.>> As I imagine it, the cost would be a few HTTP queries to the Cuirass> API. I should try to come up with an example to better explain what I> had in mind!
Your example helps visualize this, thanks.
Your example depends on there being a jobset that comprises the set ofpackages you are interested in testing.
I imagine it is possible to do the same for an individual package / job.
The situation would be different if the end user wanted to perform asimilar operation for an arbitrary set of packages on their end.
It would probably involve something like this (probably naive):
(define (latest-commit-successfully-built-pkg pkg) "Return the latest commit for the pkg for which substitutes are(potentially) available." ;; Like your version, but magically performs query ;; for pkg, not the guix-modular-master evaluation (let* ((evaluations (latest-evaluations pkg)) (candidates (filter-map (lambda (json) (match (hash-ref json "checkouts") ((checkout) (cons (hash-ref json "id") (hash-ref checkout "commit"))) (_ #f))) evaluations))) (map (match-lambda ((evaluation . commit) (and (evaluation-complete? evaluation) commit))) candidates)))
(any (match-lambda ((evaluation . commit) commit) (apply lset-intersection equal? ;; Like latest-commit-successfully-built, but takes an ;; individual package name for which we return the ;; commit (map latest-commit-successfully-built-pkg %set-of-packages))))
Obviously the larger the set, the more requests are required, and thelower the chance of a commit being available / a downgrade occuring
Toggle quote (15 lines)
>> The question of security updates is tricky at the moment already — I>> would hazard a guess that many people bail out of upgrading when they>> can't get substitutes for their entire profile / system right now, which>> means they are not getting security upgrades for package (a) when a>> substitute for (b) fails.>> That’s probably true, and I agree it’s problematic.>> What I typically do is “guix pull && guix package -n -u”. Then I look> at things that would be built; if, say, LibreOffice is among them, I> wait for a little while and try again later, until I can get enough> substitutes. That usually works okay, but it fails if it turns out that> one of the dependencies fails to build: substitutes never become> available in that case.
Interesting. Do you think this kind of thing might be useful to have inthe Guix manual? Like, in a section about a "typical" desktop end-usermight manage their system day to day?
Alex