all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: ludo@gnu.org (Ludovic Courtès)
To: Christopher Baines <mail@cbaines.net>
Cc: guix-devel@gnu.org
Subject: Re: Package input loop detection
Date: Mon, 23 Apr 2018 18:07:55 +0200	[thread overview]
Message-ID: <87muxtykh0.fsf@gnu.org> (raw)
In-Reply-To: <87eflzfkwh.fsf@cbaines.net> (Christopher Baines's message of "Mon, 05 Feb 2018 16:42:22 +0000")

Hi again,

Thanks Ricardo for the reminder.  :-)

Christopher Baines <mail@cbaines.net> skribis:

> I've included a very rough patch which detects and informs the user what
> has happened, this is an example of what this looks like (with a version
> of the wip-rails branch I've broken):
>
>
> $ guix build ruby-rails
>
> error: input loop detected, error generating a derivation for #<package ruby-rails@5.0.0 /home/chris/Projects/Guix/guix-wip-rails/gnu/packages/rails.scm:136 2d9f300>
>
> This shouldn't happen with Guix packages, please consider reporting a bug.
>
> Report bugs to: bug-guix@gnu.org.
> GNU Guix home page: <https://www.gnu.org/software/guix/>
> General help using GNU software: <http://www.gnu.org/gethelp/>
>
> If any of the packages below are not included in Guix, it could be that one of
> them is causing the loop. The packages are listed in reverse order, so the
> first package listed is a input to the second package for example, and the
> start and end of the detected loop is highlighted with an arrow (--->).
>
>  --->	#<package ruby-rspec@3.5.0 gnu/packages/ruby.scm:446 2b82d80>
> 	#<package ruby-thread-order@1.1.0 gnu/packages/ruby.scm:6865 2bcc300>
> 	#<package ruby-rspec-support@3.5.0 gnu/packages/ruby.scm:6822 2bcc3c0>
> 	#<package ruby-rspec-core@3.5.4 gnu/packages/ruby.scm:325 2b6d300>
>  --->	#<package ruby-rspec@3.5.0 gnu/packages/ruby.scm:446 2b82d80>
> 	#<package ruby-concurrent@1.0.5 gnu/packages/ruby.scm:4562 2bb3c00>
> 	#<package ruby-activesupport@5.1.4 gnu/packages/ruby.scm:2794 2ba0900>
> 	#<package ruby-actionview@5.0.0 /home/chris/Projects/Guix/guix-wip-rails/gnu/packages/rails.scm:267 3b619c0>
> 	#<package ruby-actionpack@5.0.0 /home/chris/Projects/Guix/guix-wip-rails/gnu/packages/rails.scm:237 3b61c00>
> 	#<package ruby-actioncable@5.0.0 /home/chris/Projects/Guix/guix-wip-rails/gnu/packages/rails.scm:183 2d9f0c0>
> 	#<package ruby-rails@5.0.0 /home/chris/Projects/Guix/guix-wip-rails/gnu/packages/rails.scm:136 2d9f300>

Neat.

> I'm not particularly fond of the implementation, because the
> package-derivation function is called from expand-input called from
> bag->derivation, the information about the part of the graph that has
> been traversed is passed through each function.
>
> The seen-package-list argument could be removed, but the ordering
> information is really useful when printing out the error message. I
> think it should be still possible to generate this after finding the
> issue by searching through the graph of packages, which would allow
> removing this one argument.

‘set->list’ preserves the order (actually the reverse order, but we
could fix that) of insertion, because it’s just a vhash, and a vhash is
just a list, which has a notion of ordering obviously:

--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> (set->list (setq 'a 'b 'c 'd))
$4 = (d c b a)
scheme@(guile-user)> (set->list (apply set (map list (iota 4))))
$5 = ((3) (2) (1) (0))
scheme@(guile-user)> (set->list (apply set (iota 4)))
$6 = (3 2 1 0)
--8<---------------cut here---------------end--------------->8---

Thus we can get rid of ‘seen-package-list’.

Another comment:

> -(define* (expand-input store package input system #:optional cross-system)
> +(define* (expand-input store package input system #:optional cross-system
> +                       #:key seen-packages seen-package-list)

Maybe s/seen-packages/visited/

(I’m not fond of passing an extra parameter around, but the only way to
avoid it would be to use a state monad, and that in turn would work
better once we’ve finally merged ‘wip-build-systems-gexp’…)

> +  (if (set-contains? seen-packages package)
> +      (begin
> +        (simple-format #t "\nerror: input loop detected, error generating a derivation for ~A\n"
> +                       (last seen-package-list))
> +        (display "
> +This shouldn't happen with Guix packages, please consider reporting a bug.\n")
> +        (show-bug-report-information)
> +        (display "
> +If any of the packages below are not included in Guix, it could be that one of
> +them is causing the loop. The packages are listed in reverse order, so the
> +first package listed is a input to the second package for example, and the
> +start and end of the detected loop is highlighted with an arrow (--->).\n\n")
> +        (for-each (lambda (seen-package)
> +                    (if (eq? package seen-package)
> +                        (display " --->"))
> +                    (simple-format #t "\t~A\n" seen-package))
> +                  (cons package
> +                        seen-package-list))
> +        (exit 1)))

Please just define a condition type and:

  (raise (condition (&package-cycle …)))

with the UI part of it moved to (guix ui) in ‘call-with-error-handling’
with proper i18n.

I think we’d need two more things:

  1. Timing and memory reported by, say:

       time guix build libreoffice certbot pigx -d --no-grafts

     before and after the change.  We should make sure the overhead in
     time and space is minimal.

  2. One or two tests in tests/packages.scm that check whether the
     exception is raised when it should.

Could you look into it, Chris?

Thanks, and apologies for the long delay!

Ludo’.

      parent reply	other threads:[~2018-04-23 16:08 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-05 16:42 Package input loop detection Christopher Baines
2018-02-12 15:30 ` Ricardo Wurmus
2018-02-12 18:48   ` Gábor Boskovits
2018-02-12 19:04   ` Ricardo Wurmus
2018-02-14 13:03   ` Ludovic Courtès
2018-04-18  8:58     ` Ricardo Wurmus
2018-04-23 16:07 ` Ludovic Courtès [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87muxtykh0.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=guix-devel@gnu.org \
    --cc=mail@cbaines.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.