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.
This commit is contained in:
Ludovic Courtès 2015-04-07 22:27:45 +02:00
parent 1151f6aeae
commit 4ae7559fd6
2 changed files with 25 additions and 3 deletions

View file

@ -160,9 +160,15 @@ (define prefix-len
(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))))

View file

@ -48,6 +48,7 @@ (define-module (guix ui)
report-error
leave
report-load-error
warn-about-load-error
show-version-and-exit
show-bug-report-information
string->number*
@ -148,6 +149,21 @@ (define (report-load-error file args)
(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