branch: externals/leaf commit d732e4b88c0686df386073a90587bea681bd005c Author: Naoya Yamashita <con...@gmail.com> Commit: Naoya Yamashita <con...@gmail.com>
use just `push` instead of using `package--update-selected-packages` Note - The previous function expanded `custom-save-variable`, which saved custom.el sequentially, causing serious performance degradation in some cases. - Since `package-selected-packages` was introduced in Emacs-25.1, we will consider the case where this variable is not declared. If it is not declared, just `setq` it as a new variable. (leaf-safe-push) - Remove progn from the second `condition-case`, since it can accept multiple S-expressions in the error arm. --- leaf-tests.el | 30 +++++++++++++++--------------- leaf.el | 52 ++++++++++++++++++++++++++++------------------------ 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/leaf-tests.el b/leaf-tests.el index 86bf79fdec..97b4654742 100644 --- a/leaf-tests.el +++ b/leaf-tests.el @@ -2390,21 +2390,21 @@ Example: ;; otherwise try to install it. ;; If installation fails, update local cache and retry to install. ((leaf-handler-package macrostep macrostep nil) - (if (package-installed-p 'macrostep) - (package--update-selected-packages '(macrostep) nil) - (unless (assoc 'macrostep package-archive-contents) - (package-refresh-contents)) - (condition-case _err - (package-install 'macrostep) - (error - (condition-case err - (progn - (package-refresh-contents) - (package-install 'macrostep)) - (error - (display-warning 'leaf - (format "In `macrostep' block, failed to :package of `macrostep'. Error msg: %s" - (error-message-string err))))))))))) + (progn + (leaf-safe-push 'macrostep package-selected-packages 'no-dup) + (unless (package-installed-p 'macrostep) + (unless (assoc 'macrostep package-archive-contents) + (package-refresh-contents)) + (condition-case _err + (package-install 'macrostep) + (error + (package-refresh-contents) + (condition-case err + (package-install 'macrostep) + (error + (display-warning 'leaf + (format "In `macrostep' block, failed to :package of `macrostep'. Error msg: %s" + (error-message-string err)))))))))))) (when (version< "24.0" emacs-version) (cort-deftest-with-macroexpand leaf/leaf-key diff --git a/leaf.el b/leaf.el index 7339302978..d341567251 100644 --- a/leaf.el +++ b/leaf.el @@ -775,12 +775,16 @@ see `alist-get'." (indent-region (point-min) (point-max)) (display-buffer buf)))) -(defmacro leaf-safe-push (newelt place) +(defmacro leaf-safe-push (newelt place &optional no-dup) "Safely add NEWELT to the list stored in the generalized variable PLACE. This is equivalent to `push' if PLACE is bound, otherwise, `setq' -is used to define a new list." +is used to define a new list. +If NO-DUP is non-nil, do not `push' if the element already exists." `(if (boundp ',place) - (push ,newelt ,place) + ,(if (not no-dup) + `(push ,newelt ,place) + `(unless (memq ,newelt ,place) + (push ,newelt ,place))) (setq ,place (list ,newelt)))) @@ -1076,27 +1080,27 @@ FN also accept list of FN." (defmacro leaf-handler-package (name pkg _pin) "Handler for ensuring the installation of PKG with package.el via PIN in the leaf block NAME." - `(if (package-installed-p ',pkg) - (package--update-selected-packages '(,pkg) nil) - (unless (assoc ',pkg package-archive-contents) - (package-refresh-contents)) - (condition-case _err - (package-install ',pkg) - (error - (condition-case err - (progn - (package-refresh-contents) - (package-install ',pkg)) - (error - (display-warning 'leaf - (format - ,(concat - (format "In `%s' block" name) - (when load-file-name - (format " at `%s'" load-file-name)) - (format ", failed to :package of `%s'." pkg) - " Error msg: %s") - (error-message-string err))))))))) + `(progn + (leaf-safe-push ',pkg package-selected-packages 'no-dup) + (unless (package-installed-p ',pkg) + (unless (assoc ',pkg package-archive-contents) + (package-refresh-contents)) + (condition-case _err + (package-install ',pkg) + (error + (package-refresh-contents) + (condition-case err + (package-install ',pkg) + (error + (display-warning 'leaf + (format + ,(concat + (format "In `%s' block" name) + (when load-file-name + (format " at `%s'" load-file-name)) + (format ", failed to :package of `%s'." pkg) + " Error msg: %s") + (error-message-string err)))))))))) (defmacro leaf-handler-auth (name sym store) "Handler auth-* to set SYM of NAME from STORE."