From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kost Subject: [PATCH 3/6] emacs: Find packages in system profiles. Date: Sun, 10 Jan 2016 12:53:47 +0300 Message-ID: <1452419630-4399-4-git-send-email-alezost@gmail.com> References: <1452419630-4399-1-git-send-email-alezost@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:34531) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aIChY-0002Od-OA for guix-devel@gnu.org; Sun, 10 Jan 2016 04:54:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aIChX-000289-7i for guix-devel@gnu.org; Sun, 10 Jan 2016 04:54:20 -0500 Received: from mail-lf0-x243.google.com ([2a00:1450:4010:c07::243]:34381) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aIChW-00027z-SI for guix-devel@gnu.org; Sun, 10 Jan 2016 04:54:19 -0500 Received: by mail-lf0-x243.google.com with SMTP id n70so18268259lfn.1 for ; Sun, 10 Jan 2016 01:54:18 -0800 (PST) Received: from localhost.localdomain ([217.107.192.146]) by smtp.gmail.com with ESMTPSA id h9sm19893746lbj.42.2016.01.10.01.54.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 10 Jan 2016 01:54:17 -0800 (PST) In-Reply-To: <1452419630-4399-1-git-send-email-alezost@gmail.com> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: guix-devel@gnu.org 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) (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. --- emacs/guix-base.el | 25 ++++++++++++++++++------- emacs/guix-main.scm | 9 ++++----- emacs/guix-ui-generation.el | 36 ++++++++++++++++++++++++++---------- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/emacs/guix-base.el b/emacs/guix-base.el index dae658e..d720a87 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 +;; Copyright © 2014, 2015, 2016 Alex Kost ;; 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 8c38e7c..5460c96 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 +;;; Copyright © 2014, 2015, 2016 Alex Kost ;;; ;;; 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 aa71645..cb32e04 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 +;; Copyright © 2014, 2015, 2016 Alex Kost ;; 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,14 @@ performance." "Width of an output name \"column\". This variable is used in auxiliary buffers for comparing generations.") -(defun guix-generation-packages (profile generation) +(defun guix-generation-packages (profile generation &optional system?) "Return a list of sorted packages installed in PROFILE's GENERATION. 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 + (guix-packages-profile profile generation system?))))) (sort names+paths (lambda (a b) (string< (car a) (car b)))))) @@ -360,7 +372,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) +(defun guix-generation-insert-packages (buffer profile generation + &optional system?) "Insert package outputs installed in PROFILE's GENERATION in BUFFER." (with-current-buffer buffer (setq buffer-read-only nil @@ -369,9 +382,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 generation system?)))) -(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 +392,22 @@ 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 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 -- 2.6.3