~ruther/guix-local

4ae7559fd62c03a800b010c228639f18b9f58006 — Ludovic Courtès 11 years ago 1151f6a
gnu: Emit a warning when a package module cannot be loaded.

* guix/ui.scm (warn-about-load-error): New procedure.
* gnu/packages.scm (package-modules): Wrap 'resolve-interface' call in
  'catch #t', and call 'warn-about-load-error' in handler.
2 files changed, 25 insertions(+), 3 deletions(-)

M gnu/packages.scm
M guix/ui.scm
M gnu/packages.scm => gnu/packages.scm +9 -3
@@ 160,9 160,15 @@ Optionally, narrow the search to SUB-DIRECTORY."
    (string-length directory))

  (filter-map (lambda (file)
                (let ((file (substring file prefix-len)))
                  (false-if-exception
                   (resolve-interface (file-name->module-name file)))))
                (let* ((file   (substring file prefix-len))
                       (module (file-name->module-name file)))
                  (catch #t
                    (lambda ()
                      (resolve-interface module))
                    (lambda args
                      ;; Report the error, but keep going.
                      (warn-about-load-error module args)
                      #f))))
              (scheme-files (if sub-directory
                                (string-append directory "/" sub-directory)
                                directory))))

M guix/ui.scm => guix/ui.scm +16 -0
@@ 48,6 48,7 @@
            report-error
            leave
            report-load-error
            warn-about-load-error
            show-version-and-exit
            show-bug-report-information
            string->number*


@@ 148,6 149,21 @@ ARGS is the list of arguments received by the 'throw' handler."
     (apply display-error #f (current-error-port) args)
     (exit 1))))

(define (warn-about-load-error file args)         ;FIXME: factorize with ↑
  "Report the failure to load FILE, a user-provided Scheme file, without
exiting.  ARGS is the list of arguments received by the 'throw' handler."
  (match args
    (('system-error . _)
     (let ((err (system-error-errno args)))
       (warning (_ "failed to load '~a': ~a~%") file (strerror err))))
    (('syntax-error proc message properties form . rest)
     (let ((loc (source-properties->location properties)))
       (format (current-error-port) (_ "~a: warning: ~a~%")
               (location->string loc) message)))
    ((error args ...)
     (warning (_ "failed to load '~a':~%") file)
     (apply display-error #f (current-error-port) args))))

(define (install-locale)
  "Install the current locale settings."
  (catch 'system-error