summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Turner <joseph@breatheoutbreathe.in>2023-05-13 10:05:04 -0700
committerPhilip Kaludercic <philipk@posteo.net>2023-05-16 21:22:02 +0200
commit5ac08768aa04b0a707eb421db78b7c18ec27b55a (patch)
tree8f9fb426d3b5edcdfd38b35f9d575974a34e7954
parentd3a17a58fbdb3482512264cebda2b6e8ae16b34e (diff)
downloademacs-5ac08768aa04b0a707eb421db78b7c18ec27b55a.tar.gz
Support side-effects while building VC packages
* doc/emacs/package.texi (Specifying Package Sources): Document new specification attributes. * lisp/emacs-lisp/package-vc.el (package-vc-allow-side-effects): Add new user option. (package-vc--make): Add handler for processing :make and :shell-command. (package-vc--unpack-1): Check 'package-vc-allow-side-effects' and invoke 'package-vc--make'. * etc/NEWS: Mention change. (Bug#63336)
-rw-r--r--doc/emacs/package.texi9
-rw-r--r--etc/NEWS5
-rw-r--r--lisp/emacs-lisp/package-vc.el40
3 files changed, 54 insertions, 0 deletions
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 6722185cb20..4f606b22e54 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -682,6 +682,15 @@ A string providing the repository-relative name of the documentation
file from which to build an Info file. This can be a Texinfo file or
an Org file.
+@item :make
+A string or list of strings providing the target or targets defined in
+the repository Makefile which should run before building the Info
+file. Only takes effect when package-vc-allow-side-effects is non-nil.
+
+@item :shell-command
+A string providing the shell command to run before building the Info
+file. Only takes effect when package-vc-allow-side-effects is non-nil.
+
@item :vc-backend
A symbol naming the VC backend to use for downloading a copy of the
package's repository (@pxref{Version Control Systems,,,emacs, The GNU
diff --git a/etc/NEWS b/etc/NEWS
index b4846eb11b0..8c4af51b312 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -294,6 +294,11 @@ When non-nil, it will automatically register every package as a
project, that you can quickly select using 'project-switch-project'
('C-x p p').
+---
+*** New user option 'package-vc-allow-side-effects'.
+When non-nil, package specifications with side-effects for building
+software will used when building a package.
+
** Flymake
+++
diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el
index beca0bd00e2..35acd493b36 100644
--- a/lisp/emacs-lisp/package-vc.el
+++ b/lisp/emacs-lisp/package-vc.el
@@ -344,6 +344,40 @@ asynchronously."
"\n")
nil pkg-file nil 'silent))))
+(defcustom package-vc-allow-side-effects nil
+ "Whether to process :make and :shell-command spec arguments.
+
+It may be necessary to run :make and :shell-command arguments in
+order to initialize a package or build its documentation, but
+please be careful when changing this option, as installing and
+updating a package can run potentially harmful code.
+
+When set to a list of symbols (packages), run commands for only
+packages in the list. When nil, never run commands. Otherwise
+when non-nil, run commands for any package with :make or
+:shell-command specified.
+
+Package specs are loaded from trusted package archives."
+ :type '(choice (const :tag "Run for all packages" t)
+ (repeat :tag "Run only for selected packages" (symbol :tag "Package name"))
+ (const :tag "Never run" nil))
+ :version "30.1")
+
+(defun package-vc--make (pkg-spec pkg-desc)
+ "Process :make and :shell-command in PKG-SPEC.
+PKG-DESC is the package descriptor for the package that is being
+prepared."
+ (let ((target (plist-get pkg-spec :make))
+ (cmd (plist-get pkg-spec :shell-command))
+ (buf (format " *package-vc make %s*" (package-desc-name pkg-desc))))
+ (when (or cmd target)
+ (with-current-buffer (get-buffer-create buf)
+ (erase-buffer)
+ (when (and cmd (/= 0 (call-process shell-file-name nil t nil shell-command-switch cmd)))
+ (warn "Failed to run %s, see buffer %S" cmd (buffer-name)))
+ (when (and target (/= 0 (apply #'call-process "make" nil t nil (if (consp target) target (list target)))))
+ (warn "Failed to make %s, see buffer %S" target (buffer-name)))))))
+
(declare-function org-export-to-file "ox" (backend file))
(defun package-vc--build-documentation (pkg-desc file)
@@ -486,6 +520,12 @@ documentation and marking the package as installed."
;; Generate package file
(package-vc--generate-description-file pkg-desc pkg-file)
+ ;; Process :make and :shell-command arguments before building documentation
+ (when (or (eq package-vc-allow-side-effects t)
+ (memq (package-desc-name pkg-desc)
+ package-vc-allow-side-effects))
+ (package-vc--make pkg-spec pkg-desc))
+
;; Detect a manual
(when (executable-find "install-info")
(dolist (doc-file (ensure-list (plist-get pkg-spec :doc)))