emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 301514f: * lisp/emacs-lisp/package.el: Fix priority


From: Artur Malabarba
Subject: [Emacs-diffs] master 301514f: * lisp/emacs-lisp/package.el: Fix priority-hiding corner case
Date: Tue, 28 Apr 2015 21:30:00 +0000

branch: master
commit 301514f2bfd49ce1c01724dcbbcded2c2736f858
Author: Artur Malabarba <address@hidden>
Commit: Artur Malabarba <address@hidden>

    * lisp/emacs-lisp/package.el: Fix priority-hiding corner case
    
    (package-menu--refresh): Delegate obsolete-hiding to
    `package--remove-hidden'.
    (package--remove-hidden): Disregard high-priority package if it is
    older than the installed one.
---
 lisp/emacs-lisp/package.el |   69 +++++++++++++++++++++++++------------------
 1 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index bb9a3bb..84b6987 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2499,29 +2499,43 @@ Installed obsolete packages are always displayed.")
 
 (defun package--remove-hidden (pkg-list)
   "Filter PKG-LIST according to `package-archive-priorities'.
-PKG-LIST must be a list of package-desc objects sorted by
-decreasing version number.
+PKG-LIST must be a list of package-desc objects, all with the
+same name, sorted by decreasing `package-desc-priority-version'.
 Return a list of packages tied for the highest priority according
 to their archives."
   (when pkg-list
-    ;; The first is a variable toggled with
-    ;; `package-menu-hide-obsolete', the second is a static user
-    ;; option that defines *what* we hide.
-    (if (and package-menu--hide-obsolete
-             package-menu-hide-low-priority)
-        (let ((max-priority (package-desc-priority (car pkg-list)))
-              (out (list (pop pkg-list))))
-          (dolist (p pkg-list (nreverse out))
-            (let ((priority (package-desc-priority p)))
-              (cond
-               ((> priority max-priority)
-                (setq max-priority priority)
-                (setq out (list p)))
-               ;; This assumes pkg-list is sorted by version number.
-               ((and (= priority max-priority)
-                     (eq package-menu-hide-low-priority 'archive))
-                (push p out))))))
-      pkg-list)))
+    ;; Variable toggled with `package-menu-hide-obsolete'.
+    (if (not package-menu--hide-obsolete)
+        pkg-list
+      (let ((installed (cadr (assq (package-desc-name (car pkg-list))
+                                   package-alist))))
+        (when installed
+          (setq pkg-list
+                (let ((ins-version (package-desc-version installed)))
+                  (cl-remove-if (lambda (p) (version-list-< 
(package-desc-version p)
+                                                       ins-version))
+                                pkg-list))))
+        (let ((filtered-by-priority
+               (cond
+                ((not package-menu-hide-low-priority)
+                 pkg-list)
+                ((eq package-menu-hide-low-priority 'archive)
+                 (let* ((max-priority most-negative-fixnum)
+                        (out))
+                   (while pkg-list
+                     (let ((p (pop pkg-list)))
+                       (if (>= (package-desc-priority p) max-priority)
+                           (push p out)
+                         (setq pkg-list nil))))
+                   (nreverse out)))
+                (pkg-list
+                 (list (car pkg-list))))))
+          (if (not installed)
+              filtered-by-priority
+            (let ((ins-version (package-desc-version installed)))
+              (cl-remove-if (lambda (p) (version-list-= (package-desc-version 
p)
+                                                   ins-version))
+                            filtered-by-priority))))))))
 
 (defun package-menu--refresh (&optional packages keywords)
   "Re-populate the `tabulated-list-entries'.
@@ -2550,15 +2564,12 @@ KEYWORDS should be nil or a list of keywords."
 
     ;; Available and disabled packages:
     (dolist (elt package-archive-contents)
-      (setq name (car elt))
-      (when (or (eq packages t) (memq name packages))
-        (dolist (pkg (package--remove-hidden (cdr elt)))
-          ;; Hide available obsolete packages.
-          (when (and (not (and package-menu--hide-obsolete
-                               (package-installed-p (package-desc-name pkg)
-                                                    (package-desc-version 
pkg))))
-                     (package--has-keyword-p pkg keywords))
-            (package--push pkg (package-desc-status pkg) info-list)))))
+      (let ((name (car elt)))
+        (when (or (eq packages t) (memq name packages))
+          ;; Hide available-obsolete or low-priority packages.
+          (dolist (pkg (package--remove-hidden (cdr elt)))
+            (when (package--has-keyword-p pkg keywords)
+              (package--push pkg (package-desc-status pkg) info-list))))))
 
     ;; Print the result.
     (setq tabulated-list-entries



reply via email to

[Prev in Thread] Current Thread [Next in Thread]