~ruther/guix-local

2df17bd0eeed1e29e64cf21ecec61413af19ba65 — Alex Kost 10 years ago a0ad8ab
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.
3 files changed, 50 insertions(+), 24 deletions(-)

M emacs/guix-base.el
M emacs/guix-main.scm
M emacs/guix-ui-generation.el
M emacs/guix-base.el => emacs/guix-base.el +18 -7
@@ 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)

M emacs/guix-main.scm => emacs/guix-main.scm +4 -5
@@ 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)))

M emacs/guix-ui-generation.el => emacs/guix-ui-generation.el +28 -12
@@ 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