Eli said something like this patch could be acceptable for master and
maybe 29.2.
----------8<----------8<----------8<----------8<----------8<----------8<
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -652,6 +652,9 @@ package--builtins
name (a symbol) and DESC is a `package--bi-desc' structure.")
(put 'package--builtins 'risky-local-variable t)
+(defvar package--safely-upgradeable-builtins '(eglot use-package)
+ "See bug#62720 for longest docstring ever.")
+
(defvar package-alist nil
"Alist of all packages available for activation.
Each element has the form (PKG . DESCS), where PKG is a package
@@ -2201,14 +2204,19 @@ package-install
(package--archives-initialize)
(list (intern (completing-read
"Install package: "
+ (append
(delq nil
(mapcar (lambda (elt)
(unless (package-installed-p (car elt))
(symbol-name (car elt))))
package-archive-contents))
+ package--safely-upgradeable-builtins)
nil t))
nil)))
(package--archives-initialize)
+ (when-let ((desc (and (memq pkg package--safely-upgradeable-builtins)
+ (cadr (assoc pkg package-archive-contents)))))
+ (setq pkg desc))
(add-hook 'post-command-hook #'package-menu--post-refresh)
(let ((name (if (package-desc-p pkg)
(package-desc-name pkg)
---------->8---------->8---------->8---------->8---------->8---------->8
1. Node code complexity. It's 6 lines of trivial code.
2. Absolutely no risk of "silent installation of software that wasn't ever
installed before"
3. Fixes all the aforementioned issues