package-upgrade: Implement the upgrading of built-ins

* lisp/emacs-lisp/package.el (package--upgradeable-packages):
Add new argument.  When INCLUDE-BUILTINS is non-nil, also search
among package--builtins (bug#62720).
(package-upgrade): Use the new argument.  Bind
package-install-upgrade-built-in when necessary.  Mark the package
as selected if it was previously an "active built-in".
(package-upgrade-all): Update the docstring.
This commit is contained in:
Dmitry Gutov 2023-05-06 03:54:59 +03:00
parent 0c6311386a
commit 53cc61d60d

View file

@ -2263,25 +2263,26 @@ had been enabled."
;;;###autoload ;;;###autoload
(defun package-upgrade (name) (defun package-upgrade (name)
"Upgrade package NAME if a newer version exists. "Upgrade package NAME if a newer version exists."
Currently, packages which are part of the Emacs distribution
cannot be upgraded that way. To enable upgrades of such a
package using this command, first upgrade the package to a
newer version from ELPA by using `\\<package-menu-mode-map>\\[package-menu-mark-install]' after `\\[list-packages]'."
(interactive (interactive
(list (completing-read (list (completing-read
"Upgrade package: " (package--upgradeable-packages) nil t))) "Upgrade package: " (package--upgradeable-packages t) nil t)))
(let* ((package (if (symbolp name) (let* ((package (if (symbolp name)
name name
(intern name))) (intern name)))
(pkg-desc (cadr (assq package package-alist)))) (pkg-desc (cadr (assq package package-alist)))
(if (package-vc-p pkg-desc) (package-install-upgrade-built-in (not pkg-desc)))
;; `pkg-desc' will be nil when the package is an "active built-in".
(if (and pkg-desc (package-vc-p pkg-desc))
(package-vc-upgrade pkg-desc) (package-vc-upgrade pkg-desc)
(package-delete pkg-desc 'force 'dont-unselect) (when pkg-desc
(package-install package 'dont-select)))) (package-delete pkg-desc 'force 'dont-unselect))
(package-install package
;; An active built-in has never been "selected"
;; before. Mark it as installed explicitly.
(and pkg-desc 'dont-select)))))
(defun package--upgradeable-packages () (defun package--upgradeable-packages (&optional include-builtins)
;; Initialize the package system to get the list of package ;; Initialize the package system to get the list of package
;; symbols for completion. ;; symbols for completion.
(package--archives-initialize) (package--archives-initialize)
@ -2292,11 +2293,21 @@ newer version from ELPA by using `\\<package-menu-mode-map>\\[package-menu-mark-
(or (let ((available (or (let ((available
(assq (car elt) package-archive-contents))) (assq (car elt) package-archive-contents)))
(and available (and available
(or (and
include-builtins
(not (package-desc-version (cadr elt))))
(version-list-< (version-list-<
(package-desc-version (cadr elt)) (package-desc-version (cadr elt))
(package-desc-version (cadr available))))) (package-desc-version (cadr available))))))
(package-vc-p (cadr (assq (car elt) package-alist))))) (package-vc-p (cadr elt))))
package-alist))) (if include-builtins
(append package-alist
(mapcan
(lambda (elt)
(when (not (assq (car elt) package-alist))
(list (list (car elt) (package--from-builtin elt)))))
package--builtins))
package-alist))))
;;;###autoload ;;;###autoload
(defun package-upgrade-all (&optional query) (defun package-upgrade-all (&optional query)
@ -2307,7 +2318,8 @@ interactively, QUERY is always true.
Currently, packages which are part of the Emacs distribution are Currently, packages which are part of the Emacs distribution are
not upgraded by this command. To enable upgrading such a package not upgraded by this command. To enable upgrading such a package
using this command, first upgrade the package to a newer version using this command, first upgrade the package to a newer version
from ELPA by using `\\<package-menu-mode-map>\\[package-menu-mark-install]' after `\\[list-packages]'." from ELPA by either using `\\[package-upgrade]' or
`\\<package-menu-mode-map>\\[package-menu-mark-install]' after `\\[list-packages]'."
(interactive (list (not noninteractive))) (interactive (list (not noninteractive)))
(package-refresh-contents) (package-refresh-contents)
(let ((upgradeable (package--upgradeable-packages))) (let ((upgradeable (package--upgradeable-packages)))