>From 12e0b209992675a042112e790571d427a003c30d Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Wed, 12 Apr 2023 14:26:39 +0200 Subject: [PATCH] Allow upgrading built-in packages * lisp/emacs-lisp/package.el (package--upgradable-built-in-p): Add new utility predicate. (package-compute-transaction): Check if an installed package is built-in while resolving dependencies and allow it to be installed. (package-install): Suggest upgrading built-in packages in the interactive specification. Allow upgrading built-in packages --- lisp/emacs-lisp/package.el | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index f92afe56b76..2cf98290bba 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -797,6 +797,20 @@ package-built-in-p (require 'finder-inf nil t) ; For `package--builtins'. (assq package package--builtins)))))) +(defun package--upgradable-built-in-p (package) + "Check if a built-in PACKAGE can be upgraded. +This command differs from `package-built-in-p' in that it only +returns a non-nil value if the user has not installed a more +recent version of the package from a package archive." + (and (not (assq (cond + ((package-desc-p package) + (package-desc-name package)) + ((stringp package) (intern package)) + ((symbolp package) package) + ((error "Unknown package format: %S" package))) + (package--alist))) + (package-built-in-p package))) + (defun package--autoloads-file-name (pkg-desc) "Return the absolute name of the autoloads file, sans extension. PKG-DESC is a `package-desc' object." @@ -1908,7 +1922,16 @@ package-compute-transaction (package-version-join (package-desc-version already))))) (cond (already nil) - ((package-installed-p next-pkg next-version) nil) + ;; If a package is installed, we don't need to continue. + ;; Built-in packages constitute an exception, because we want + ;; to allow the user to "upgrade" from a built-in version to a + ;; potentially newer version available on ELPA (bug#62720). + ((and (not (package--upgradable-built-in-p next-pkg)) + (package-installed-p next-pkg next-version))) + ;; The pseudo-package Emacs is always installed and built-in. + ;; It cannot be upgraded, so we make sure not to proceed beyond + ;; this point when resolving dependencies. + ((eq next-pkg 'emacs)) (t ;; A package is required, but not installed. It might also be @@ -2205,11 +2228,12 @@ package-install (package--archives-initialize) (list (intern (completing-read "Install package: " - (delq nil - (mapcar (lambda (elt) - (unless (package-installed-p (car elt)) - (symbol-name (car elt)))) - package-archive-contents)) + (mapcan + (lambda (elt) + (and (or (package--upgradable-built-in-p (car elt)) + (not (package-installed-p (car elt)))) + (list (car elt)))) + package-archive-contents) nil t)) nil))) (package--archives-initialize) -- 2.39.2