Commit e4eb8c85 authored by Eric Abrahamsen's avatar Eric Abrahamsen

Fix Gnus group sorting to use gnus-group-list

* lisp/gnus/gnus-group.el (gnus-group-sort-flat): As
  gnus-newsrc-hashtb is now a real (unsorted) hash table, use
  gnus-group-list to maintain group sort order.
  (gnus-group-sort-selected-flat): Ditto.
* lisp/gnus/gnus-start.el (gnus-subscribe-alphabetically): Simplify
  function using seq-find.
  (gnus-subscribe-killed, gnus-subscribe-zombies): Use cl-pushnew to
  avoid adding duplicates (can happen when un/subscribing multiple
  times to one group).
parent d86235fe
Pipeline #1736 failed with stage
in 55 minutes and 58 seconds
......@@ -3300,21 +3300,31 @@ If REVERSE (the prefix), reverse the sorting order."
(funcall gnus-group-sort-alist-function
(gnus-make-sort-function func) reverse)
;; Redisplay all groups according to the newly-sorted order of
;; `gnus-group-list'.
(defun gnus-group-sort-flat (func reverse)
;; We peel off the dummy group from the alist.
"Sort groups in a flat list using sorting function FUNC.
If REVERSE is non-nil, reverse the sort order.
This function sets a new value for `gnus-group-list'; its return
value is disregarded."
(when func
(when (equal (gnus-info-group (car gnus-newsrc-alist)) "")
(pop gnus-newsrc-alist))
;; Do the sorting.
(setq gnus-newsrc-alist
(sort gnus-newsrc-alist func))
(when reverse
(setq gnus-newsrc-alist (nreverse gnus-newsrc-alist)))
;; Regenerate the hash table.
(let* ((groups (remove "" gnus-group-list))
(sort (mapcar (lambda (g)
(gnus-get-info g))
(setq gnus-group-list
(mapcar (lambda (i)
(gnus-info-group i))
(when reverse
(setq gnus-group-list (nreverse gnus-group-list)))
(setq gnus-group-list (cons "" gnus-group-list)))))
(defun gnus-group-sort-groups-by-alphabet (&optional reverse)
"Sort the group buffer alphabetically by group name.
......@@ -3377,27 +3387,26 @@ If REVERSE, sort in reverse order."
(defun gnus-group-sort-selected-flat (groups func reverse)
(let (entries infos)
;; First find all the group entries for these groups.
(while groups
(push (nthcdr 2 (gnus-group-entry (pop groups)))
;; Then sort the infos.
(setq infos
(lambda (entry) (car entry))
(setq entries (nreverse entries)))
"Sort only the selected GROUPS, using FUNC.
If REVERSE is non-nil, reverse the sorting."
(let ((infos (sort
(mapcar (lambda (g)
(gnus-get-info g))
(when reverse
(setq infos (nreverse infos)))
;; Go through all the infos and replace the old entries
;; with the new infos.
(while infos
(setcar (car entries) (pop infos))
(pop entries))
;; Update the hashtable.
(setq sorted-groups (mapcar (lambda (i) (gnus-info-group i)) infos))
;; Find the original locations of GROUPS in `gnus-group-list', and
;; replace each one, in order, with a group from SORTED-GROUPS.
(dolist (i (sort (mapcar (lambda (g)
(seq-position gnus-group-list g))
(setf (nth i gnus-group-list)
(pop sorted-groups)))))
(defun gnus-group-sort-selected-groups-by-alphabet (&optional n reverse)
"Sort the group buffer alphabetically by group name.
......@@ -583,12 +583,9 @@ Can be used to turn version control on or off."
(defun gnus-subscribe-alphabetically (newgroup)
"Subscribe new NEWGROUP and insert it in alphabetical order."
(let ((groups (cdr gnus-newsrc-alist))
(while (and (not before) groups)
(if (string< newgroup (caar groups))
(setq before (caar groups))
(setq groups (cdr groups))))
(let ((before (seq-find (lambda (group)
(string< newgroup group))
(cdr gnus-group-list))))
(gnus-subscribe-newsgroup newgroup before)))
(defun gnus-subscribe-hierarchically (newgroup)
......@@ -618,15 +615,15 @@ It is inserted in hierarchical newsgroup order if subscribed. If not,
it is killed."
(if (gnus-y-or-n-p (format "Subscribe new newsgroup %s? " group))
(gnus-subscribe-hierarchically group)
(push group gnus-killed-list)))
(gnus-subscribe-killed group)))
(defun gnus-subscribe-zombies (group)
"Make the new GROUP into a zombie group."
(push group gnus-zombie-list))
(cl-pushnew group gnus-zombie-list :test #'equal))
(defun gnus-subscribe-killed (group)
"Make the new GROUP a killed group."
(push group gnus-killed-list))
(cl-pushnew group gnus-killed-list :test #'equal))
(defun gnus-subscribe-newsgroup (newsgroup &optional next)
"Subscribe new NEWSGROUP.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment