From 08561d8631153cee93c7348adb515aa217b5df7f Mon Sep 17 00:00:00 2001 From: Eivind Fonn Date: Wed, 21 Jun 2017 12:27:59 +0200 Subject: [PATCH] core: implement :depends for package declarations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This replaces the older pattern :toggle (configuration-layer/package-usedp ..) This implementation ensures that :disabled-for honors dependent packages, i.e. if package a depends on package b, which is owned by layer c, and layer c is disabled for layer d, then neither package a nor b will be configured for layer d. Previously, this was only true for package a, but not b. This commit also fixes: - configuration-layer/describe-package now shows which post-init and pre-init functions are disabled, if any - Does not recreate all layer objects unconditionally when calling configuration-layer/discover-layers. Previously, this led to all layers being recreated after e.g. `SPC h SPC`, without any of the dotfile information. Since this information is now necessary for configuration-layer/describe-package, it’s important that we don’t clear the indexed layers when invoking this function. --- core/core-configuration-layer.el | 119 +++++++++--- core/core-dotspacemacs.el | 10 +- layers/+chat/rcirc/packages.el | 2 +- .../+completion/auto-completion/packages.el | 4 +- layers/+completion/ivy/packages.el | 2 +- layers/+emacs/org/packages.el | 2 +- layers/+fun/emoji/packages.el | 2 +- layers/+fun/games/packages.el | 2 +- layers/+lang/c-c++/packages.el | 2 +- layers/+lang/common-lisp/packages.el | 5 +- layers/+lang/coq/packages.el | 2 +- layers/+lang/d/packages.el | 4 +- layers/+lang/elm/packages.el | 2 +- layers/+lang/go/packages.el | 2 +- layers/+lang/gpu/packages.el | 4 +- layers/+lang/haskell/packages.el | 6 +- layers/+lang/html/packages.el | 4 +- layers/+lang/java/packages.el | 2 +- layers/+lang/javascript/packages.el | 2 +- layers/+lang/latex/packages.el | 2 +- layers/+lang/lua/packages.el | 2 +- layers/+lang/major-modes/packages.el | 2 +- layers/+lang/perl6/packages.el | 2 +- layers/+lang/php/packages.el | 2 +- layers/+lang/python/packages.el | 4 +- layers/+lang/restructuredtext/packages.el | 2 +- layers/+lang/rust/packages.el | 2 +- layers/+lang/shell-scripts/packages.el | 2 +- layers/+os/nixos/packages.el | 2 +- layers/+source-control/git/packages.el | 4 +- .../+spacemacs/spacemacs-purpose/packages.el | 2 +- layers/+tags/cscope/packages.el | 2 +- layers/+tags/gtags/packages.el | 2 +- layers/+tools/ansible/packages.el | 2 +- layers/+tools/dash/packages.el | 4 +- layers/+tools/finance/packages.el | 2 +- layers/+tools/restclient/packages.el | 4 +- layers/+tools/ycmd/packages.el | 4 +- layers/+web-services/spotify/packages.el | 2 +- tests/core/core-configuration-layer-ftest.el | 4 +- tests/core/core-configuration-layer-utest.el | 180 ++++++++++++++++-- 41 files changed, 320 insertions(+), 92 deletions(-) diff --git a/core/core-configuration-layer.el b/core/core-configuration-layer.el index e232f0156389..16757b446dc1 100644 --- a/core/core-configuration-layer.el +++ b/core/core-configuration-layer.el @@ -163,9 +163,9 @@ If PROPS is non-nil then return packages as lists with their properties" :type list :documentation "List of layers with a pre-init function.") (post-layers :initarg :post-layers - :initform '() - :type list - :documentation "List of layers with a post-init function.") + :initform '() + :type list + :documentation "List of layers with a post-init function.") (location :initarg :location :initform elpa :type (satisfies (lambda (x) @@ -196,9 +196,14 @@ If PROPS is non-nil then return packages as lists with their properties" :initform nil :type boolean :documentation - "If non-nil this package is excluded from all layers."))) - -(defmethod cfgl-package-enabledp ((pkg cfgl-package) &optional inhibit-messages) + "If non-nil this package is excluded from all layers.") + (depends :initarg :depends + :initform nil + :type list + :documentation + "Packages that must be enabled for this package to be enabled."))) + +(defmethod cfgl-package-toggled-p ((pkg cfgl-package) &optional inhibit-messages) "Evaluate the `toggle' slot of passed PKG. If INHIBIT-MESSAGES is non nil then any message emitted by the toggle evaluation is ignored." @@ -206,6 +211,27 @@ is ignored." (toggle (oref pkg :toggle))) (eval toggle))) +(defmethod cfgl-package-deps-satisfied-p ((pkg cfgl-package) &optional inhibit-messages) + "Check if dependencies of a package are all enabled. +If INHIBIT-MESSAGES is non nil then any message emitted by the toggle evaluation +is ignored." + (not (memq nil (mapcar + (lambda (dep-pkg) + (let ((pkg-obj (configuration-layer/get-package dep-pkg))) + (when pkg-obj + (cfgl-package-enabled-p pkg-obj inhibit-messages)))) + (oref pkg :depends))))) + +(defmethod cfgl-package-enabled-p ((pkg cfgl-package) &optional inhibit-messages) + "Check if a package is enabled. +This checks the excluded property, evaluates the toggle, if any, and recursively +checks whether dependent packages are also enabled. +If INHIBIT-MESSAGES is non nil then any message emitted by the toggle evaluation +is ignored." + (and (or (oref pkg :protected) (not (oref pkg :excluded))) + (cfgl-package-deps-satisfied-p pkg inhibit-messages) + (cfgl-package-toggled-p pkg inhibit-messages))) + (defmethod cfgl-package-get-safe-owner ((pkg cfgl-package)) "Safe method to return the name of the layer which owns PKG." ;; The owner of a package is the first *used* layer in `:owners' slot. @@ -421,12 +447,12 @@ If NO-INSTALL is non nil then install steps are skipped." (spacemacs-buffer//inject-version)) ;; declare used layers then packages as soon as possible to resolve ;; usage and ownership - (configuration-layer/discover-layers) + (configuration-layer/discover-layers 'refresh-index) (configuration-layer//declare-used-layers dotspacemacs-configuration-layers) (configuration-layer//declare-used-packages configuration-layer--used-layers) ;; then load the functions and finally configure the layers (configuration-layer//load-layers-files configuration-layer--used-layers - '("funcs.el")) + '("funcs.el")) (configuration-layer//configure-layers configuration-layer--used-layers) ;; pre-filter some packages to save some time later in the loading process (setq configuration-layer--used-distant-packages @@ -469,7 +495,7 @@ If NO-INSTALL is non nil then install steps are skipped." ;; configure used packages (configuration-layer//configure-packages configuration-layer--used-packages) (configuration-layer//load-layers-files configuration-layer--used-layers - '("keybindings.el")) + '("keybindings.el")) (run-hooks 'configuration-layer-post-sync-hook)) (defun configuration-layer/load-auto-layer-file () @@ -606,6 +632,8 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (min-version (when (listp pkg) (plist-get (cdr pkg) :min-version))) (step (when (listp pkg) (plist-get (cdr pkg) :step))) (toggle (when (listp pkg) (plist-get (cdr pkg) :toggle))) + (depends (when (listp pkg) (plist-get (cdr pkg) :depends))) + (depends (if (listp depends) depends (list depends))) (excluded (when (listp pkg) (plist-get (cdr pkg) :excluded))) (location (when (listp pkg) (plist-get (cdr pkg) :location))) (protected (when (listp pkg) (plist-get (cdr pkg) :protected))) @@ -623,7 +651,10 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (when min-version (cfgl-package-set-property obj :min-version (version-to-list min-version))) (when step (cfgl-package-set-property obj :step step)) - (when toggle (cfgl-package-set-property obj :toggle toggle)) + (when toggle + (cfgl-package-set-property obj :toggle toggle)) + (when (and ownerp depends) + (cfgl-package-set-property obj :depends depends)) (cfgl-package-set-property obj :excluded (and (configuration-layer/layer-usedp layer-name) (or excluded (oref obj :excluded)))) @@ -682,6 +713,12 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (format (concat "Ignoring :toggle for package %s because " "layer %S does not own it.") pkg-name layer-name))) + ;; check if depends can be applied + (when (and (not ownerp) depends) + (configuration-layer//warning + (format (concat "Ignoring :depends for package %s because " + "layer %S does not own it.") + pkg-name layer-name))) (when (fboundp pre-init-func) (object-add-to-list obj :pre-layers layer-name)) (when (fboundp post-init-func) @@ -704,6 +741,12 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (purecopy (concat "mouse-2, RET: " "visit the Spacemacs dotfile where variable is defined."))) +(define-button-type 'help-describe-package + :supertype 'help-xref + 'help-function 'configuration-layer/describe-package + 'help-echo + (purecopy (concat "mouse-2, RET: show a description of this package."))) + (defun configuration-layer/describe-package (pkg-symbol &optional layer-list pkg-list) "Describe a package in the context of the configuration layer system." @@ -754,11 +797,22 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." ;; toggle (unless (or (oref pkg :excluded) (eq t (oref pkg :toggle))) (princ "\nA toggle is defined for this package, it is currently ") - (princ (if (cfgl-package-enabledp pkg t) "on" "off")) + (princ (if (cfgl-package-toggled-p pkg t) "on" "off")) (princ " because the following expression evaluates to ") - (princ (if (cfgl-package-enabledp pkg t) "t:\n" "nil:\n")) + (princ (if (cfgl-package-toggled-p pkg t) "t:\n" "nil:\n")) (princ (oref pkg :toggle)) (princ "\n")) + (when (oref pkg :depends) + (princ "\nThis package depends on the following packages: ") + (dolist (dep-pkg (oref pkg :depends)) + (princ (concat "`" (symbol-name dep-pkg) "' ")) + (with-current-buffer standard-output + (save-excursion + (re-search-backward "`\\([^`']+\\)'" nil t) + (help-xref-button 1 'help-describe-package dep-pkg)))) + (princ "\nThese dependencies are currently ") + (princ (if (cfgl-package-deps-satisfied-p pkg t) "" "not ")) + (princ "satisfied.\n")) (unless (oref pkg :excluded) ;; usage and installation (if (not (configuration-layer/package-usedp pkg-symbol)) @@ -838,7 +892,9 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (help-xref-button 1 'help-function-def (intern (format "%S/pre-init-%S" layer-sym pkg-symbol)) - path)))) + path))) + (unless (configuration-layer//package-enabled-p pkg layer-sym) + (princ " (disabled)"))) (princ " ")) (princ "\n")) (when (oref pkg post-layers) @@ -853,7 +909,9 @@ If TOGGLEP is nil then `:toggle' parameter is ignored." (help-xref-button 1 'help-function-def (intern (format "%S/post-init-%S" layer-sym pkg-symbol)) - path)))) + path))) + (unless (configuration-layer//package-enabled-p pkg layer-sym) + (princ " (disabled)"))) (princ " ")) (princ "\n")))) (princ (concat "\nClick [here] to display an Emacs description " @@ -1048,7 +1106,7 @@ return both used and unused packages." (or (null usedp) (and (not (null (oref pkg :owners))) (not (oref pkg :excluded)) - (cfgl-package-enabledp pkg t)))))))) + (cfgl-package-enabled-p pkg t)))))))) (defun configuration-layer//get-private-layer-dir (name) "Return an absolute path to the private configuration layer string NAME." @@ -1114,12 +1172,15 @@ Returns nil if the directory is not a category." (when (string-match "^+" dirname) (intern (substring dirname 1)))))) -(defun configuration-layer/discover-layers () - "Initialize `configuration-layer--indexed-layers' with layer directories." +(defun configuration-layer/discover-layers (&optional refresh-index) + "Initialize `configuration-layer--indexed-layers' with layer directories. +If REFRESH-INDEX is non-nil, the layer index is cleared before +discovery." ;; load private layers at the end on purpose we asume that the user layers ;; must have the final word on configuration choices. Let ;; `dotspacemacs-directory' override the private directory if it exists. - (setq configuration-layer--indexed-layers (make-hash-table :size 1024)) + (when refresh-index + (setq configuration-layer--indexed-layers (make-hash-table :size 1024))) (spacemacs-buffer/set-mode-line "Indexing layers...") (spacemacs//redisplay) (let ((search-paths (append @@ -1186,8 +1247,10 @@ Returns nil if the directory is not a category." "-> Discovered configuration layer: %s" layer-name-str) (let ((configuration-layer--load-packages-files nil)) (configuration-layer//add-layer - (configuration-layer/make-layer layer-name - nil nil sub)))))) + (configuration-layer/make-layer + layer-name + (configuration-layer/get-layer layer-name) + nil sub)))))) (t ;; layer not found, add it to search path (setq search-paths (cons sub search-paths))))))))))) @@ -1575,8 +1638,8 @@ wether the declared layer is an used one or not." ((null (oref pkg :owners)) (spacemacs-buffer/message (format "%S ignored since it has no owner layer." pkg-name))) - ((not (cfgl-package-enabledp pkg)) - (spacemacs-buffer/message (format "%S is toggled off." pkg-name))) + ((not (cfgl-package-enabled-p pkg)) + (spacemacs-buffer/message (format "%S is disabled." pkg-name))) (t ;; load-path (let ((dir (configuration-layer/get-location-directory @@ -1622,9 +1685,15 @@ LAYER must not be the owner of PKG." (let* ((owner (configuration-layer/get-layer (car (oref pkg :owners)))) (disabled (oref owner :disabled-for)) (enabled (oref owner :enabled-for))) - (if (not (eq 'unspecified enabled)) - (memq layer enabled) - (not (memq layer disabled))))) + (and (not (memq nil (mapcar + (lambda (dep-pkg) + (let ((pkg-obj (configuration-layer/get-package dep-pkg))) + (when pkg-obj + (configuration-layer//package-enabled-p pkg-obj layer)))) + (oref pkg :depends)))) + (if (not (eq 'unspecified enabled)) + (memq layer enabled) + (not (memq layer disabled)))))) (defun configuration-layer//configure-package (pkg) "Configure PKG object." diff --git a/core/core-dotspacemacs.el b/core/core-dotspacemacs.el index 5cc169e5e330..2e88ed30c2a6 100644 --- a/core/core-dotspacemacs.el +++ b/core/core-dotspacemacs.el @@ -791,7 +791,7 @@ error recovery." "Test settings in dotfile for correctness. Return non-nil if all the tests passed." (interactive) - (configuration-layer/discover-layers) + (configuration-layer/discover-layers 'refresh-index) (let ((min-version "0.0")) ;; dotspacemacs-version not implemented yet ;; (if (version< dotspacemacs-version min-version) @@ -815,10 +815,10 @@ error recovery." (prog1 ;; execute all tests no matter what (cl-reduce (lambda (x y) - (and (funcall y) x)) - '(dotspacemacs//test-dotspacemacs/layers - dotspacemacs//test-dotspacemacs/init) - :initial-value t) + (and (funcall y) x)) + '(dotspacemacs//test-dotspacemacs/layers + dotspacemacs//test-dotspacemacs/init) + :initial-value t) (goto-char (point-min)))))))) (provide 'core-dotspacemacs) diff --git a/layers/+chat/rcirc/packages.el b/layers/+chat/rcirc/packages.el index b9f2812f73ea..c801845d09ab 100644 --- a/layers/+chat/rcirc/packages.el +++ b/layers/+chat/rcirc/packages.el @@ -5,7 +5,7 @@ emoji-cheat-sheet-plus flyspell (helm-rcirc :location local - :toggle (configuration-layer/package-usedp 'helm)) + :depends helm) persp-mode rcirc rcirc-color diff --git a/layers/+completion/auto-completion/packages.el b/layers/+completion/auto-completion/packages.el index 0e50b91ce47c..e2888448ff64 100644 --- a/layers/+completion/auto-completion/packages.el +++ b/layers/+completion/auto-completion/packages.el @@ -17,8 +17,8 @@ (company-quickhelp :toggle auto-completion-enable-help-tooltip) company-statistics fuzzy - (helm-company :toggle (configuration-layer/package-usedp 'helm)) - (helm-c-yasnippet :toggle (configuration-layer/package-usedp 'helm)) + (helm-company :depends helm) + (helm-c-yasnippet :depends helm) hippie-exp yasnippet auto-yasnippet diff --git a/layers/+completion/ivy/packages.el b/layers/+completion/ivy/packages.el index 0855d881fe97..d3a651f47f68 100644 --- a/layers/+completion/ivy/packages.el +++ b/layers/+completion/ivy/packages.el @@ -14,7 +14,7 @@ auto-highlight-symbol bookmark counsel - (counsel-projectile :toggle (configuration-layer/package-usedp 'projectile)) + (counsel-projectile :depends projectile) evil flx helm-make diff --git a/layers/+emacs/org/packages.el b/layers/+emacs/org/packages.el index 05d062b3bea4..ba90b7a59a71 100644 --- a/layers/+emacs/org/packages.el +++ b/layers/+emacs/org/packages.el @@ -30,7 +30,7 @@ (org-mime :location built-in) org-pomodoro org-present - (org-projectile :toggle (configuration-layer/package-usedp 'projectile)) + (org-projectile :depends projectile) (ox-twbs :toggle org-enable-bootstrap-support) ;; use a for of ox-gfm to fix index generation (ox-gfm :location (recipe :fetcher github :repo "syl20bnr/ox-gfm") diff --git a/layers/+fun/emoji/packages.el b/layers/+fun/emoji/packages.el index f58ca4716c9f..2d755bff2dbe 100644 --- a/layers/+fun/emoji/packages.el +++ b/layers/+fun/emoji/packages.el @@ -13,7 +13,7 @@ '( emoji-cheat-sheet-plus emojify - (company-emoji :toggle (configuration-layer/package-usedp 'company)) + (company-emoji :depends company) )) (defun emoji/init-emoji-cheat-sheet-plus () diff --git a/layers/+fun/games/packages.el b/layers/+fun/games/packages.el index 519b426190f6..4e57c276e26f 100644 --- a/layers/+fun/games/packages.el +++ b/layers/+fun/games/packages.el @@ -13,7 +13,7 @@ '( 2048-game (helm-games :location local - :toggle (configuration-layer/package-usedp 'helm)) + :depends helm) pacmacs (tetris :location built-in) sudoku diff --git a/layers/+lang/c-c++/packages.el b/layers/+lang/c-c++/packages.el index 34a4b713eb57..4ced77f115a6 100644 --- a/layers/+lang/c-c++/packages.el +++ b/layers/+lang/c-c++/packages.el @@ -16,7 +16,7 @@ clang-format cmake-mode company - (company-c-headers :toggle (configuration-layer/package-usedp 'company)) + (company-c-headers :depends company) company-ycmd flycheck gdb-mi diff --git a/layers/+lang/common-lisp/packages.el b/layers/+lang/common-lisp/packages.el index 60c72d54bd81..71dfd36813c8 100644 --- a/layers/+lang/common-lisp/packages.el +++ b/layers/+lang/common-lisp/packages.el @@ -11,14 +11,15 @@ (setq common-lisp-packages '(auto-highlight-symbol - (common-lisp-snippets :toggle (configuration-layer/package-usedp 'yasnippet)) + (common-lisp-snippets :depends yasnippet) evil ggtags helm helm-gtags parinfer slime - (slime-company :toggle (configuration-layer/package-usedp 'company)))) + (slime-company :depends company) + )) (defun common-lisp/post-init-auto-highlight-symbol () (with-eval-after-load 'auto-highlight-symbol diff --git a/layers/+lang/coq/packages.el b/layers/+lang/coq/packages.el index 7e6b07c7f3a1..4467e6c45132 100644 --- a/layers/+lang/coq/packages.el +++ b/layers/+lang/coq/packages.el @@ -11,7 +11,7 @@ (setq coq-packages '( - (company-coq :toggle (configuration-layer/package-usedp 'company)) + (company-coq :depends company) (proof-general :location (recipe :fetcher github :repo "ProofGeneral/PG" diff --git a/layers/+lang/d/packages.el b/layers/+lang/d/packages.el index d5c422ce3546..f661b61291ed 100644 --- a/layers/+lang/d/packages.el +++ b/layers/+lang/d/packages.el @@ -14,10 +14,10 @@ (setq d-packages '( company - (company-dcd :toggle (configuration-layer/package-usedp 'company)) + (company-dcd :depends company) d-mode flycheck - (flycheck-dmd-dub :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-dmd-dub :depends flycheck) ggtags helm-gtags )) diff --git a/layers/+lang/elm/packages.el b/layers/+lang/elm/packages.el index 32e7ef3c5ae3..00b8db6a476c 100644 --- a/layers/+lang/elm/packages.el +++ b/layers/+lang/elm/packages.el @@ -14,7 +14,7 @@ company elm-mode flycheck - (flycheck-elm :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-elm :depends flycheck) popwin smartparens )) diff --git a/layers/+lang/go/packages.el b/layers/+lang/go/packages.el index f193f07fbd78..2bddefd77eb1 100644 --- a/layers/+lang/go/packages.el +++ b/layers/+lang/go/packages.el @@ -11,7 +11,7 @@ (setq go-packages '( - (company-go :toggle (configuration-layer/package-usedp 'company)) + (company-go :depends company) flycheck (flycheck-gometalinter :toggle (and go-use-gometalinter (configuration-layer/package-usedp diff --git a/layers/+lang/gpu/packages.el b/layers/+lang/gpu/packages.el index c03b37bd06eb..87afd078c741 100644 --- a/layers/+lang/gpu/packages.el +++ b/layers/+lang/gpu/packages.el @@ -13,8 +13,8 @@ (company-glsl :location (recipe :fetcher github :repo "Kaali/company-glsl") - :toggle (and (configuration-layer/package-usedp 'company) - (executable-find "glslangValidator"))) + :depends company + :toggle (executable-find "glslangValidator")) cuda-mode glsl-mode opencl-mode diff --git a/layers/+lang/haskell/packages.el b/layers/+lang/haskell/packages.el index 3b573be82fc8..720b13ec8e1f 100644 --- a/layers/+lang/haskell/packages.el +++ b/layers/+lang/haskell/packages.el @@ -12,17 +12,17 @@ (setq haskell-packages '( cmm-mode - (company-cabal :toggle (configuration-layer/package-usedp 'company)) + (company-cabal :depends company) company-ghci company-ghc flycheck - (flycheck-haskell :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-haskell :depends flycheck) ggtags ghc haskell-mode haskell-snippets helm-gtags - (helm-hoogle :toggle (configuration-layer/package-usedp 'helm)) + (helm-hoogle :depends helm) hindent hlint-refactor intero diff --git a/layers/+lang/html/packages.el b/layers/+lang/html/packages.el index aa7153bed2b8..6115fd934c96 100644 --- a/layers/+lang/html/packages.el +++ b/layers/+lang/html/packages.el @@ -13,13 +13,13 @@ '( add-node-modules-path company - (company-web :toggle (configuration-layer/package-usedp 'company)) + (company-web :depends company) css-mode emmet-mode evil-matchit flycheck haml-mode - (helm-css-scss :toggle (configuration-layer/package-usedp 'helm)) + (helm-css-scss :depends helm) impatient-mode less-css-mode pug-mode diff --git a/layers/+lang/java/packages.el b/layers/+lang/java/packages.el index 129f314c4699..6c36e3d4a213 100644 --- a/layers/+lang/java/packages.el +++ b/layers/+lang/java/packages.el @@ -19,7 +19,7 @@ ensime flycheck (flycheck-eclim :location local - :toggle (configuration-layer/package-usedp 'flycheck)) + :depends flycheck) flyspell ggtags gradle-mode diff --git a/layers/+lang/javascript/packages.el b/layers/+lang/javascript/packages.el index 0db26104ce2e..78dc7336c235 100644 --- a/layers/+lang/javascript/packages.el +++ b/layers/+lang/javascript/packages.el @@ -14,7 +14,7 @@ add-node-modules-path coffee-mode company - (company-tern :toggle (configuration-layer/package-usedp 'company)) + (company-tern :depends company) evil-matchit flycheck ggtags diff --git a/layers/+lang/latex/packages.el b/layers/+lang/latex/packages.el index 1fe310e96e75..f1dcc1b3558a 100644 --- a/layers/+lang/latex/packages.el +++ b/layers/+lang/latex/packages.el @@ -13,7 +13,7 @@ '( auctex (auctex-latexmk :toggle (string= "LatexMk" latex-build-command)) - (company-auctex :toggle (configuration-layer/package-usedp 'company)) + (company-auctex :depends company) evil-matchit (reftex :location built-in) flycheck diff --git a/layers/+lang/lua/packages.el b/layers/+lang/lua/packages.el index 30c14b99caaf..c85ad9a98931 100644 --- a/layers/+lang/lua/packages.el +++ b/layers/+lang/lua/packages.el @@ -12,7 +12,7 @@ (setq lua-packages '( company - (company-lua :toggle (configuration-layer/package-usedp 'company)) + (company-lua :depends company) flycheck ggtags helm-gtags diff --git a/layers/+lang/major-modes/packages.el b/layers/+lang/major-modes/packages.el index 6eff5de3168c..f1ce0dc3b1e0 100644 --- a/layers/+lang/major-modes/packages.el +++ b/layers/+lang/major-modes/packages.el @@ -13,7 +13,7 @@ stan-mode thrift vala-mode - (vala-snippets :toggle (configuration-layer/package-usedp 'yasnippet)) + (vala-snippets :depends yasnippet) wolfram-mode )) diff --git a/layers/+lang/perl6/packages.el b/layers/+lang/perl6/packages.el index 4e9bf4f8106a..bef6254bfc4a 100644 --- a/layers/+lang/perl6/packages.el +++ b/layers/+lang/perl6/packages.el @@ -13,7 +13,7 @@ '(company evil flycheck - (flycheck-perl6 :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-perl6 :depends flycheck) perl6-mode )) diff --git a/layers/+lang/php/packages.el b/layers/+lang/php/packages.el index 8ba592a0a034..811000b5af74 100644 --- a/layers/+lang/php/packages.el +++ b/layers/+lang/php/packages.el @@ -21,7 +21,7 @@ php-mode phpcbf phpunit - (company-php :toggle (configuration-layer/package-usedp 'company)) + (company-php :depends company) )) (defun php/init-drupal-mode () diff --git a/layers/+lang/python/packages.el b/layers/+lang/python/packages.el index 649d7af5c1c8..8d78fd9eeeb4 100644 --- a/layers/+lang/python/packages.el +++ b/layers/+lang/python/packages.el @@ -13,7 +13,7 @@ '( anaconda-mode company - (company-anaconda :toggle (configuration-layer/package-usedp 'company)) + (company-anaconda :depends company) cython-mode eldoc evil-matchit @@ -21,7 +21,7 @@ ggtags helm-cscope helm-gtags - (helm-pydoc :toggle (configuration-layer/package-usedp 'helm)) + (helm-pydoc :depends helm) hy-mode live-py-mode (nose :location local) diff --git a/layers/+lang/restructuredtext/packages.el b/layers/+lang/restructuredtext/packages.el index 1d54af315088..2b76a16fb16d 100644 --- a/layers/+lang/restructuredtext/packages.el +++ b/layers/+lang/restructuredtext/packages.el @@ -12,7 +12,7 @@ (defconst restructuredtext-packages '( auto-complete - (auto-complete-rst :toggle (configuration-layer/package-usedp 'auto-complete)) + (auto-complete-rst :depends auto-complete) linum (rst :location built-in) (rst-directives :location local) diff --git a/layers/+lang/rust/packages.el b/layers/+lang/rust/packages.el index 902eb73a4d92..7f177115fd69 100644 --- a/layers/+lang/rust/packages.el +++ b/layers/+lang/rust/packages.el @@ -15,7 +15,7 @@ company racer flycheck - (flycheck-rust :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-rust :depends flycheck) ggtags exec-path-from-shell helm-gtags diff --git a/layers/+lang/shell-scripts/packages.el b/layers/+lang/shell-scripts/packages.el index 7c7b65b3c6c4..35dddadb3b2a 100644 --- a/layers/+lang/shell-scripts/packages.el +++ b/layers/+lang/shell-scripts/packages.el @@ -11,7 +11,7 @@ (setq shell-scripts-packages '( - (company-shell :toggle (configuration-layer/package-usedp 'company)) + (company-shell :depends company) fish-mode flycheck flycheck-bashate diff --git a/layers/+os/nixos/packages.el b/layers/+os/nixos/packages.el index 96c56a00e6c2..073c388336f1 100644 --- a/layers/+os/nixos/packages.el +++ b/layers/+os/nixos/packages.el @@ -4,7 +4,7 @@ flycheck (company-nixos-options :toggle (configuration-layer/package-usedp 'company)) - (helm-nixos-options :toggle (configuration-layer/package-usedp 'helm)) + (helm-nixos-options :depends helm) nix-mode nixos-options )) diff --git a/layers/+source-control/git/packages.el b/layers/+source-control/git/packages.el index bb725f05ef7f..be1573631ca8 100644 --- a/layers/+source-control/git/packages.el +++ b/layers/+source-control/git/packages.el @@ -20,12 +20,12 @@ git-link git-messenger git-timemachine - (helm-gitignore :toggle (configuration-layer/package-usedp 'helm)) + (helm-gitignore :depends helm) magit magit-gitflow ;; not compatible with magit 2.1 at the time of release ;; magit-svn - (orgit :toggle (configuration-layer/package-usedp 'org)) + (orgit :depends org) smeargle )) diff --git a/layers/+spacemacs/spacemacs-purpose/packages.el b/layers/+spacemacs/spacemacs-purpose/packages.el index 218ddfa2da28..e092e8e82719 100644 --- a/layers/+spacemacs/spacemacs-purpose/packages.el +++ b/layers/+spacemacs/spacemacs-purpose/packages.el @@ -16,7 +16,7 @@ popwin (spacemacs-purpose-popwin :location local - :toggle (configuration-layer/package-usedp 'popwin)) + :depends popwin) window-purpose)) (defun spacemacs-purpose/pre-init-eyebrowse () diff --git a/layers/+tags/cscope/packages.el b/layers/+tags/cscope/packages.el index 4dfe1228485e..2457080bed27 100644 --- a/layers/+tags/cscope/packages.el +++ b/layers/+tags/cscope/packages.el @@ -11,7 +11,7 @@ (setq cscope-packages '( - (helm-cscope :toggle (configuration-layer/package-usedp 'helm)) + (helm-cscope :depends helm) xcscope )) diff --git a/layers/+tags/gtags/packages.el b/layers/+tags/gtags/packages.el index 6d995ff423c7..a227aaa4a53c 100644 --- a/layers/+tags/gtags/packages.el +++ b/layers/+tags/gtags/packages.el @@ -13,7 +13,7 @@ (defconst gtags-packages '( ggtags - (helm-gtags :toggle (configuration-layer/package-usedp 'helm)) + (helm-gtags :depends helm) )) (defun gtags/init-ggtags () diff --git a/layers/+tools/ansible/packages.el b/layers/+tools/ansible/packages.el index 31896f84fdfa..535c3082f3f1 100644 --- a/layers/+tools/ansible/packages.el +++ b/layers/+tools/ansible/packages.el @@ -12,7 +12,7 @@ '(ansible ansible-doc company - (company-ansible :toggle (configuration-layer/package-usedp 'company)) + (company-ansible :depends company) jinja2-mode yaml-mode)) diff --git a/layers/+tools/dash/packages.el b/layers/+tools/dash/packages.el index 80d881f0fdcb..28d2c68a8614 100644 --- a/layers/+tools/dash/packages.el +++ b/layers/+tools/dash/packages.el @@ -2,8 +2,8 @@ (setq dash-packages '( (dash-at-point :toggle (spacemacs/system-is-mac)) - (helm-dash :toggle (configuration-layer/package-usedp 'helm)) - (counsel-dash :toggle (configuration-layer/package-usedp 'ivy)) + (helm-dash :depends helm) + (counsel-dash :depends ivy) (zeal-at-point :toggle (or (spacemacs/system-is-linux) (spacemacs/system-is-mswindows))))) diff --git a/layers/+tools/finance/packages.el b/layers/+tools/finance/packages.el index 5568ce9af921..55eab6194dc0 100644 --- a/layers/+tools/finance/packages.el +++ b/layers/+tools/finance/packages.el @@ -12,7 +12,7 @@ (setq finance-packages '( company - (flycheck-ledger :toggle (configuration-layer/package-usedp 'flycheck)) + (flycheck-ledger :depends flycheck) ledger-mode )) diff --git a/layers/+tools/restclient/packages.el b/layers/+tools/restclient/packages.el index a88cdd40335a..1f3e03fd0baf 100644 --- a/layers/+tools/restclient/packages.el +++ b/layers/+tools/restclient/packages.el @@ -10,12 +10,12 @@ ;;; License: GPLv3 (setq restclient-packages '( - (company-restclient :toggle (configuration-layer/package-usedp 'company)) + (company-restclient :depends company) golden-ratio ob-http ob-restclient restclient - (restclient-helm :toggle (configuration-layer/package-usedp 'helm)) + (restclient-helm :depends helm) )) (defun restclient/pre-init-golden-ratio () diff --git a/layers/+tools/ycmd/packages.el b/layers/+tools/ycmd/packages.el index cb95c06ffd57..043bb79d2fb4 100644 --- a/layers/+tools/ycmd/packages.el +++ b/layers/+tools/ycmd/packages.el @@ -11,8 +11,8 @@ (setq ycmd-packages '( - (company-ycmd :toggle (configuration-layer/package-usedp 'company)) - (flycheck-ycmd :toggle (configuration-layer/package-usedp 'flycheck)) + (company-ycmd :depends company) + (flycheck-ycmd :depends flycheck) eldoc ycmd )) diff --git a/layers/+web-services/spotify/packages.el b/layers/+web-services/spotify/packages.el index f7c2d139f814..13ab69eb220c 100644 --- a/layers/+web-services/spotify/packages.el +++ b/layers/+web-services/spotify/packages.el @@ -12,7 +12,7 @@ (setq spotify-packages '( spotify - (helm-spotify :toggle (configuration-layer/package-usedp 'helm)) + (helm-spotify :depends helm) )) (defun spotify/init-spotify () diff --git a/tests/core/core-configuration-layer-ftest.el b/tests/core/core-configuration-layer-ftest.el index a576fee68010..1535b7856ff0 100644 --- a/tests/core/core-configuration-layer-ftest.el +++ b/tests/core/core-configuration-layer-ftest.el @@ -20,7 +20,7 @@ (git :variables foo 'bar))) configuration-layer--used-layers (configuration-layer--indexed-layers (make-hash-table :size 1024))) - (configuration-layer/discover-layers) + (configuration-layer/discover-layers 'refresh-index) (configuration-layer//declare-used-layers dotspacemacs-configuration-layers) (should (eq 'spacemacs-bootstrap (first configuration-layer--used-layers))))) @@ -31,7 +31,7 @@ (git :variables foo 'bar))) configuration-layer--used-layers (configuration-layer--indexed-layers (make-hash-table :size 1024))) - (configuration-layer/discover-layers) + (configuration-layer/discover-layers 'refresh-index) (configuration-layer//declare-used-layers dotspacemacs-configuration-layers) (should (eq 'spacemacs-base (second configuration-layer--used-layers))))) diff --git a/tests/core/core-configuration-layer-utest.el b/tests/core/core-configuration-layer-utest.el index b87c0e83b318..1e7e3c35da4a 100644 --- a/tests/core/core-configuration-layer-utest.el +++ b/tests/core/core-configuration-layer-utest.el @@ -168,35 +168,103 @@ ;; class cfgl-package ;; --------------------------------------------------------------------------- -;; method: cfgl-package-enabledp +;; method: cfgl-package-enabled-p -(ert-deftest test-cfgl-package-enabledp--default-toggle-eval-non-nil () +(ert-deftest test-cfgl-package-enabled-p--default-toggle-eval-non-nil () (let ((pkg (cfgl-package "testpkg" :name 'testpkg))) - (should (cfgl-package-enabledp pkg)))) + (should (cfgl-package-enabled-p pkg)))) -(ert-deftest test-cfgl-package-enabledp--symbol-toggle-eval-non-nil-example () +(ert-deftest test-cfgl-package-enabled-p--symbol-toggle-eval-non-nil-example () (let ((pkg (cfgl-package "testpkg" :name 'testpkg :toggle 'package-toggle)) (package-toggle t)) - (should (cfgl-package-enabledp pkg)))) + (should (cfgl-package-enabled-p pkg)))) -(ert-deftest test-cfgl-package-enabledp--symbol-toggle-eval-nil-example () +(ert-deftest test-cfgl-package-enabled-p--symbol-toggle-eval-nil-example () (let ((pkg (cfgl-package "testpkg" :name 'testpkg :toggle 'package-toggle)) (package-toggle nil)) - (should (null (cfgl-package-enabledp pkg))))) + (should (null (cfgl-package-enabled-p pkg))))) -(ert-deftest test-cfgl-package-enabledp--list-toggle-eval-non-nil-example () +(ert-deftest test-cfgl-package-enabled-p--list-toggle-eval-non-nil-example () (let ((pkg (cfgl-package "testpkg" :name 'testpkg :toggle '(memq package-toggle '(foo bar)))) (package-toggle 'foo)) - (should (cfgl-package-enabledp pkg)))) + (should (cfgl-package-enabled-p pkg)))) -(ert-deftest test-cfgl-package-enabledp--list-toggle-eval-nil-example () +(ert-deftest test-cfgl-package-enabled-p--list-toggle-eval-nil-example () (let ((pkg (cfgl-package "testpkg" :name 'testpkg :toggle '(memq package-toggle '(foo bar)))) (package-toggle 'other)) - (should (null (cfgl-package-enabledp pkg))))) + (should (null (cfgl-package-enabled-p pkg))))) + +(ert-deftest test-cfgl-package-enabled-p--depends-satisfied () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b)) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (configuration-layer//add-package pkg-b) + (should (cfgl-package-enabled-p pkg-a)))) + +(ert-deftest test-cfgl-package-enabled-p--depends-nonexistent () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (should (null (cfgl-package-enabled-p pkg-a))))) + +(ert-deftest test-cfgl-package-enabled-p--depends-toggled-off () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b + :toggle nil)) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (configuration-layer//add-package pkg-b) + (should (null (cfgl-package-enabled-p pkg-a))))) + +(ert-deftest test-cfgl-package-enabled-p--depends-excluded () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b + :excluded t)) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (configuration-layer//add-package pkg-b) + (should (null (cfgl-package-enabled-p pkg-a))))) + +(ert-deftest test-cfgl-package-enabled-p--depends-transitive () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b + :depends '(pkg-c))) + (pkg-c (cfgl-package "pkg-c" + :name 'pkg-c)) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (configuration-layer//add-package pkg-b) + (configuration-layer//add-package pkg-c) + (should (cfgl-package-enabled-p pkg-a)))) + +(ert-deftest test-cfgl-package-enabled-p--depends-transitive-not-satisfied () + (let ((pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :depends '(pkg-b))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b + :depends '(pkg-c))) + (pkg-c (cfgl-package "pkg-c" + :name 'pkg-c + :excluded t)) + (configuration-layer--indexed-packages (make-hash-table :size 2048))) + (configuration-layer//add-package pkg-b) + (configuration-layer//add-package pkg-c) + (should (null (cfgl-package-enabled-p pkg-a))))) ;; method: cfgl-package-get-safe-owner @@ -217,6 +285,96 @@ (helper--set-layers `(,(cfgl-layer "layer2" :name 'layer2)) t) (should (eq 'layer2 (cfgl-package-get-safe-owner pkg))))) +;; --------------------------------------------------------------------------- +;; configuration-layer//package-enabled-p +;; --------------------------------------------------------------------------- + +(ert-deftest test-package-enabled-p--pre () + (let ((owner (cfgl-layer "owner" :name 'owner)) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg (cfgl-package "pkg" + :name 'pkg + :owners '(owner) + :pre-layers '(layer))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner) + (configuration-layer//add-layer layer) + (configuration-layer//add-package pkg) + (should (configuration-layer//package-enabled-p pkg 'layer)))) + +(ert-deftest test-package-enabled-p--post () + (let ((owner (cfgl-layer "owner" :name 'owner)) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg (cfgl-package "pkg" + :name 'pkg + :owners '(owner) + :post-layers '(layer))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner) + (configuration-layer//add-layer layer) + (should (configuration-layer//package-enabled-p pkg 'layer)))) + +(ert-deftest test-package-enabled-p--disabled () + (let ((owner (cfgl-layer "owner" :name 'owner :disabled-for '(layer))) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg (cfgl-package "pkg" + :name 'pkg + :owners '(owner) + :post-layers '(layer))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner) + (configuration-layer//add-layer layer) + (should (null (configuration-layer//package-enabled-p pkg 'layer))))) + +(ert-deftest test-package-enabled-p--enabled-precedence () + (let ((owner (cfgl-layer "owner" :name 'owner :disabled-for '(layer) :enabled-for '(layer))) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg (cfgl-package "pkg" + :name 'pkg + :owners '(owner) + :post-layers '(layer))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner) + (configuration-layer//add-layer layer) + (should (configuration-layer//package-enabled-p pkg 'layer)))) + +(ert-deftest test-package-enabled-p--enabled-for-none () + (let ((owner (cfgl-layer "owner" :name 'owner :enabled-for '())) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg (cfgl-package "pkg" + :name 'pkg + :owners '(owner) + :post-layers '(layer))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner) + (configuration-layer//add-layer layer) + (should (null (configuration-layer//package-enabled-p pkg 'layer))))) + +(ert-deftest test-package-enabled-p--depends-on-disabled () + (let ((owner-a (cfgl-layer "owner-a" :name 'owner-a)) + (owner-b (cfgl-layer "owner-b" :name 'owner-b :disabled-for '(layer))) + (layer (cfgl-layer "layer" :name 'layer)) + (pkg-a (cfgl-package "pkg-a" + :name 'pkg-a + :owners '(owner-a) + :depends '(pkg-b) + :post-layers '(layer))) + (pkg-b (cfgl-package "pkg-b" + :name 'pkg-b + :owners '(owner-b))) + (configuration-layer--indexed-packages (make-hash-table :size 2048)) + (configuration-layer--indexed-layers (make-hash-table :size 1024))) + (configuration-layer//add-layer owner-a) + (configuration-layer//add-layer owner-b) + (configuration-layer//add-layer layer) + (configuration-layer//add-package pkg-b) + (should (null (configuration-layer//package-enabled-p pkg-a 'layer))))) + ;; --------------------------------------------------------------------------- ;; configuration-layer//package-archive-absolute-pathp ;; ---------------------------------------------------------------------------