diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ffa6272dd1f..b72bf86c773 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2266,21 +2266,39 @@ package-install (declare-function package-vc-update "package-vc" (pkg)) ;;;###autoload -(defun package-update (name) - "Update package NAME if a newer version exists." +(defun package-update (name &optional update-built-ins) + "Update package NAME if a newer version exists. + +Only packages installed from ELPA are allowed to be updated this +way. + +But if UPDATE-BUILT-INS is non-nil, or if the command is invoked +interactively with a prefix argument, it will allow upgrading of +active built-in packages." (interactive (list (completing-read - "Update package: " (package--updateable-packages) nil t))) + "Update package: " (package--updateable-packages + current-prefix-arg) + nil t) + current-prefix-arg)) (let* ((package (if (symbolp name) name (intern name))) - (pkg-desc (cadr (assq package package-alist)))) - (if (package-vc-p pkg-desc) + (pkg-desc (cadr (assq package package-alist))) + (package-install-upgrade-built-in (and + update-built-ins + (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-update pkg-desc) - (package-delete pkg-desc 'force) - (package-install package 'dont-select)))) - -(defun package--updateable-packages () + (when pkg-desc + (package-delete pkg-desc 'force 'nosave)) + (package-install package + ;; An active built-in has never been "selected" + ;; before. Mark it as installed explicitly. + (and pkg-desc 'dont-select))))) + +(defun package--updateable-packages (&optional allow-builtins) ;; Initialize the package system to get the list of package ;; symbols for completion. (package--archives-initialize) @@ -2291,11 +2309,21 @@ package--updateable-packages (or (let ((available (assq (car elt) package-archive-contents))) (and available - (version-list-< - (package-desc-version (cadr elt)) - (package-desc-version (cadr available))))) - (package-vc-p (cadr (assq (car elt) package-alist))))) - package-alist))) + (or (and + allow-builtins + (not (package-desc-version (cadr elt)))) + (version-list-< + (package-desc-version (cadr elt)) + (package-desc-version (cadr available)))))) + (package-vc-p (cadr elt)))) + (if allow-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 (defun package-update-all (&optional query)