~ruther/guix-local

60c41183d9c47fb25270fe810d03c0785406faad — Brian Kubisiak 1 year, 4 months ago 70c7b4d
ui: Search channels for guix extensions

* guix/describe.scm (append-channels-to-load-path!): New function.
* gnu/packages.scm (%package-module-path): Call new function. Remove
the code that the function call replaces.
* guix/ui.scm (extension-directories): Call new function. Search
channels for guix extensions.
* guix/self.scm (compiled-guix)[*core-modules*]: Add 'guile-git' to
the list of extensions.

Change-Id: I53af828dc554485ca28389c9e2653ea6b4fb6b7e
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
4 files changed, 44 insertions(+), 7 deletions(-)

M gnu/packages.scm
M guix/describe.scm
M guix/self.scm
M guix/ui.scm
M gnu/packages.scm => gnu/packages.scm +4 -3
@@ 148,15 148,16 @@ flags."
  (let* ((not-colon   (char-set-complement (char-set #\:)))
         (environment (string-tokenize (or (getenv "GUIX_PACKAGE_PATH") "")
                                       not-colon))
         (channels-scm channels-go (package-path-entries)))
         (channels-scm (package-path-entries)))
    ;; Automatically add channels and items from $GUIX_PACKAGE_PATH to Guile's
    ;; search path.  For historical reasons, $GUIX_PACKAGE_PATH goes to the
    ;; front; channels go to the back so that they don't override Guix' own
    ;; modules.
    (append-channels-to-load-path!)
    (set! %load-path
      (append environment %load-path channels-scm))
      (append environment %load-path))
    (set! %load-compiled-path
      (append environment %load-compiled-path channels-go))
      (append environment %load-compiled-path))

    (make-parameter
     (append environment

M guix/describe.scm => guix/describe.scm +15 -0
@@ 28,12 28,14 @@
                                manifest-entry-channel)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-71)
  #:use-module (ice-9 match)
  #:export (current-profile
            current-profile-date
            current-profile-entries
            current-channels
            package-path-entries
            append-channels-to-load-path!

            package-provenance
            package-channels


@@ 190,6 192,19 @@ when applicable."
                                      "/site-ccache")))
               (current-channel-entries))))

(define (append-channels-to-load-path!)
  "Automatically add channels to Guile's search path.  Channels are added to the
end of the path so they don't override Guix' own modules.

This procedure ensures that channels are only added to the search path once
even if it is called multiple times."
  (let ((channels-scm channels-go (package-path-entries)))
    (set! %load-path
          (append %load-path channels-scm))
    (set! %load-compiled-path
          (append %load-compiled-path channels-go)))
  (set! append-channels-to-load-path! (lambda () #t)))

(define (package-channels package)
  "Return the list of channels providing PACKAGE or an empty list if it could
not be determined."

M guix/self.scm => guix/self.scm +1 -0
@@ 882,6 882,7 @@ itself."
                    ,(local-file "../guix/store/schema.sql")))

                 #:extensions (list guile-gcrypt
                                    guile-git     ;for (guix git)
                                    guile-json)   ;for (guix swh)
                 #:guile-for-build guile-for-build))


M guix/ui.scm => guix/ui.scm +24 -4
@@ 2194,9 2194,25 @@ contain a 'define-command' form."

(define (extension-directories)
  "Return the list of directories containing Guix extensions."
  (filter file-exists?
          (parse-path
           (getenv "GUIX_EXTENSIONS_PATH"))))
  ;; We need to resolve these lazily, because even using an #:autoload is too
  ;; much and breaks compilation during "guix pull".
  (define append-channels-to-load-path!
    (module-ref (resolve-interface '(guix describe))
                'append-channels-to-load-path!))
  (define package-path-entries
    (module-ref (resolve-interface '(guix describe))
                'package-path-entries))

  (append-channels-to-load-path!)
  (let ((channels (package-path-entries)))
    (filter file-exists?
            (parse-path
             (getenv "GUIX_EXTENSIONS_PATH")
             (append
              (map (cut string-append <> "/guix/scripts")
                   channels)
              (map (cut string-append <> "/guix/extensions")
                   channels))))))

(define (commands)
  "Return the list of commands, alphabetically sorted."


@@ 2284,7 2300,11 @@ found."
             (show-guix-usage)))))
      (file
       (load file)
       (resolve-interface `(guix extensions ,command)))))
       (let ((maybe-extension-path
              (format #f "/guix/extensions/~a.scm" command)))
         (if (string-suffix? maybe-extension-path file)
             (resolve-interface `(guix extensions ,command))
             (resolve-interface `(guix scripts ,command)))))))

  (let ((command-main (module-ref module
                                  (symbol-append 'guix- command))))