Subject: bug#36378: Guix Cuirass Issue with Input channels

From: [email-masked] (Clément Lassieur)
Date: Sun, 17 Nov 2019 03:38:58 +0100

Hi Reza and Ludo,

Reza Alizadeh Majd <[email-masked]> writes:

> adding additional inputs to cuirass specification with name started
> with `p` letter, fails the evaluation of specification.

Thank you for reporting this!  It actually fails with names that come
after the first input (in this case: "guix") in alphabetical order.

> considering following specification: 
>
> (list 
>   '((#:name . "hello-spec")
>     (#:load-path-inputs . ("guix"))
>     (#:package-path-inputs . ())
>     (#:proc-input ."guix")
>     (#:proc-file . "build-aux/cuirass/gnu-system.scm")
>     (#:proc . cuirass-jobs)
>     (#:proc-args . ((subset . "hello")
> 		    (systems . ("x86_64-linux"))))
>     (#:inputs . (((#:name . "guix")
> 		  (#:url . "git://git.savannah.gnu.org/guix.git")
> 		  (#:load-path . ".")
> 		  (#:branch . "master")
> 		  (#:no-compile? . #t))
> 		 ((#:name . "pkginput")
> 		  (#:url . "git://git.savannah.gnu.org/guix/guix-cuirass.git")
> 		  (#:load-path . ".")
> 		  (#:branch . "master")
> 		  (#:no-compile? . #t))
> 		 ))))

It's because the 'proc' you use (CUIRASS-JOBS, from the Guix
repository), interprets the first input it finds as a Guix checkout.
There's a comment about this[1]:

    ;; Extract metadata about the 'guix' checkout.  Its key in ARGUMENTS may
    ;; vary, so pick up the first one that's neither 'subset' nor 'systems'.

The argument list you sent to 'proc' looked like this:

    '((pkginput
       (no-compile? . #t)
       (load-path . ".")
       (revision . "8bf095fc503ddac18a9457e1379e497ae16324fa")
       (file-name . "/gnu/store/fcq3axxh5kpva6kphi58ibklfz4wnbnr-cuirass-8bf095f"))
      (guix
       (no-compile? . #t)
       (load-path . ".")
       (revision . "3e9ca3358a8cfffaeb4997389bb767065e70876a")
       (file-name . "/gnu/store/5nmsf6464vhdifmvzassp3b3cwfis5j4-guix-3e9ca33"))
      (subset . "hello"))

so the 'proc' thought 'pkginput' was a Guix checkout and tried to build
Guix with a Cuirass source, which obviously doesn't work.  (It fails
line 60 of [1].)

If the input name were "cuirass" instead of "pkginput", you would have
sent:

    '((guix
       (no-compile? . #t)
       (load-path . ".")
       (revision . "3e9ca3358a8cfffaeb4997389bb767065e70876a")
       (file-name . "/gnu/store/5nmsf6464vhdifmvzassp3b3cwfis5j4-guix-3e9ca33"))
      (cuirass
       (no-compile? . #t)
       (load-path . ".")
       (revision . "8bf095fc503ddac18a9457e1379e497ae16324fa")
       (file-name . "/gnu/store/fcq3axxh5kpva6kphi58ibklfz4wnbnr-cuirass-8bf095f"))
      (subset . "hello"))

And it would have worked.

So it's indeed a bug in Guix, introduced by commit
b5f8c2c88543158e8aca76aa98f9009f6b9e743a (hydra: Compute jobs in an
inferior).  We can't just take the first input we find, build it and
open an inferior for it.  I believe we should take the input whose name
is "guix" (as we do with manifests[2]).

What do you think?

Clément

[1]: https://git.savannah.gnu.org/cgit/guix.git/tree/build-aux/hydra/gnu-system.scm#n40
[2]: https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/ci.scm#n361