New dotfile variable dotspacemacs-download-packages
This new variable replace dotspacemacs-delete-orphan-packages It defines the behaviour of Spacemacs when downloading packages. Possible values are `used', `used-but-keep-unused' and `all'. - `used' will download only explicitly used packages and remove any unused packages as well as their dependencies. - `used-but-keep-unused' will download only the used packages but won't delete them if they become unused. - `all' will download all the packages regardless if they are used or not and packages won't be deleted by Spacemacs. Default value is `used`.
This commit is contained in:
parent
d51987f497
commit
60f5a3a0fa
|
@ -320,20 +320,24 @@ If NO-INSTALL is non nil then install steps are skipped."
|
|||
(configuration-layer//configure-layers configuration-layer--layers)
|
||||
;; pre-filter some packages to save some time later in the loading process
|
||||
(setq configuration-layer--used-distant-packages
|
||||
(configuration-layer//get-distant-used-packages
|
||||
configuration-layer--packages))
|
||||
(configuration-layer//get-distant-packages
|
||||
configuration-layer--packages t))
|
||||
;; install/uninstall packages
|
||||
(configuration-layer/load-auto-layer-file)
|
||||
(unless no-install
|
||||
(configuration-layer//install-packages
|
||||
(configuration-layer/filter-objects
|
||||
configuration-layer--used-distant-packages
|
||||
(lambda (x)
|
||||
(not (oref x :lazy-install)))))
|
||||
(if (eq 'all dotspacemacs-download-packages)
|
||||
(configuration-layer//install-packages
|
||||
(configuration-layer//get-distant-packages
|
||||
(configuration-layer/get-all-packages) nil))
|
||||
(configuration-layer//install-packages
|
||||
(configuration-layer/filter-objects
|
||||
configuration-layer--used-distant-packages
|
||||
(lambda (x)
|
||||
(not (oref x :lazy-install))))))
|
||||
(configuration-layer//configure-packages configuration-layer--packages)
|
||||
(configuration-layer//load-layers-files
|
||||
configuration-layer--layers '("keybindings.el"))
|
||||
(when (and dotspacemacs-delete-orphan-packages
|
||||
(when (and (eq 'used-only dotspacemacs-download-packages)
|
||||
(not configuration-layer-distribution)
|
||||
(not configuration-layer-no-layer))
|
||||
(configuration-layer/delete-orphan-packages
|
||||
|
@ -699,6 +703,14 @@ If TOGGLEP is non nil then `:toggle' parameter is ignored."
|
|||
(push obj configuration-layer--packages))
|
||||
(oset obj :excluded t)))))
|
||||
|
||||
(defun configuration-layer/get-all-packages ()
|
||||
"Return a list of _all_ packages."
|
||||
(let (configuration-layer--packages)
|
||||
(configuration-layer/get-packages
|
||||
(mapcar 'configuration-layer/make-layer
|
||||
(configuration-layer/get-layers-list)))
|
||||
configuration-layer--packages))
|
||||
|
||||
(defun configuration-layer//sort-packages (packages)
|
||||
"Return a sorted list of PACKAGES objects."
|
||||
(sort packages (lambda (x y) (string< (symbol-name (oref x :name))
|
||||
|
@ -721,8 +733,8 @@ If TOGGLEP is non nil then `:toggle' parameter is ignored."
|
|||
(or (not (eq layer-name (oref p :owner)))
|
||||
(null (package-installed-p
|
||||
(oref p :name)))))
|
||||
(configuration-layer//get-distant-used-packages
|
||||
packages))
|
||||
(configuration-layer//get-distant-packages
|
||||
packages t))
|
||||
:initial-value t)))
|
||||
(oset layer :lazy-install lazy)
|
||||
(dolist (pkg packages)
|
||||
|
@ -752,15 +764,18 @@ If TOGGLEP is non nil then `:toggle' parameter is ignored."
|
|||
objects
|
||||
:initial-value nil)))
|
||||
|
||||
(defun configuration-layer//get-distant-used-packages (packages)
|
||||
"Return the distant packages (ie to be intalled) that are effectively used."
|
||||
(defun configuration-layer//get-distant-packages (packages usedp)
|
||||
"Return the distant packages (ie to be intalled).
|
||||
If USEDP is not nil then only return only the used packages, if it is nil then
|
||||
return both used and unused packages."
|
||||
(configuration-layer/filter-objects
|
||||
packages (lambda (x)
|
||||
(and (not (null (oref x :owner)))
|
||||
(not (memq (oref x :location) '(built-in site local)))
|
||||
(and (not (memq (oref x :location) '(built-in site local)))
|
||||
(not (stringp (oref x :location)))
|
||||
(cfgl-package-enabledp x)
|
||||
(not (oref x :excluded))))))
|
||||
(or (null usedp)
|
||||
(and (not (null (oref x :owner)))
|
||||
(cfgl-package-enabledp x)
|
||||
(not (oref x :excluded))))))))
|
||||
|
||||
(defun configuration-layer//get-private-layer-dir (name)
|
||||
"Return an absolute path to the private configuration layer string NAME."
|
||||
|
@ -1022,7 +1037,7 @@ path."
|
|||
(format "--> installing %s: %s%s... [%s/%s]"
|
||||
(if layer "package" "dependency")
|
||||
pkg-name (if layer (format "@%S" layer) "")
|
||||
installed-count noinst-count) t)
|
||||
installed-count not-inst-count) t)
|
||||
(spacemacs//redisplay)
|
||||
(unless (package-installed-p pkg-name)
|
||||
(condition-case-unless-debug err
|
||||
|
@ -1088,23 +1103,23 @@ path."
|
|||
(interactive)
|
||||
;; ensure we have quelpa available first
|
||||
(configuration-layer//install-quelpa)
|
||||
(let* ((noinst-pkg-names
|
||||
(let* ((not-inst-pkg-names
|
||||
(configuration-layer//get-uninstalled-packages
|
||||
(mapcar 'car (object-assoc-list :name packages))))
|
||||
(noinst-count (length noinst-pkg-names))
|
||||
(not-inst-count (length not-inst-pkg-names))
|
||||
installed-count)
|
||||
;; installation
|
||||
(when noinst-pkg-names
|
||||
(when not-inst-pkg-names
|
||||
(spacemacs-buffer/append
|
||||
(format "Found %s new package(s) to install...\n"
|
||||
noinst-count))
|
||||
not-inst-count))
|
||||
(configuration-layer/retrieve-package-archives)
|
||||
(setq installed-count 0)
|
||||
(spacemacs//redisplay)
|
||||
(dolist (pkg-name noinst-pkg-names)
|
||||
(dolist (pkg-name not-inst-pkg-names)
|
||||
(setq installed-count (1+ installed-count))
|
||||
(configuration-layer//install-package
|
||||
(object-assoc pkg-name :name configuration-layer--packages)))
|
||||
(object-assoc pkg-name :name packages)))
|
||||
(spacemacs-buffer/append "\n"))))
|
||||
|
||||
(defun configuration-layer//install-from-elpa (pkg-name)
|
||||
|
|
|
@ -65,6 +65,15 @@ environment, otherwise it is strongly recommended to let it set to t.")
|
|||
"List of additional paths where to look for configuration layers.
|
||||
Paths must have a trailing slash (ie. `~/.mycontribs/')")
|
||||
|
||||
(defvar dotspacemacs-download-packages 'used
|
||||
"Defines the behaviour of Spacemacs when downloading packages.
|
||||
Possible values are `used', `used-but-keep-unused' and `all'. `used' will
|
||||
download only explicitly used packages and remove any unused packages as well as
|
||||
their dependencies. `used-but-keep-unused' will download only the used packages
|
||||
but won't delete them if they become unused. `all' will download all the
|
||||
packages regardless if they are used or not and packages won't be deleted by
|
||||
Spacemacs.")
|
||||
|
||||
(defvar dotspacemacs-enable-lazy-installation 'unused
|
||||
" Lazy installation of layers (i.e. layers are installed only when a file
|
||||
with a supported type is opened). Possible values are `all', `unused' and `nil'.
|
||||
|
@ -280,11 +289,6 @@ to aggressively delete empty lines and long sequences of whitespace, `trailing'
|
|||
to delete only the whitespace at end of lines, `changed' to delete only
|
||||
whitespace for changed lines or `nil' to disable cleanup.")
|
||||
|
||||
(defvar dotspacemacs-delete-orphan-packages t
|
||||
"If non-nil spacemacs will delete any orphan packages, i.e. packages that are
|
||||
declared in a layer which is not a member of
|
||||
`dotspacemacs-configuration-layers'")
|
||||
|
||||
(defvar dotspacemacs-search-tools '("ag" "pt" "ack" "grep")
|
||||
"List of search tool executable names. Spacemacs uses the first installed
|
||||
tool of the list. Supported tools are `ag', `pt', `ack' and `grep'.")
|
||||
|
@ -523,7 +527,7 @@ error recovery."
|
|||
(defadvice dotspacemacs/layers
|
||||
(after error-recover-preserve-packages activate)
|
||||
(progn
|
||||
(setq-default dotspacemacs-delete-orphan-packages nil)
|
||||
(setq-default dotspacemacs-download-packages 'used-but-keep-unused)
|
||||
(ad-disable-advice 'dotspacemacs/layers 'after
|
||||
'error-recover-preserve-packages)
|
||||
(ad-activate 'dotspacemacs/layers)))
|
||||
|
@ -557,7 +561,7 @@ error recovery."
|
|||
;; protect global values of these variables
|
||||
(let (dotspacemacs-configuration-layer-path dotspacemacs-configuration-layers
|
||||
dotspacemacs-additional-packages dotspacemacs-excluded-packages
|
||||
dotspacemacs-delete-orphan-packages
|
||||
dotspacemacs-download-packages
|
||||
(passed-tests 0) (total-tests 0))
|
||||
(load dotspacemacs-filepath)
|
||||
(dotspacemacs/layers)
|
||||
|
|
|
@ -57,10 +57,14 @@ values."
|
|||
dotspacemacs-additional-packages '()
|
||||
;; A list of packages that will not be install and loaded.
|
||||
dotspacemacs-excluded-packages '()
|
||||
;; If non-nil spacemacs will delete any orphan packages, i.e. packages that
|
||||
;; are declared in a layer which is not a member of
|
||||
;; the list `dotspacemacs-configuration-layers'. (default t)
|
||||
dotspacemacs-delete-orphan-packages t))
|
||||
;; Defines the behaviour of Spacemacs when downloading packages.
|
||||
;; Possible values are `used', `used-but-keep-unused' and `all'. `used' will
|
||||
;; download only explicitly used packages and remove any unused packages as
|
||||
;; well as their dependencies. `used-but-keep-unused' will download only the
|
||||
;; used packages but won't delete them if they become unused. `all' will
|
||||
;; download all the packages regardless if they are used or not and packages
|
||||
;; won't be deleted by Spacemacs. (default is `used')
|
||||
dotspacemacs-download-packages 'used))
|
||||
|
||||
(defun dotspacemacs/init ()
|
||||
"Initialization function.
|
||||
|
|
17
doc/FAQ.org
17
doc/FAQ.org
|
@ -58,9 +58,20 @@ may also just type ~SPC f e v~.
|
|||
As it is written, that is _space_ then _macs_.
|
||||
|
||||
** Why are packages installed with =package-install= automatically deleted by Spacemacs when it boots?
|
||||
To declare new packages you have to create a new configuration layer or add the
|
||||
package name to the variable =dotspacemacs-additonal-packages= of your dotfile,
|
||||
see the [[file:QUICK_START.org][quick start guide]] for more info.
|
||||
By default Spacemacs will keep only the packages that you use (i.e. the packages
|
||||
belonging to a layer explicitly listed in the variable
|
||||
=dotspacemacs-configuration-layers=).
|
||||
|
||||
To install packages that does not belong to any Spacemacs layers, you can:
|
||||
|
||||
- use the variable =dotspacemacs-additonal-packages=.
|
||||
- or create a configuration layer configuring the package and add this layer to
|
||||
=dotspacemacs-configuration-layers=
|
||||
- or set the variable =dotspacemacs-download-packages= to =used-but-keep-unused=
|
||||
which will prevent Spacemacs from removing the packages you installed
|
||||
manually.
|
||||
|
||||
To create a new configuration layer see the [[file:QUICK_START.org][quick start guide]] for more info.
|
||||
|
||||
** How to fix package download errors when installing Spacemacs ?
|
||||
Since 0.105.0 HTTPS protocol is used by default to download packages. If your
|
||||
|
|
|
@ -281,6 +281,56 @@
|
|||
(result (configuration-layer/make-package pkg obj)))
|
||||
(should (equal result expected))))
|
||||
|
||||
;; ---------------------------------------------------------------------------
|
||||
;; configuration-layer//get-distant-packages
|
||||
;; ---------------------------------------------------------------------------
|
||||
|
||||
(defvar test-get-distant-packages--test-data
|
||||
`(,(cfgl-package "pkg18" :name 'pkg18 :owner nil)
|
||||
,(cfgl-package "pkg17" :name 'pkg17 :owner nil :location 'elpa)
|
||||
,(cfgl-package "pkg16" :name 'pkg16 :owner nil :toggle nil)
|
||||
,(cfgl-package "pkg15" :name 'pkg15 :owner nil :toggle t)
|
||||
,(cfgl-package "pkg14" :name 'pkg14 :owner nil :location '(recipe))
|
||||
,(cfgl-package "pkg13" :name 'pkg13 :owner nil :location 'built-in)
|
||||
,(cfgl-package "pkg12" :name 'pkg12 :owner nil :location 'local)
|
||||
,(cfgl-package "pkg11" :name 'pkg11 :owner nil :location 'site)
|
||||
,(cfgl-package "pkg10" :name 'pkg10 :owner nil :location "/path")
|
||||
,(cfgl-package "pkg9" :name 'pkg9 :owner 'layer)
|
||||
,(cfgl-package "pkg8" :name 'pkg8 :owner 'layer :location 'elpa)
|
||||
,(cfgl-package "pkg7" :name 'pkg7 :owner 'layer :toggle nil)
|
||||
,(cfgl-package "pkg6" :name 'pkg6 :owner 'layer :toggle t)
|
||||
,(cfgl-package "pkg5" :name 'pkg5 :owner 'layer :location '(recipe))
|
||||
,(cfgl-package "pkg4" :name 'pkg4 :owner 'layer :location 'built-in)
|
||||
,(cfgl-package "pkg3" :name 'pkg3 :owner 'layer :location 'local)
|
||||
,(cfgl-package "pkg2" :name 'pkg2 :owner 'layer :location 'site)
|
||||
,(cfgl-package "pkg1" :name 'pkg1 :owner 'layer :location "/path")))
|
||||
|
||||
(ert-deftest test-get-distant-packages--return-only-used-packages ()
|
||||
(let ((packages test-get-distant-packages--test-data))
|
||||
(should
|
||||
(equal
|
||||
`(,(cfgl-package "pkg9" :name 'pkg9 :owner 'layer)
|
||||
,(cfgl-package "pkg8" :name 'pkg8 :owner 'layer :location 'elpa)
|
||||
,(cfgl-package "pkg6" :name 'pkg6 :owner 'layer :toggle t)
|
||||
,(cfgl-package "pkg5" :name 'pkg5 :owner 'layer :location '(recipe)))
|
||||
(configuration-layer//get-distant-packages packages t)))))
|
||||
|
||||
(ert-deftest test-get-distant-packages--return-only-unused-packages ()
|
||||
(let ((packages test-get-distant-packages--test-data))
|
||||
(should
|
||||
(equal
|
||||
`(,(cfgl-package "pkg18" :name 'pkg18 :owner nil)
|
||||
,(cfgl-package "pkg17" :name 'pkg17 :owner nil :location 'elpa)
|
||||
,(cfgl-package "pkg16" :name 'pkg16 :owner nil :toggle nil)
|
||||
,(cfgl-package "pkg15" :name 'pkg15 :owner nil :toggle t)
|
||||
,(cfgl-package "pkg14" :name 'pkg14 :owner nil :location '(recipe))
|
||||
,(cfgl-package "pkg9" :name 'pkg9 :owner 'layer)
|
||||
,(cfgl-package "pkg8" :name 'pkg8 :owner 'layer :location 'elpa)
|
||||
,(cfgl-package "pkg7" :name 'pkg7 :owner 'layer :toggle nil)
|
||||
,(cfgl-package "pkg6" :name 'pkg6 :owner 'layer :toggle t)
|
||||
,(cfgl-package "pkg5" :name 'pkg5 :owner 'layer :location '(recipe)))
|
||||
(configuration-layer//get-distant-packages packages nil)))))
|
||||
|
||||
;; ---------------------------------------------------------------------------
|
||||
;; configuration-layer/get-packages
|
||||
;; ---------------------------------------------------------------------------
|
||||
|
@ -643,6 +693,48 @@
|
|||
:toggle '(bar-toggle)))
|
||||
configuration-layer--packages))))))
|
||||
|
||||
;; ---------------------------------------------------------------------------
|
||||
;; configuration-layer/get-all-packages
|
||||
;; ---------------------------------------------------------------------------
|
||||
|
||||
(ert-deftest test-get-all-packages ()
|
||||
(let* ((configuration-layer-paths
|
||||
#s(hash-table size 256
|
||||
test eql
|
||||
rehash-size 1.5
|
||||
rehash-threshold 0.8 data
|
||||
(layerall1 "/path/" layerall2 "/path/"
|
||||
layerall3 "/path/" layerall4 "/path/"
|
||||
layerall5 "/path/")))
|
||||
(layerall1-packages '(pkg1))
|
||||
(layerall2-packages '(pkg2 pkg6))
|
||||
(layerall3-packages '(pkg3))
|
||||
(layerall4-packages '(pkg4 pkg7 pkg8))
|
||||
(layerall5-packages '(pkg5 pkg9))
|
||||
(mocker-mock-default-record-cls 'mocker-stub-record))
|
||||
(defun layerall1/init-pkg1 nil)
|
||||
(defun layerall2/init-pkg2 nil)
|
||||
(defun layerall2/init-pkg6 nil)
|
||||
(defun layerall3/init-pkg3 nil)
|
||||
(defun layerall4/init-pkg4 nil)
|
||||
(defun layerall4/init-pkg7 nil)
|
||||
(defun layerall4/init-pkg8 nil)
|
||||
(defun layerall5/init-pkg5 nil)
|
||||
(defun layerall5/init-pkg9 nil)
|
||||
(mocker-let
|
||||
((file-exists-p (f) ((:output t)))
|
||||
(load (f) ((:output nil))))
|
||||
(should (equal (list (cfgl-package "pkg1" :name 'pkg1 :owner 'layerall1)
|
||||
(cfgl-package "pkg6" :name 'pkg6 :owner 'layerall2)
|
||||
(cfgl-package "pkg2" :name 'pkg2 :owner 'layerall2)
|
||||
(cfgl-package "pkg3" :name 'pkg3 :owner 'layerall3)
|
||||
(cfgl-package "pkg8" :name 'pkg8 :owner 'layerall4)
|
||||
(cfgl-package "pkg7" :name 'pkg7 :owner 'layerall4)
|
||||
(cfgl-package "pkg4" :name 'pkg4 :owner 'layerall4)
|
||||
(cfgl-package "pkg9" :name 'pkg9 :owner 'layerall5)
|
||||
(cfgl-package "pkg5" :name 'pkg5 :owner 'layerall5))
|
||||
(configuration-layer/get-all-packages))))))
|
||||
|
||||
;; ---------------------------------------------------------------------------
|
||||
;; configuration-layer//configure-package
|
||||
;; ---------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue