master 4a86a530dee: Merge from origin/emacs-31

Eli Zaretskii <[email protected]>
Newsgroups gmane.emacs.diffs
Message-ID <[email protected]>
branch: master
commit 4a86a530deea029a33753fba1e38c277a026bed7
Merge: 283fad1d47e 498eafb4f10
Author: Eli Zaretskii <[email protected]>
Commit: Eli Zaretskii <[email protected]>

    Merge from origin/emacs-31
    
    498eafb4f10 ; * lisp/help.el (temp-buffer-resize-mode): Doc fix (bug#...
    19a7d4ce7c6 Fix behavior of 'temp-buffer-resize-mode' (Bug#81207)
    927a7fff5ec Restore public interfaces for accessing built-in package ...
    ea3d78898a2 Allow uninstalling dependency with multiple installations
    4a3d5b110eb Fix memcpy size in 'merge_faces'
---
 lisp/emacs-lisp/package-activate.el   |  2 --
 lisp/emacs-lisp/package.el            | 49 +++++++++++++++++++++++++++++++----
 lisp/help.el                          | 21 +++++++++------
 src/xfaces.c                          |  2 +-
 test/lisp/emacs-lisp/package-tests.el | 11 ++++++++
 5 files changed, 69 insertions(+), 16 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 9ff761f0157..67474ccf0f7 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -535,6 +535,22 @@ package."
   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
 
 ;; The following functions are called on each installed package by
@@ -2379,6 +2395,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 +2458,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 +2482,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)
diff --git a/lisp/help.el b/lisp/help.el
index f5fe34435bb..5e628083def 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -1998,18 +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 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.
+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
@@ -2050,7 +2052,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
diff --git a/src/xfaces.c b/src/xfaces.c
index dafc50f559f..28f3d046115 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -7272,7 +7272,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))
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.