From 59544391f22f14b11088327334dd2741fbe9f0a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Jul 2017 13:41:54 +0200 Subject: [PATCH] Refactor doom-get-packages Adds an INSTALLED-ONLY-P argument to doom-get-packages. Fixes a missing-package error when doom-get-outdated-packages iterates over packages that aren't installed. Plus, updated unit tests. --- core/autoload/packages.el | 16 +++++---- core/test/autoload-package.el | 63 ++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index f4be10258..57594771e 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -80,7 +80,7 @@ list of the package." (plist-get (cdr (assq name doom-packages)) prop)) ;;;###autoload -(defun doom-get-packages () +(defun doom-get-packages (&optional installed-only-p) "Retrieves a list of explicitly installed packages (i.e. non-dependencies). Each element is a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe (if any). @@ -89,13 +89,17 @@ BACKEND can be 'quelpa or 'elpa, and will instruct this function to return only the packages relevant to that backend. Warning: this function is expensive; it re-evaluates all of doom's config files. -Be careful not to use it in a loop." +Be careful not to use it in a loop. + +If INSTALLED-ONLY-P, only return packages that are installed." (doom-initialize-packages t) (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) for sym in (cl-delete-duplicates packages) - if (or (assq sym doom-packages) - (and (assq sym package-alist) - (list sym))) + if (and (or (not installed-only-p) + (package-installed-p sym)) + (or (assq sym doom-packages) + (and (assq sym package-alist) + (list sym)))) collect it)) ;;;###autoload @@ -121,7 +125,7 @@ If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom/packages-update'." (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages - (dolist (pkg (doom-get-packages)) + (dolist (pkg (doom-get-packages t)) (let ((sym (car pkg))) (when (and (or (not (doom-package-prop sym :freeze)) include-frozen-p) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el index e2c59e91a..23db6873e 100644 --- a/core/test/autoload-package.el +++ b/core/test/autoload-package.el @@ -18,6 +18,14 @@ affects your Emacs packages)." (package-initialize) ,@forms)) +(defmacro -with-packages! (packages package-descs &rest body) + `(let ((doom-packages ,packages) + (package-alist ,package-descs) + doom-core-packages) + (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _))) + ((symbol-function 'package-installed-p) (lambda (name &rest _) (assq name package-alist)))) + ,@body))) + ;; ;; Tests @@ -31,45 +39,40 @@ affects your Emacs packages)." (should (eq (doom-package-backend 'doom-quelpa-dummy) 'quelpa)))) (def-test! elpa-outdated-detection - (cl-letf (((symbol-function 'package-refresh-contents) (lambda (&rest _)))) - (let* ((doom--last-refresh (current-time)) - (package-alist - `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234))))) - (package-archive-contents - `((doom-dummy ,(-new-package 'doom-dummy '(20170405 1234))))) - (outdated (doom-package-outdated-p 'doom-dummy))) - (should outdated) - (should (equal outdated '(doom-dummy (20160405 1234) (20170405 1234))))))) + (let* ((doom--last-refresh (current-time)) + (package-alist + `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234))))) + (package-archive-contents + `((doom-dummy ,(-new-package 'doom-dummy '(20170405 1234)))))) + (cl-letf (((symbol-function 'package-refresh-contents) (lambda (&rest _)))) + (should (equal (doom-package-outdated-p 'doom-dummy) + '(doom-dummy (20160405 1234) (20170405 1234))))))) ;; TODO quelpa-outdated-detection (def-test! get-packages - (let ((quelpa-initialized-p t) - (doom-packages '((doom-dummy))) - (package-alist - `((doom-dummy nil) - (doom-dummy-dep nil))) - doom-core-packages) - (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _)))) - (should (equal (doom-get-packages) '((doom-dummy))))))) + (let ((quelpa-initialized-p t)) + (-with-packages! + '((doom-dummy)) + '((doom-dummy nil) + (doom-dummy-unwanted nil) + (doom-dummy-dep nil)) + (should (equal (doom-get-packages) '((doom-dummy))))))) (def-test! orphaned-packages "Test `doom-get-orphaned-packages', which gets a list of packages that are no longer enabled or depended on." - (let ((doom-packages '((doom-dummy))) - (package-alist - `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234) '((doom-dummy-dep (1 0))))) - (doom-dummy-unwanted ,(-new-package 'doom-dummy-unwanted '(20160601 1234))) - (doom-dummy-dep ,(-new-package 'doom-dummy-dep '(20160301 1234))))) - doom-core-packages) - (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _)))) - (should (equal (doom-get-orphaned-packages) '(doom-dummy-unwanted)))))) + (-with-packages! + '((doom-dummy)) + `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234) '((doom-dummy-dep (1 0))))) + (doom-dummy-unwanted ,(-new-package 'doom-dummy-unwanted '(20160601 1234))) + (doom-dummy-dep ,(-new-package 'doom-dummy-dep '(20160301 1234)))) + (should (equal (doom-get-orphaned-packages) '(doom-dummy-unwanted))))) (def-test! missing-packages "Test `doom-get-missing-packages, which gets a list of enabled packages that aren't installed." - (let ((doom-packages '((doom-dummy) (doom-dummy-installed))) - (package-alist `((doom-dummy-installed ,(-new-package 'doom-dummy-installed '(20160405 1234))))) - doom-core-packages) - (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _)))) - (should (equal (doom-get-missing-packages) '((doom-dummy))))))) + (-with-packages! + '((doom-dummy) (doom-dummy-installed)) + `((doom-dummy-installed ,(-new-package 'doom-dummy-installed '(20160405 1234)))) + (should (equal (doom-get-missing-packages) '((doom-dummy))))))