Simon Tournier <zimon.touto...@gmail.com> writes:

> Some of us are not always happy with the Guix/Guile error reporting.  As
> discussed at the Guix Days, maybe the best strategy to improve the
> situation is to report small examples that we can work on.  Therefore,
> here one that I have just hit today when working on Julia.
>
> Here a minimalist example.
>
> --8<---------------cut here---------------start------------->8---
> $ guix build -L foo git2cl-bang
> Backtrace:
> In guix/gexp.scm:
>    1218:2 19 (_ #<store-connection 256.100 7fa4a8355eb0>)
>    1085:2 18 (_ _)
>     926:4 17 (_ _)
> In guix/store.scm:
>   2095:12 16 (_ #<store-connection 256.100 7fa4a8355eb0>)
>   1412:11 15 (map/accumulate-builds #<store-connection 256.100 7fa4a8355eb0> 
> #<procedure 7fa4a835cfc0 at guix/store.scm:2096:35 (obj)> _ #:cutoff _)
>    1330:8 14 (call-with-build-handler #<procedure 7fa4a835cf90 at 
> guix/store.scm:1365:2 (continue store things mode)> _)
>   2210:25 13 (run-with-store #<store-connection 256.100 7fa4a8355eb0> 
> #<procedure 7fa4aa99c840 at guix/gexp.scm:931:13 (state)> #:guile-for-build _ 
> # _ # _)
> In guix/gexp.scm:
>    931:13 12 (_ _)
> In guix/store.scm:
>    2038:8 11 (_ _)
> In guix/gexp.scm:
>    300:22 10 (_ _)
> In guix/store.scm:
>   2142:12  9 (_ #<store-connection 256.100 7fa4a8355eb0>)
>   1173:24  8 (_ #<store-connection 256.100 7fa4a8355eb0> "git2cl" #t "sha256" 
> "/tmp/git2cl" #:select? _)
>   1151:14  7 (add-to-store #<store-connection 256.100 7fa4a8355eb0> _ _ 
> "sha256" "/tmp/git2cl" #:select? _)
> In guix/serialization.scm:
>    380:43  6 (dump "/tmp/git2cl")
> In srfi/srfi-1.scm:
>    691:23  5 (filter-map #<procedure 7fa4aa99c2c0 at 
> guix/serialization.scm:322:33 (base)> ("COPYING" "README" "README.html" 
> "git2cl") . _)
> In guix/serialization.scm:
>    325:42  4 (_ "COPYING")
>    325:42  3 (_ "/tmp/git2cl/COPYING")
> In ice-9/boot-9.scm:
>   1685:16  2 (raise-exception _ #:continuable? _)
>   1685:16  1 (raise-exception _ #:continuable? _)
>   1685:16  0 (raise-exception _ #:continuable? _)
>
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> Wrong type to apply: #f
> --8<---------------cut here---------------end--------------->8---
>
> Good luck to guess what’s wrong. :-)
>
> The package definition:
>
> --8<---------------cut here---------------start------------->8---
> (define-module (bar)
>   #:use-module (guix)
>   #:use-module (gnu)
>   #:use-module (guix build-system copy)
>   #:use-module ((guix git-download) #:select (git-predicate))
>   #:use-module (gnu packages version-control))
>
> (define-public git2cl-local-file
>   (package
>     (inherit git2cl)
>     (name "git2cl-bang")
>     (source
>      (local-file "/tmp/git2cl"
>                  #:recursive? #t
>                  #:select? (git-predicate "/tmp/git2cl")
>                  ))))
> --8<---------------cut here---------------end--------------->8---
>
> where /tmp/git2cl is populated with:
>
>         cp -r $(guix build git2cl -S) /tmp/git2cl
>
> And note that the initial origin is from a Git repository, it reads:
>
>       (source (origin
>                 (method git-fetch)
>                 (uri (git-reference
>                       (url "https://git.savannah.nongnu.org/git/git2cl.git";)
>                       (commit commit)))
>                 (file-name (git-file-name name version))
>                 (sha256
>                  (base32
>                   "0wnnbm2sjvfj0qrksj89jlnl69miwl0vk3wrrvgvpclgys3na2g1"))))
>
>
> As always, once you get it, aaaahhh it’s obvious… But Guix has not
> really helped me in finding what was wrong. :-) I found my way with good
> ol’ grep in Guix source code and/or gave a look to (guix gexp); Then I
> had my aaaahhh moment.

I think this is actually an example where Guix is pretty helpful, you
didn't have to fight to get a backtrace, and the backtrace is actually
relevant.

That's more from a internal perspective though, obviously this isn't the
ideal information from a users perspective.

> The mistake is obviously that ’git-predicate’ always returns #f because
> /tmp/git2cl is not a Git repository.
>
> Hum, I’m not sure to understand well enough how ’local-file’ internally
> works to propose an improvement (handle the exception).

So, local-file could check what's passed in as select?, and raise an
exception if it's not a procedure.

That wound't be ideal though, since local-file doesn't know why it's
getting #f and not a procedure, but it's probably still worth doing.

This is the documented behaviour for git-predicate, and that behaviour
is used within Guix (it's called like "(or (git-predicate ...". For this
scenario though, it would help if git-predicate raised an exception,
rather than returning #f. Then it could clearly say that /tmp/git2cl is
not a git repository.

Attachment: signature.asc
Description: PGP signature

Reply via email to