diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ffa6272dd1f..f9ad83d7650 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2270,17 +2270,22 @@ package-update "Update package NAME if a newer version exists." (interactive (list (completing-read - "Update package: " (package--updateable-packages) nil t))) + "Update package: " (package--updateable-packages t) nil t))) (let* ((package (if (symbolp name) name (intern name))) (pkg-desc (cadr (assq package package-alist)))) - (if (package-vc-p pkg-desc) + (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)) + (package-install + (car (last (seq-sort-by #'package-desc-priority-version + #'version-list-< + (cdr (assq package package-archive-contents))))) + '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 +2296,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)