From 4a3d5b110eb4f2bc875c1ed064daa7c101284c94 Mon Sep 17 00:00:00 2001 From: Andrea Alberti Date: Thu, 11 Jun 2026 17:08:35 +0200 Subject: [PATCH 1/5] Fix memcpy size in 'merge_faces' * src/xfaces.c (merge_faces): Use 'sizeof lface_attrs' instead of LFACE_VECTOR_SIZE as the 'memcpy' size argument. (Bug#81224) --- src/xfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xfaces.c b/src/xfaces.c index 010b0e1847e..ff9101f75fd 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -7229,7 +7229,7 @@ merge_faces (struct window *w, Lisp_Object face_name, int face_id, Lisp_Object lface_attrs[LFACE_VECTOR_SIZE]; int i; - memcpy (lface_attrs, face->lface, LFACE_VECTOR_SIZE); + memcpy (lface_attrs, face->lface, sizeof lface_attrs); /* Make explicit any attributes whose value is 'reset'. */ for (i = 1; i < LFACE_VECTOR_SIZE; i++) if (EQ (lface_attrs[i], Qreset)) From ea3d78898a2be7aafbfda5973fad5453f50d10fe Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Fri, 5 Jun 2026 18:06:10 +0200 Subject: [PATCH 2/5] Allow uninstalling dependency with multiple installations * lisp/emacs-lisp/package.el (package--dependency-p): Add new function to check if a package is a dependency. (package-delete): Prompt user if it is OK to uninstall a package that serves as a dependency, but where the package has multiple installations. This also means that we don't de-select a selected dependency if there are multiple installations. (Bug#81082) --- lisp/emacs-lisp/package.el | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 068b94360d4..cd3c850f7a4 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2379,6 +2379,15 @@ installed), maybe you need to \\[package-refresh-contents]") (equal (cadr (assq (package-desc-name pkg) package-alist)) pkg)) +(defun package--dependency-p (pkg) + "Return non-nil if PKG is a dependency." + (let ((name (package-desc-name pkg))) + (catch 'is-dependency + (dolist (ent (package--alist) nil) + (dolist (desc (cdr ent)) + (when (assq name (package-desc-reqs desc)) + (throw 'is-dependency t))))))) + (declare-function comp-el-to-eln-filename "comp.c") (defvar package-vc-repository-store) (defun package--delete-directory (dir) @@ -2433,15 +2442,20 @@ If NOSAVE is non-nil, the package is not removed from (if (null (remove pkg-desc (cdr pkgs))) (remq pkgs package-alist) package-alist))) - pkg-used-elsewhere-by) + pkg-used-elsewhere-by) ;; If the user is trying to delete this package, they definitely ;; don't want it marked as selected, so we remove it from ;; `package-selected-packages' even if it can't be deleted. (when (and (null nosave) (package--user-selected-p name) - ;; Don't deselect if this is an older version of an - ;; upgraded package. - (package--newest-p pkg-desc)) + (or + ;; Don't deselect if this is an older version of an + ;; upgraded package. + (package--newest-p pkg-desc) + ;; Don't deselect if the package is a dependency and + ;; there are multiple installations (bug#81082). + (and (length< (alist-get name package-alist) 1) + (package--dependency-p pkg-desc)))) (package--save-selected-packages (remove name package-selected-packages))) (cond ((not (string-prefix-p (file-name-as-directory (expand-file-name package-user-dir)) @@ -2452,7 +2466,16 @@ If NOSAVE is non-nil, the package is not removed from ((and (null force) (setq pkg-used-elsewhere-by (let ((package-alist new-package-alist)) - (package--used-elsewhere-p pkg-desc)))) ;See bug#65475 + (package--used-elsewhere-p pkg-desc))) ;See bug#65475 + (and-let* ((other (package-get-descriptor + name 'installed + (lambda (pkg-other) + (not (equal pkg-desc pkg-other)))))) + (not (yes-or-no-p + (format "Package `%s' is used by `%s' as dependency, but `%s' is also available. Use that instead?" + (package-desc-full-name pkg-desc) + (package-desc-name pkg-used-elsewhere-by) + (package-desc-full-name other)))))) ;; Don't delete packages used as dependency elsewhere. (error "Package `%s' is used by `%s' as dependency, not deleting" (package-desc-full-name pkg-desc) From 927a7fff5ecd11057665dcd9a1bf4faa5aff0a45 Mon Sep 17 00:00:00 2001 From: Xiyue Deng Date: Sat, 6 Jun 2026 14:49:06 -0700 Subject: [PATCH 3/5] Restore public interfaces for accessing built-in package info These functions were removed in ab36f5892203e4b1f59da7c995e0f1fa0a81d1b6 during the reorganization of package.el as part of Bug#80079. Also add a simple test for these functions to avoid future regressions. See also discussion at https://lists.gnu.org/archive/html/emacs-devel/2026-06/msg00149.html. * lisp/emacs-lisp/package.el (package-versioned-builtin-packages, package-builtin-package-version): Restore. * lisp/emacs-lisp/package-activate.el: Remove lingering comments. * test/lisp/emacs-lisp/package-tests.el (package-test-builtin-package-info): Add. --- lisp/emacs-lisp/package-activate.el | 2 -- lisp/emacs-lisp/package.el | 16 ++++++++++++++++ test/lisp/emacs-lisp/package-tests.el | 11 +++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/package-activate.el b/lisp/emacs-lisp/package-activate.el index 53a3fa30836..5e2623c57f1 100644 --- a/lisp/emacs-lisp/package-activate.el +++ b/lisp/emacs-lisp/package-activate.el @@ -208,8 +208,6 @@ called via `package-activate-all'. To change which packages are loaded and/or activated, customize `package-load-list'.") (put 'package-alist 'risky-local-variable t) -;;;; Public interfaces for accessing built-in package info - ;;;###autoload (defvar package-activated-list nil ;; FIXME: This should implicitly include all builtin packages. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index cd3c850f7a4..12b450d93db 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -534,6 +534,22 @@ package." reqs summary) + +;;; Public interfaces for accessing built-in package info + +(defun package-versioned-builtin-packages () + "Return a list of all the versioned built-in packages. +The return value is a list of names of built-in packages represented as +symbols." + (mapcar #'car package--builtin-versions)) + +(defun package-builtin-package-version (package) + "Return the version of a built-in PACKAGE given by its symbol. +The return value is a list of integers representing the version of +PACKAGE, in the format returned by `version-to-list', or nil if the +package is built-in but has no version or is not a built-in package." + (alist-get package package--builtin-versions)) + ;;; Installed packages diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el index a2e4adb7b8e..b6fb9005e4c 100644 --- a/test/lisp/emacs-lisp/package-tests.el +++ b/test/lisp/emacs-lisp/package-tests.el @@ -1028,6 +1028,17 @@ but with a different end of line convention (bug#48137)." (list new-pkg-desc simple-depend-desc-2 simple-depend-desc-1 multi-file-desc simple-depend-desc simple-single-desc))))) +(ert-deftest package-test-builtin-package-info () + "Test public interfaces for querying package info." + (should (not (null (package-versioned-builtin-packages)))) + ;; Picking any built-in library to check the version. Update results + ;; as needed. + (require 'lisp-mnt) + (should (equal (package-builtin-package-version 'cl-lib) + (with-temp-buffer + (insert-file-contents (locate-library "cl-lib.el")) + (version-to-list (lm-version)))))) + (provide 'package-test) ;;; package-tests.el ends here From 19a7d4ce7c6b075f2ff5d98f3e8c5c0e8e4a61cd Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Fri, 12 Jun 2026 09:44:01 +0200 Subject: [PATCH 4/5] Fix behavior of 'temp-buffer-resize-mode' (Bug#81207) * lisp/help.el (temp-buffer-resize-mode): Fix doc-string - a window can be resized now even if it has shown another buffer in between (Bug#81207). (resize-temp-buffer-window): Resize window if and only if its buffer is the buffer it has shown initially (Bug#81207). --- lisp/help.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index f5fe34435bb..b5eba8707db 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -2003,10 +2003,8 @@ show a temporary buffer are automatically resized in height to fit the buffer's contents, but never more than `temp-buffer-max-height' nor less than `window-min-height'. -A window is resized only if it has been specially created for the -buffer. Windows that have shown another buffer before are not -resized. A frame is resized only if `fit-frame-to-buffer' is -non-nil. +A window is resized only if it has been specially created for its +buffer. A frame is resized only if `fit-frame-to-buffer' is non-nil. This mode is used by `help', `apropos' and `completion' buffers, and some others." @@ -2050,7 +2048,10 @@ provided `fit-frame-to-buffer' is non-nil." (quit-cadr (cadr (window-parameter window 'quit-restore)))) ;; Resize WINDOW only if it was made by `display-buffer'. (when (or (and (eq quit-cadr 'window) - (or (and (window-combined-p window) + ;; When WINDOW was reused, its buffer must be the one + ;; initially shown in it (Bug#81207). + (eq buffer (nth 3 (window-parameter window 'quit-restore))) + (or (and (window-combined-p window) (not (eq fit-window-to-buffer-horizontally 'only)) (pos-visible-in-window-p From 498eafb4f10f915e186169a4553e43ddbe654cb4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 13 Jun 2026 12:42:41 +0300 Subject: [PATCH 5/5] ; * lisp/help.el (temp-buffer-resize-mode): Doc fix (bug#81207). --- lisp/help.el | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index b5eba8707db..5e628083def 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1998,16 +1998,20 @@ function is called, the window to be resized is selected." (define-minor-mode temp-buffer-resize-mode "Toggle auto-resizing temporary buffer windows (Temp Buffer Resize Mode). -When Temp Buffer Resize mode is enabled, the windows in which we -show a temporary buffer are automatically resized in height to +When Temp Buffer Resize mode is enabled, the windows in which Emacs +shows a temporary buffer are automatically resized in height to fit the buffer's contents, but never more than `temp-buffer-max-height' nor less than `window-min-height'. -A window is resized only if it has been specially created for its -buffer. A frame is resized only if `fit-frame-to-buffer' is non-nil. +When this mode is enabled, a window is resized only if it has been +specially created for a temporary buffer. Windows that have shown +another buffer before being reused for displaying a temporary buffer +are not resized (but note that if `even-window-sizes' is non-nil, they +might beresized in some situations anyway). A frame is resized only +if `fit-frame-to-buffer' is non-nil. This mode is used by `help', `apropos' and `completion' buffers, -and some others." +and some others, when they display their pop-up buffers." :global t :group 'help (if temp-buffer-resize-mode ;; `help-make-xrefs' may add a `back' button and thus increase the