~ruther/guix-local

3b80b81358b3861ca3794105c8eb4395df97846b — Ludovic Courtès 8 years ago 8bc1935
ui: Display hints to resolve profile collisions.

Fixes <https://bugs.gnu.org/29255>.
Reported by Ben Sturmfels <ben@sturm.com.au>.

* guix/ui.scm (display-collision-resolution-hint): New procedure.
(call-with-error-handling): Call it upon '&profile-collistion-error'.
1 files changed, 21 insertions(+), 0 deletions(-)

M guix/ui.scm
M guix/ui.scm => guix/ui.scm +21 -0
@@ 502,6 502,26 @@ interpreted."
          (x
           (leave (G_ "unknown unit: ~a~%") unit)))))))

(define (display-collision-resolution-hint collision)
  "Display hints on how to resolve COLLISION, a &profile-collistion-error."
  (define (top-most-entry entry)
    (let loop ((entry entry))
      (match (force (manifest-entry-parent entry))
        (#f entry)
        (parent (loop parent)))))

  (let* ((first  (profile-collision-error-entry collision))
         (second (profile-collision-error-conflict collision))
         (name1  (manifest-entry-name (top-most-entry first)))
         (name2  (manifest-entry-name (top-most-entry second))))
    (if (string=? name1 name2)
        (display-hint (format #f (G_ "You cannot have two different versions
or variants of @code{~a} in the same profile.")
                              name1))
        (display-hint (format #f (G_ "Try upgrading both @code{~a} and @code{~a},
or remove one of them from the profile.")
                              name1 name2)))))

(define (call-with-error-handling thunk)
  "Call THUNK within a user-friendly error handler."
  (define (port-filename* port)


@@ 570,6 590,7 @@ interpreted."
                             (manifest-entry-output* conflict)
                             (manifest-entry-item conflict))
               (report-parent-entries conflict)
               (display-collision-resolution-hint c)
               (exit 1)))
            ((nar-error? c)
             (let ((file (nar-error-file c))