GNU bug report logs - #66376
[PATCH] fix: correct emacs-guix not finding packages from user channels

Previous Next

Package: guix-patches;

Reported by: Sergio Pastor Pérez <sergio.pastorperez <at> outlook.es>

Date: Fri, 6 Oct 2023 17:23:01 UTC

Severity: normal

Tags: patch

To reply to this bug, email your comments to 66376 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#66376; Package guix-patches. (Fri, 06 Oct 2023 17:23:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Sergio Pastor Pérez <sergio.pastorperez <at> outlook.es>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Fri, 06 Oct 2023 17:23:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Sergio Pastor Pérez <sergio.pastorperez <at> outlook.es>
To: guix-patches <at> gnu.org
Cc: Sergio Pastor Pérez <sergio.pastorperez <at> outlook.es>
Subject: [PATCH] fix: correct emacs-guix not finding packages from user
 channels
Date: Fri,  6 Oct 2023 18:52:54 +0200
---
Hi.

I've noticed that `emacs-guix' is not able to fetch packages from user
channels. This is a quick fix that could be implemented much easier with some
help.

As you can see, there is lots of redundant code from modules of the guix core,
such as: 'gnu/packages.scm' as well as 'guix/describe.scm'.

The issue is that neither of the functions exposed, which are used on the call
hierarchy, accept a parameter for targeting a profile so all this functions need
to be reimplemented to change the lowest function on the call hierarchy.

I thought of using:
--8<---------------cut here---------------start------------->8---
(module-define! (resolve-module '(guix describe)) 'current-profile
  (lambda ()
      "Return the profile (created by 'guix pull') the calling process lives in,
  or #f if this is not applicable."
      (find (lambda (str)
              (string-contains str "current-guix"))
            (user-profiles))))
--8<---------------cut here---------------end--------------->8---

But this is not possible since most of the functions up in the call hierarchy
are memoized with `mlambda'.

For now this is what I'm using for myself. I submit this patch hopping that someone will have a more elegant solution.

Will it be okay to redefine the functions from the guix core into generic ones
that accept a profile as a parameter?

The ones we have could just call the more generic one with a specific parameter
so they will be the 'curried' versions.

What do you think? Any ideas?

Have a nice day,
Sergio.

 scheme/emacs-guix/packages.scm | 14 ++++--
 scheme/emacs-guix/profiles.scm | 79 +++++++++++++++++++++++++++++++++-
 2 files changed, 88 insertions(+), 5 deletions(-)

diff --git a/scheme/emacs-guix/packages.scm b/scheme/emacs-guix/packages.scm
index aba04d8..928a99d 100644
--- a/scheme/emacs-guix/packages.scm
+++ b/scheme/emacs-guix/packages.scm
@@ -338,6 +340,7 @@ See `fold-packages' for the meaning of SELECT?."
                        (cons pkg res)
                        res))
                  '()
+                 all-current-guix-package-modules
                  #:select? select?))
 
 (define (filter-packages-by-output packages output)
@@ -783,7 +786,8 @@ get information with all available parameters, which are: 'id', 'name',
   "Return a list of names of available packages."
   (fold-packages (lambda (pkg res)
                    (cons (package-name pkg) res))
-                 '()))
+                 '()
+                 all-current-guix-package-modules))
 
 (define (package-names*)
   "Return to emacs side a list of names of available packages."
@@ -792,7 +796,8 @@ get information with all available parameters, which are: 'id', 'name',
 (define (number-of-packages)
   "Return the number of available packages."
   (fold-packages (lambda (_ sum) (1+ sum))
-                 0))
+                 0
+                 all-current-guix-package-modules))
 
 
 ;;; Package locations
@@ -809,7 +814,8 @@ get information with all available parameters, which are: 'id', 'name',
                           (let ((file (location-file
                                        (package-location package))))
                             (vhash-cons file package table)))
-                        vlist-null)))
+                        vlist-null
+                        all-current-guix-package-modules)))
          (files (delay (vhash-fold
                         (lambda (file _ result)
                           (if (member file result)
diff --git a/scheme/emacs-guix/profiles.scm b/scheme/emacs-guix/profiles.scm
index 4792b25..5c9b224 100644
--- a/scheme/emacs-guix/profiles.scm
+++ b/scheme/emacs-guix/profiles.scm
@@ -27,6 +27,12 @@
 (define-module (emacs-guix profiles)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-71)
+  #:use-module ((gnu packages)
+                #:select (%default-package-module-path))
+  #:use-module ((guix discovery)
+                #:select (all-modules))
+  #:use-module (guix memoization)
   #:use-module (guix profiles)
   #:use-module (guix search-paths)
   #:use-module ((guix scripts package)
@@ -39,7 +45,8 @@
             manifest-entry-dependencies-file-names
             search-paths-specifications
             search-paths
-            user-profiles))
+            user-profiles
+            all-current-guix-package-modules))
 
 
 ;;; Manifest entries
@@ -154,4 +161,74 @@ Each specification is (VARIABLE SEPARATOR PATH) list."
                       (generation-profile root)))
                (gc-roots))))
 
+(define current-guix-profile
+  (mlambda ()
+    "Return the profile (created by 'guix pull') the calling process lives in,
+or #f if this is not applicable."
+    (find (lambda (str)
+            (string-contains str "current-guix"))
+          (user-profiles))))
+
+(define current-guix-profile-entries
+  (mlambda ()
+    "Return the list of entries in the 'guix pull' profile the calling process
+lives in, or the empty list if this is not applicable."
+    (match (current-guix-profile)
+      (#f '())
+      (profile
+       (let ((manifest (profile-manifest profile)))
+         (manifest-entries manifest))))))
+
+(define current-guix-channel-entries
+  (mlambda ()
+    "Return manifest entries corresponding to extra channels--i.e., not the
+'guix' channel."
+    (remove (lambda (entry)
+              (or (string=? (manifest-entry-name entry) "guix")
+
+                  ;; If ENTRY lacks the 'source' property, it's not an entry
+                  ;; from 'guix pull'.  See <https://bugs.gnu.org/48778>.
+                  (not (assq 'source (manifest-entry-properties entry)))))
+            (current-guix-profile-entries))))
+
+(define (current-guix-package-path-entries)
+  "Return two values: the list of package path entries to be added to the
+package search path, and the list to be added to %LOAD-COMPILED-PATH.  These
+entries are taken from the 'guix pull' profile the calling process lives in,
+when applicable."
+  ;; Filter out Guix itself.
+  (unzip2 (map (lambda (entry)
+                 (list (string-append (manifest-entry-item entry)
+                                      "/share/guile/site/"
+                                      (effective-version))
+                       (string-append (manifest-entry-item entry)
+                                      "/lib/guile/" (effective-version)
+                                      "/site-ccache")))
+               (current-guix-channel-entries))))
+
+(define %current-guix-package-module-path
+  ;; Search path for package modules.  Each item must be either a directory
+  ;; name or a pair whose car is a directory and whose cdr is a sub-directory
+  ;; to narrow the search.
+  (let* ((not-colon   (char-set-complement (char-set #\:)))
+         (environment (string-tokenize (or (getenv "GUIX_PACKAGE_PATH") "")
+                                       not-colon))
+         (channels-scm channels-go (current-guix-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.
+    (set! %load-path
+          (append environment %load-path channels-scm))
+    (set! %load-compiled-path
+          (append environment %load-compiled-path channels-go))
+
+    (make-parameter
+     (append environment
+             %default-package-module-path
+             channels-scm))))
+
+(define all-current-guix-package-modules
+  (all-modules (%current-guix-package-module-path)))
+
 ;;; profiles.scm ends here
-- 
2.41.0





This bug report was last modified 210 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.