diff options
| author | Artur Malabarba | 2015-04-28 22:29:26 +0100 |
|---|---|---|
| committer | Artur Malabarba | 2015-04-28 22:29:50 +0100 |
| commit | 301514f2bfd49ce1c01724dcbbcded2c2736f858 (patch) | |
| tree | ee2ff63604fbc90c9dfd6282311f3a6adada4d97 /lisp | |
| parent | 25166a91fdec1ef9721fe7440b9f8af809134e7d (diff) | |
| download | emacs-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.
Diffstat (limited to 'lisp')
| -rw-r--r-- | 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 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'. |
| 2502 | PKG-LIST must be a list of package-desc objects sorted by | 2502 | PKG-LIST must be a list of package-desc objects, all with the |
| 2503 | decreasing version number. | 2503 | same name, sorted by decreasing `package-desc-priority-version'. |
| 2504 | Return a list of packages tied for the highest priority according | 2504 | Return a list of packages tied for the highest priority according |
| 2505 | to their archives." | 2505 | to 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 |