From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kost Subject: [PATCH 3/4] emacs: Add "Build" button to Package Info. Date: Sat, 28 May 2016 17:36:13 +0300 Message-ID: <1464446174-1868-3-git-send-email-alezost@gmail.com> References: <1464446174-1868-1-git-send-email-alezost@gmail.com> Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:41988) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b6fLj-0002yL-2F for guix-devel@gnu.org; Sat, 28 May 2016 10:36:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b6fLg-0007HP-TK for guix-devel@gnu.org; Sat, 28 May 2016 10:36:22 -0400 Received: from mail-lf0-x241.google.com ([2a00:1450:4010:c07::241]:35904) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b6fLg-0007HH-HN for guix-devel@gnu.org; Sat, 28 May 2016 10:36:20 -0400 Received: by mail-lf0-x241.google.com with SMTP id h68so3752890lfh.3 for ; Sat, 28 May 2016 07:36:20 -0700 (PDT) Received: from localhost.localdomain ([217.107.192.156]) by smtp.gmail.com with ESMTPSA id u188sm1086937lja.11.2016.05.28.07.36.18 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 28 May 2016 07:36:19 -0700 (PDT) In-Reply-To: <1464446174-1868-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" To: guix-devel@gnu.org * emacs/guix-main.scm: Use (guix scripts) module for 'build-package' procedure. * emacs/guix-base.el (guix-build-package): New procedure. * emacs/guix-ui-package.el (guix-package-info-insert-build-button): New procedure. (guix-package-info-button-functions): New variable. (guix-package-info-insert-misc): Insert buttons using it. --- emacs/guix-base.el | 14 ++++++++++++++ emacs/guix-main.scm | 1 + emacs/guix-ui-package.el | 28 +++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/emacs/guix-base.el b/emacs/guix-base.el index 9620100..658cfdb 100644 --- a/emacs/guix-base.el +++ b/emacs/guix-base.el @@ -231,6 +231,20 @@ Ask a user with PROMPT for continuing an operation." :dry-run? (or guix-dry-run 'f)) nil 'source-download))) +(defun guix-build-package (package-id &optional prompt) + "Build package with PACKAGE-ID. +Ask a user with PROMPT for continuing the build operation." + (when (or (not guix-operation-confirm) + (guix-operation-prompt (or prompt "Build package?"))) + (guix-eval-in-repl + (format (concat ",run-in-store " + "(build-package (package-by-id %d)" + " #:use-substitutes? %s" + " #:dry-run? %s)") + package-id + (guix-guile-boolean guix-use-substitutes) + (guix-guile-boolean guix-dry-run))))) + ;;;###autoload (defun guix-apply-manifest (profile file &optional operation-buffer) "Apply manifest from FILE to PROFILE. diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm index c4f1b4a..8914933 100644 --- a/emacs/guix-main.scm +++ b/emacs/guix-main.scm @@ -51,6 +51,7 @@ (guix licenses) (guix utils) (guix ui) + (guix scripts) (guix scripts package) (gnu packages) (gnu system)) diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el index eebecc7..4eb7083 100644 --- a/emacs/guix-ui-package.el +++ b/emacs/guix-ui-package.el @@ -332,6 +332,13 @@ prompt depending on `guix-operation-confirm' variable)." :type 'boolean :group 'guix-package-info) +(defcustom guix-package-info-button-functions + '(guix-package-info-insert-build-button) + "List of functions used to insert package buttons in Info buffer. +Each function is called with 2 arguments: package ID and full name." + :type '(repeat function) + :group 'guix-package-info) + (defvar guix-package-info-download-buffer nil "Buffer from which a current download operation was performed.") @@ -558,6 +565,7 @@ PACKAGE-ID is an ID of the package which store path to show." (let* ((entry-id (guix-entry-id entry)) (package-id (or (guix-entry-value entry 'package-id) entry-id)) + (full-name (guix-package-entry->name-specification entry)) (store-path (guix-entry-value entry 'store-path))) (guix-info-insert-title-simple "Package") (if store-path @@ -570,7 +578,25 @@ PACKAGE-ID is an ID of the package which store path to show." (button-get btn 'package-id))) "Show the store directory of the current package" 'entry-id entry-id - 'package-id package-id))))) + 'package-id package-id)) + (when guix-package-info-button-functions + (insert "\n") + (guix-mapinsert (lambda (fun) + (funcall fun package-id full-name)) + guix-package-info-button-functions + (guix-info-get-indent) + :indent guix-info-indent + :column (guix-info-fill-column)))))) + +(defun guix-package-info-insert-build-button (id full-name) + "Insert button to build a package defined by ID." + (guix-info-insert-action-button + "Build" + (lambda (btn) + (guix-build-package (button-get btn 'id) + (format "Build '%s' package?" full-name))) + (format "Build the current package") + 'id id)) (defun guix-package-info-show-source (entry-id package-id) "Show file name of a package source in the current info buffer. -- 2.7.3