summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2016-01-04 19:11:30 +0300
committerAlex Kost <alezost@gmail.com>2016-01-16 13:02:21 +0300
commit2df17bd0eeed1e29e64cf21ecec61413af19ba65 (patch)
tree60145cfe020c9eaa539ca4fc0bb1367d7aa214c0
parenta0ad8ab01e839f3d3dbea0da84efbe51e8b67589 (diff)
downloadguix-2df17bd0eeed1e29e64cf21ecec61413af19ba65.tar.gz
emacs: Find packages in system profiles.
For a usual profile, packages are placed in a profile directory itself,
but for a system profile, packages are placed in 'profile'
sub-directory.  So we need to do some special cases for system profiles
to find packages there as well.

* emacs/guix-base.el (guix-packages-profile): New procedure.
  (guix-manifest-file): Use it.  Add optional 'system?' argument.
* emacs/guix-ui-generation.el (guix-system-generation?)
  (guix-generation-current-packages-profile):  New procedures.
  (guix-generation-packages, guix-generation-insert-packages): Remove
  'generation' argument.
  (guix-generation-packages-buffer): Add optional 'system?' argument.
  (guix-profile-generation-manifest-file)
  (guix-profile-generation-packages-buffer): Adjust accordingly.
* emacs/guix-main.scm (generation-package-specifications+paths): Rename to...
  (profile->specifications+paths): ... this.  Use a single 'profile' argument.
-rw-r--r--emacs/guix-base.el25
-rw-r--r--emacs/guix-main.scm9
-rw-r--r--emacs/guix-ui-generation.el40
3 files changed, 50 insertions, 24 deletions
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index dae658ebfa..d720a87833 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -1,6 +1,6 @@
 ;;; guix-base.el --- Common definitions   -*- lexical-binding: t -*-
 
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -91,14 +91,25 @@ For the meaning of location, see `guix-find-location'."
   "Return the file name of a PROFILE's GENERATION."
   (format "%s-%s-link" profile generation))
 
-(defun guix-manifest-file (profile &optional generation)
+(defun guix-packages-profile (profile &optional generation system?)
+  "Return a directory where packages are installed for the
+PROFILE's GENERATION.
+
+If SYSTEM? is non-nil, then PROFILE is considered to be a system
+profile.  Unlike usual profiles, for a system profile, packages
+are placed in 'profile' subdirectory."
+  (let ((profile (if generation
+                     (guix-generation-file profile generation)
+                   profile)))
+    (if system?
+        (expand-file-name "profile" profile)
+      profile)))
+
+(defun guix-manifest-file (profile &optional generation system?)
   "Return the file name of a PROFILE's manifest.
-If GENERATION number is specified, return manifest file name for
-this generation."
+See `guix-packages-profile'."
   (expand-file-name "manifest"
-                    (if generation
-                        (guix-generation-file profile generation)
-                      profile)))
+                    (guix-packages-profile profile generation system?)))
 
 ;;;###autoload
 (defun guix-edit (id-or-name)
diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm
index 8c38e7cae3..5460c9686e 100644
--- a/emacs/guix-main.scm
+++ b/emacs/guix-main.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -144,11 +144,10 @@ return two values: name and version.  For example, for SPEC
     (manifest-entries->package-specifications
      (manifest-entries manifest))))
 
-(define (generation-package-specifications+paths profile number)
-  "Return a list of package specifications and paths for generation NUMBER.
+(define (profile->specifications+paths profile)
+  "Return a list of package specifications and paths for PROFILE.
 Each element of the list is a list of the package specification and its path."
-  (let ((manifest (profile-manifest
-                   (generation-file-name profile number))))
+  (let ((manifest (profile-manifest profile)))
     (map (lambda (entry)
            (list (manifest-entry->package-specification entry)
                  (manifest-entry-item entry)))
diff --git a/emacs/guix-ui-generation.el b/emacs/guix-ui-generation.el
index aa71645b4e..89a235a29c 100644
--- a/emacs/guix-ui-generation.el
+++ b/emacs/guix-ui-generation.el
@@ -1,6 +1,6 @@
 ;;; guix-ui-generation.el --- Interface for displaying generations  -*- lexical-binding: t -*-
 
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -78,6 +78,18 @@ Each element from GENERATIONS is a generation number."
       'switch-to-generation* profile generation)
      operation-buffer)))
 
+(defun guix-system-generation? ()
+  "Return non-nil, if current generation is a system one."
+  (eq (guix-buffer-current-entry-type)
+      'system-generation))
+
+(defun guix-generation-current-packages-profile (&optional generation)
+  "Return a directory where packages are installed for the
+current profile's GENERATION."
+  (guix-packages-profile (guix-ui-current-profile)
+                         generation
+                         (guix-system-generation?)))
+
 
 ;;; Generation 'info'
 
@@ -324,14 +336,13 @@ performance."
   "Width of an output name \"column\".
 This variable is used in auxiliary buffers for comparing generations.")
 
-(defun guix-generation-packages (profile generation)
-  "Return a list of sorted packages installed in PROFILE's GENERATION.
+(defun guix-generation-packages (profile)
+  "Return a list of sorted packages installed in PROFILE.
 Each element of the list is a list of the package specification
 and its store path."
   (let ((names+paths (guix-eval-read
                       (guix-make-guile-expression
-                       'generation-package-specifications+paths
-                       profile generation))))
+                       'profile->specifications+paths profile))))
     (sort names+paths
           (lambda (a b)
             (string< (car a) (car b))))))
@@ -360,8 +371,8 @@ Use the full PROFILE file name."
   (indent-to guix-generation-output-name-width 2)
   (insert path "\n"))
 
-(defun guix-generation-insert-packages (buffer profile generation)
-  "Insert package outputs installed in PROFILE's GENERATION in BUFFER."
+(defun guix-generation-insert-packages (buffer profile)
+  "Insert package outputs installed in PROFILE in BUFFER."
   (with-current-buffer buffer
     (setq buffer-read-only nil
           indent-tabs-mode nil)
@@ -369,9 +380,9 @@ Use the full PROFILE file name."
     (mapc (lambda (name+path)
             (guix-generation-insert-package
              (car name+path) (cadr name+path)))
-          (guix-generation-packages profile generation))))
+          (guix-generation-packages profile))))
 
-(defun guix-generation-packages-buffer (profile generation)
+(defun guix-generation-packages-buffer (profile generation &optional system?)
   "Return buffer with package outputs installed in PROFILE's GENERATION.
 Create the buffer if needed."
   (let ((buf-name (guix-generation-packages-buffer-name
@@ -379,19 +390,24 @@ Create the buffer if needed."
     (or (and (null guix-generation-packages-update-buffer)
              (get-buffer buf-name))
         (let ((buf (get-buffer-create buf-name)))
-          (guix-generation-insert-packages buf profile generation)
+          (guix-generation-insert-packages
+           buf
+           (guix-packages-profile profile generation system?))
           buf))))
 
 (defun guix-profile-generation-manifest-file (generation)
   "Return the file name of a GENERATION's manifest.
 GENERATION is a generation number of the current profile."
-  (guix-manifest-file (guix-ui-current-profile) generation))
+  (guix-manifest-file (guix-ui-current-profile)
+                      generation
+                      (guix-system-generation?)))
 
 (defun guix-profile-generation-packages-buffer (generation)
   "Insert GENERATION's package outputs in a buffer and return it.
 GENERATION is a generation number of the current profile."
   (guix-generation-packages-buffer (guix-ui-current-profile)
-                                   generation))
+                                   generation
+                                   (guix-system-generation?)))
 
 
 ;;; Interactive commands