Subject: Re: bug#35504: 26.2; Key `g' should run `package-menu-refresh' in the *Packages* buffer

From: Stefan Kangas <[email-masked]>
Date: Fri, 4 Oct 2019 17:09:09 +0200

Stefan Monnier <[email-masked]> writes:
>
> >> Fine by me.  I wonder, tho: why not set revert-buffer-function and then
> >> redefine `package-menu-refresh` as an obsolete alias for `revert-buffer`?
> > Sure, I've tried to do that in the attached patch.  WDYT?
> [...]
> > +  (setq revert-buffer-function 'package-menu-revert)
> [...]
> > +(define-obsolete-function-alias 'package-menu-refresh 'package-menu-revert "27.1")
>
> Could we make package-menu-refresh to be an (obsolete) alias of
> `revert-buffer` instead (and make package-menu-revert an internal
> non-interactive function)?

Absolutely, thanks for the suggestion.  Fixed in the attached patch
together with the things Basil pointed out.

Please let me know what you think.

Best regards,
Stefan Kangas
From e4e4507685e8df07f0d624eb754fe94cd28f2a45 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <[email-masked]>
Date: Fri, 26 Jul 2019 12:49:35 +0200
Subject: [PATCH] Make 'g' refresh package data in package menu

* lisp/emacs-lisp/package.el (package-menu--refresh): Rename from
'package-menu-refresh', make internal and non-interactive.
(package-menu-mode-map, package-menu-mode-menu, package-menu-mode)
(list-packages): Use the above.  (Bug#35504)
(package-menu-refresh): Redefine as obsolete fuction alias for
'revert-buffer'.
* doc/emacs/package.texi (Package Menu): Document it.
* etc/NEWS: Announce it.
---
 doc/emacs/package.texi     | 17 ++++++++++++++---
 etc/NEWS                   |  9 +++++++++
 lisp/emacs-lisp/package.el | 17 +++++++++++------
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 2c09ca8902..7b6dcc041d 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -85,16 +85,19 @@ Package Menu
 
 @table @kbd
 @item h
+@findex package-menu-quick-help
 Print a short message summarizing how to use the package menu
 (@code{package-menu-quick-help}).
 
 @item ?
 @itemx @key{RET}
+@findex package-menu-describe-package
 Display a help buffer for the package on the current line
 (@code{package-menu-describe-package}), similar to the help window
 displayed by the @kbd{C-h P} command (@pxref{Packages}).
 
 @item i
+@findex package-menu-mark-install
 Mark the package on the current line for installation
 (@code{package-menu-mark-install}).  If the package status is
 @samp{available}, this adds an @samp{I} character to the start of the
@@ -102,6 +105,7 @@ Package Menu
 package.
 
 @item d
+@findex package-menu-mark-delete
 Mark the package on the current line for deletion
 (@code{package-menu-mark-delete}).  If the package status is
 @samp{installed}, this adds a @samp{D} character to the start of the
@@ -110,6 +114,7 @@ Package Menu
 entails.
 
 @item ~
+@findex package-menu-mark-obsolete-for-deletion
 Mark all obsolete packages for deletion
 (@code{package-menu-mark-obsolete-for-deletion}).  This marks for
 deletion all the packages whose status is @samp{obsolete}.
@@ -120,6 +125,7 @@ Package Menu
 current line by an @kbd{i} or @kbd{d} command.
 
 @item U
+@findex package-menu-mark-upgrades
 Mark all package with a newer available version for upgrading
 (@code{package-menu-mark-upgrades}).  This places an installation mark
 on the new available versions, and a deletion mark on the old
@@ -127,26 +133,31 @@ Package Menu
 
 @item x
 @vindex package-menu-async
+@findex package-menu-execute
 Download and install all packages marked with @kbd{i}, and their
 dependencies; also, delete all packages marked with @kbd{d}
 (@code{package-menu-execute}).  This also removes the marks.
 
+@item g
 @item r
-Refresh the package list (@code{package-menu-refresh}).  This fetches
-the list of available packages from the package archive again, and
-recomputes the package list.
+Refresh the package list (@code{revert-buffer}).  This fetches the
+list of available packages from the package archive again, and
+redisplays the package list.
 
 @item f
+@findex package-menu-filter
 Filter the package list (@code{package-menu-filter}).  This prompts
 for a keyword (e.g., @samp{games}), then shows only the packages
 that relate to that keyword.  To restore the full package list,
 type @kbd{q}.
 
 @item H
+@findex package-menu-hide-package
 Permanently hide packages that match a regexp
 (@code{package-menu-hide-package}).
 
 @item (
+@findex package-menu-toggle-hiding
 Toggle visibility of old versions of packages and also of versions
 from lower-priority archives (@code{package-menu-toggle-hiding}).
 @end table
diff --git a/etc/NEWS b/etc/NEWS
index c8cc7537b0..9bb77b0863 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1000,6 +1000,15 @@ early init file.
 ---
 *** The package list can now be sorted by version or description.
 
++++
+*** 'package-menu-refresh' is an obsolete alias for 'revert-buffer'.
+
++++
+*** In Package Menu, 'g' now updates package data from archives.
+Previously, 'g' invoked 'tabulated-list-revert' which did not update
+the cached archive data.  It is now bound to 'revert-buffer', which
+will now update the data.
+
 ** Info
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 188f398a56..3e67ca9ee5 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2690,7 +2690,7 @@ package-menu-mode-map
     (define-key map "d" 'package-menu-mark-delete)
     (define-key map "i" 'package-menu-mark-install)
     (define-key map "U" 'package-menu-mark-upgrades)
-    (define-key map "r" 'package-menu-refresh)
+    (define-key map "r" 'revert-buffer)
     (define-key map "f" 'package-menu-filter)
     (define-key map "~" 'package-menu-mark-obsolete-for-deletion)
     (define-key map "x" 'package-menu-execute)
@@ -2707,7 +2707,7 @@ package-menu-mode-menu
     ["Describe Package" package-menu-describe-package :help "Display information about this package"]
     ["Help" package-menu-quick-help :help "Show short key binding help for package-menu-mode"]
     "--"
-    ["Refresh Package List" package-menu-refresh
+    ["Refresh Package List" revert-buffer
      :help "Redownload the ELPA archive"
      :active (not package--downloads-in-progress)]
     ["Redisplay buffer" revert-buffer :help "Update the buffer with current list of packages"]
@@ -2758,6 +2758,7 @@ package-menu-mode
   (setq tabulated-list-sort-key (cons "Status" nil))
   (add-hook 'tabulated-list-revert-hook #'package-menu--refresh nil t)
   (tabulated-list-init-header)
+  (setq revert-buffer-function 'package-menu--refresh)
   (setf imenu-prev-index-position-function
         #'package--imenu-prev-index-position-function)
   (setf imenu-extract-index-name-function
@@ -3158,12 +3159,15 @@ package-menu--print-info-simple
 (defvar package-menu--old-archive-contents nil
   "`package-archive-contents' before the latest refresh.")
 
-(defun package-menu-refresh ()
+(defun package-menu--refresh (&optional _arg _noconfirm)
   "In Package Menu, download the Emacs Lisp package archive.
 Fetch the contents of each archive specified in
 `package-archives', and then refresh the package menu.  Signal a
-user-error if there is already a refresh running asynchronously."
-  (interactive)
+user-error if there is already a refresh running asynchronously.
+
+`package-menu-mode' sets `revert-buffer-function' to this
+function.  The args ARG and NOCONFIRM, passed from
+`revert-buffer', are ignored."
   (unless (derived-mode-p 'package-menu-mode)
     (user-error "The current buffer is not a Package Menu"))
   (when (and package-menu-async package--downloads-in-progress)
@@ -3171,6 +3175,7 @@ package-menu-refresh
   (setq package-menu--old-archive-contents package-archive-contents)
   (setq package-menu--new-package-list nil)
   (package-refresh-contents package-menu-async))
+(define-obsolete-function-alias 'package-menu-refresh 'revert-buffer "27.1")
 
 (defun package-menu-hide-package ()
   "Hide a package under point in Package Menu.
@@ -3634,7 +3639,7 @@ list-packages
       (package-menu-mode)
 
       ;; Fetch the remote list of packages.
-      (unless no-fetch (package-menu-refresh))
+      (unless no-fetch (package-menu--refresh))
 
       ;; If we're not async, this would be redundant.
       (when package-menu-async
-- 
2.20.1