From e98316e69f2480bde709d92ec00db66fd8e66aea Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Sun, 15 May 2016 11:10:04 +0300 Subject: emacs: Add "Build" button to Package Info. * 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 962010050b..658cfdb5fa 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 c4f1b4ada0..8914933b4b 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 eebecc7077..4eb70831dd 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. -- cgit v1.2.3