core: ensure quelpa is available when installing packages

This commit is contained in:
syl20bnr 2016-04-03 02:51:01 -04:00
parent cc5afabcae
commit d60228219f
5 changed files with 56 additions and 50 deletions

View File

@ -205,6 +205,16 @@ cache folder.")
(add-to-list 'package-archives
'("marmalade" . "https://marmalade-repo.org/packages/")))))
(defun configuration-layer//install-quelpa ()
"Install `quelpa'."
(setq quelpa-verbose init-file-debug
quelpa-dir (concat spacemacs-cache-directory "quelpa/")
quelpa-build-dir (expand-file-name "build" quelpa-dir)
quelpa-persistent-cache-file (expand-file-name "cache" quelpa-dir)
quelpa-update-melpa-p nil)
(configuration-layer/load-or-install-protected-package 'package-build)
(configuration-layer/load-or-install-protected-package 'quelpa))
(defun configuration-layer//resolve-package-archives (archives)
"Resolve HTTP handlers for each archive in ARCHIVES and return a list
of all reachable ones.
@ -972,6 +982,7 @@ path."
(if layer "package" "dependency")
pkg-name (if layer (format "@%S" layer) "")
installed-count noinst-count) t)
(spacemacs//redisplay)
(unless (package-installed-p pkg-name)
(condition-case-unless-debug err
(cond
@ -987,7 +998,8 @@ path."
(configuration-layer//increment-error-count)
(spacemacs-buffer/append
(format (concat "\nAn error occurred while installing %s "
"(error: %s)\n") pkg-name err)))))))
"(error: %s)\n") pkg-name err))
(spacemacs//redisplay))))))
(defun configuration-layer//lazy-install-p (layer-name)
"Return non nil if the layer with LAYER-NAME should be lazy installed."
@ -1033,6 +1045,8 @@ path."
(defun configuration-layer//install-packages (packages)
"Install PACKAGES which are not lazy installed."
(interactive)
;; ensure we have quelpa available first
(configuration-layer//install-quelpa)
(let* ((noinst-pkg-names
(configuration-layer//get-uninstalled-packages
(mapcar 'car (object-assoc-list :name packages))))
@ -1045,11 +1059,11 @@ path."
noinst-count))
(configuration-layer/retrieve-package-archives)
(setq installed-count 0)
(spacemacs//redisplay)
(dolist (pkg-name noinst-pkg-names)
(setq installed-count (1+ installed-count))
(configuration-layer//install-package
(object-assoc pkg-name :name configuration-layer--packages))
(spacemacs//redisplay))
(object-assoc pkg-name :name configuration-layer--packages)))
(spacemacs-buffer/append "\n"))))
(defun configuration-layer//install-from-elpa (pkg-name)
@ -1663,6 +1677,41 @@ to select one."
(configuration-layer//insert-lazy-install-form
layer-name (car x) (cdr x))))))
(defun configuration-layer/load-or-install-protected-package
(pkg &optional log file-to-load)
"Load PKG package, and protect it against being deleted as an orphan.
See `configuration-layer/load-or-install-package' for more information."
(push pkg configuration-layer--protected-packages)
(configuration-layer/load-or-install-package pkg log file-to-load))
(defun configuration-layer/load-or-install-package
(pkg &optional log file-to-load)
"Load PKG package. PKG will be installed if it is not already installed.
Whenever the initial require fails the absolute path to the package
directory is returned.
If LOG is non-nil a message is displayed in spacemacs-buffer-mode buffer.
FILE-TO-LOAD is an explicit file to load after the installation."
(let ((warning-minimum-level :error))
(unless (require pkg nil 'noerror)
;; not installed, we try to initialize package.el only if required to
;; precious seconds during boot time
(require 'cl)
(let ((pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(if pkg-elpa-dir
(add-to-list 'load-path pkg-elpa-dir)
;; install the package
(when log
(spacemacs-buffer/append
(format "(Bootstrap) Installing %s...\n" pkg))
(spacemacs//redisplay))
(configuration-layer/retrieve-package-archives 'quiet)
(package-install pkg)
(setq pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(require pkg nil 'noerror)
(when file-to-load
(load-file (concat pkg-elpa-dir file-to-load)))
pkg-elpa-dir))))
(defun configuration-layer//increment-error-count ()
"Increment the error counter."
(if configuration-layer-error-count

View File

@ -25,39 +25,6 @@
;; ns is returned instead of mac on Emacs 25+
(memq (window-system) '(mac ns)))
(defun spacemacs/load-or-install-protected-package (pkg &optional log file-to-load)
"Load PKG package, and protect it against being deleted as an orphan.
See `spacemacs/load-or-install-package' for more information."
(push pkg configuration-layer--protected-packages)
(spacemacs/load-or-install-package pkg log file-to-load))
(defun spacemacs/load-or-install-package (pkg &optional log file-to-load)
"Load PKG package. PKG will be installed if it is not already installed.
Whenever the initial require fails the absolute path to the package
directory is returned.
If LOG is non-nil a message is displayed in spacemacs-buffer-mode buffer.
FILE-TO-LOAD is an explicit file to load after the installation."
(let ((warning-minimum-level :error))
(unless (require pkg nil 'noerror)
;; not installed, we try to initialize package.el only if required to
;; precious seconds during boot time
(require 'cl)
(let ((pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(if pkg-elpa-dir
(add-to-list 'load-path pkg-elpa-dir)
;; install the package
(when log
(spacemacs-buffer/append
(format "(Bootstrap) Installing %s...\n" pkg))
(spacemacs//redisplay))
(configuration-layer/retrieve-package-archives 'quiet)
(package-install pkg)
(setq pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(require pkg nil 'noerror)
(when file-to-load
(load-file (concat pkg-elpa-dir file-to-load)))
pkg-elpa-dir))))
(defun spacemacs//get-package-directory (pkg)
"Return the directory of PKG. Return nil if not found."
(let ((elpa-dir (file-name-as-directory package-user-dir)))

View File

@ -139,7 +139,7 @@
(spacemacs-buffer/set-mode-line "Dotfile wizard installer")
(spacemacs//redisplay)
(when (dotspacemacs/install 'with-wizard)
(dotspacemacs/sync-configuration-layers '(16)))))
(configuration-layer/sync))))
(defun spacemacs/display-and-copy-version ()
"Echo the current spacemacs version and copy it."

View File

@ -195,7 +195,7 @@ package name does not match theme name + `-theme' suffix.")
(eq 'zonokai-red theme)
(eq 'solarized-light theme)
(eq 'solarized-dark theme))
(spacemacs/load-or-install-package 'dash))
(configuration-layer/load-or-install-package 'dash))
;; Unless Emacs stock themes
(unless (or (memq theme (custom-available-themes))
(eq 'default theme))
@ -203,7 +203,7 @@ package name does not match theme name + `-theme' suffix.")
;; themes with explicitly declared package names
((assq theme spacemacs-theme-name-to-package)
(let* ((pkg (spacemacs//get-theme-package theme))
(pkg-dir (spacemacs/load-or-install-package pkg)))
(pkg-dir (configuration-layer/load-or-install-package pkg)))
(when (or (eq 'moe-light theme)
(eq 'moe-dark theme))
(load-file (concat pkg-dir "moe-light-theme.el"))
@ -215,7 +215,7 @@ package name does not match theme name + `-theme' suffix.")
;; if not we will handle the special themes as we get issues
;; in the tracker.
(let ((pkg (spacemacs//get-theme-package theme)))
(spacemacs/load-or-install-package pkg))))))
(configuration-layer/load-or-install-package pkg))))))
('error
(setq theme 'default)
(display-warning 'spacemacs

View File

@ -17,8 +17,6 @@
(evil :step bootstrap)
(f :step bootstrap)
(hydra :step bootstrap)
(package-build :step bootstrap)
(quelpa :step bootstrap)
(s :step bootstrap)
(use-package :step bootstrap)
(which-key :step bootstrap)
@ -212,14 +210,6 @@
(setq hydra-key-doc-function 'spacemacs//hydra-key-doc-function
hydra-head-format "[%s] "))
(defun spacemacs-bootstrap/init-quelpa ()
(setq quelpa-verbose init-file-debug
quelpa-dir (concat spacemacs-cache-directory "quelpa/")
quelpa-build-dir (expand-file-name "build" quelpa-dir)
quelpa-persistent-cache-file (expand-file-name "cache" quelpa-dir)
quelpa-update-melpa-p nil)
(require 'quelpa))
(defun spacemacs-bootstrap/init-use-package ()
(require 'use-package)
(setq use-package-verbose init-file-debug