aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Malabarba2015-04-28 22:29:26 +0100
committerArtur Malabarba2015-04-28 22:29:50 +0100
commit301514f2bfd49ce1c01724dcbbcded2c2736f858 (patch)
treeee2ff63604fbc90c9dfd6282311f3a6adada4d97
parent25166a91fdec1ef9721fe7440b9f8af809134e7d (diff)
downloademacs-301514f2bfd49ce1c01724dcbbcded2c2736f858.tar.gz
emacs-301514f2bfd49ce1c01724dcbbcded2c2736f858.zip
* 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.
-rw-r--r--lisp/emacs-lisp/package.el69
1 files changed, 40 insertions, 29 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index bb9a3bb8229..84b6987a21a 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2499,29 +2499,43 @@ Installed obsolete packages are always displayed.")
2499 2499
2500(defun package--remove-hidden (pkg-list) 2500(defun package--remove-hidden (pkg-list)
2501 "Filter PKG-LIST according to `package-archive-priorities'. 2501 "Filter PKG-LIST according to `package-archive-priorities'.
2502PKG-LIST must be a list of package-desc objects sorted by 2502PKG-LIST must be a list of package-desc objects, all with the
2503decreasing version number. 2503same name, sorted by decreasing `package-desc-priority-version'.
2504Return a list of packages tied for the highest priority according 2504Return a list of packages tied for the highest priority according
2505to their archives." 2505to their archives."
2506 (when pkg-list 2506 (when pkg-list
2507 ;; The first is a variable toggled with 2507 ;; Variable toggled with `package-menu-hide-obsolete'.
2508 ;; `package-menu-hide-obsolete', the second is a static user 2508 (if (not package-menu--hide-obsolete)
2509 ;; option that defines *what* we hide. 2509 pkg-list
2510 (if (and package-menu--hide-obsolete 2510 (let ((installed (cadr (assq (package-desc-name (car pkg-list))
2511 package-menu-hide-low-priority) 2511 package-alist))))
2512 (let ((max-priority (package-desc-priority (car pkg-list))) 2512 (when installed
2513 (out (list (pop pkg-list)))) 2513 (setq pkg-list
2514 (dolist (p pkg-list (nreverse out)) 2514 (let ((ins-version (package-desc-version installed)))
2515 (let ((priority (package-desc-priority p))) 2515 (cl-remove-if (lambda (p) (version-list-< (package-desc-version p)
2516 (cond 2516 ins-version))
2517 ((> priority max-priority) 2517 pkg-list))))
2518 (setq max-priority priority) 2518 (let ((filtered-by-priority
2519 (setq out (list p))) 2519 (cond
2520 ;; This assumes pkg-list is sorted by version number. 2520 ((not package-menu-hide-low-priority)
2521 ((and (= priority max-priority) 2521 pkg-list)
2522 (eq package-menu-hide-low-priority 'archive)) 2522 ((eq package-menu-hide-low-priority 'archive)
2523 (push p out)))))) 2523 (let* ((max-priority most-negative-fixnum)
2524 pkg-list))) 2524 (out))
2525 (while pkg-list
2526 (let ((p (pop pkg-list)))
2527 (if (>= (package-desc-priority p) max-priority)
2528 (push p out)
2529 (setq pkg-list nil))))
2530 (nreverse out)))
2531 (pkg-list
2532 (list (car pkg-list))))))
2533 (if (not installed)
2534 filtered-by-priority
2535 (let ((ins-version (package-desc-version installed)))
2536 (cl-remove-if (lambda (p) (version-list-= (package-desc-version p)
2537 ins-version))
2538 filtered-by-priority))))))))
2525 2539
2526(defun package-menu--refresh (&optional packages keywords) 2540(defun package-menu--refresh (&optional packages keywords)
2527 "Re-populate the `tabulated-list-entries'. 2541 "Re-populate the `tabulated-list-entries'.
@@ -2550,15 +2564,12 @@ KEYWORDS should be nil or a list of keywords."
2550 2564
2551 ;; Available and disabled packages: 2565 ;; Available and disabled packages:
2552 (dolist (elt package-archive-contents) 2566 (dolist (elt package-archive-contents)
2553 (setq name (car elt)) 2567 (let ((name (car elt)))
2554 (when (or (eq packages t) (memq name packages)) 2568 (when (or (eq packages t) (memq name packages))
2555 (dolist (pkg (package--remove-hidden (cdr elt))) 2569 ;; Hide available-obsolete or low-priority packages.
2556 ;; Hide available obsolete packages. 2570 (dolist (pkg (package--remove-hidden (cdr elt)))
2557 (when (and (not (and package-menu--hide-obsolete 2571 (when (package--has-keyword-p pkg keywords)
2558 (package-installed-p (package-desc-name pkg) 2572 (package--push pkg (package-desc-status pkg) info-list))))))
2559 (package-desc-version pkg))))
2560 (package--has-keyword-p pkg keywords))
2561 (package--push pkg (package-desc-status pkg) info-list)))))
2562 2573
2563 ;; Print the result. 2574 ;; Print the result.
2564 (setq tabulated-list-entries 2575 (setq tabulated-list-entries