Refactor package management api + remove doom-initialize

This commit is contained in:
Henrik Lissner 2017-12-22 15:25:02 -05:00
parent 9a9f2ce036
commit 7ab8958971
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -1,11 +1,13 @@
;;; core/autoload/packages.el -*- lexical-binding: t; -*- ;;; core/autoload/packages.el -*- lexical-binding: t; -*-
(require 'use-package)
(require 'quelpa)
(defvar doom--last-refresh nil) (defvar doom--last-refresh nil)
;;;###autoload ;;;###autoload
(defun doom-refresh-packages (&optional force-p) (defun doom-refresh-packages (&optional force-p)
"Refresh ELPA packages." "Refresh ELPA packages."
(doom-initialize)
(when force-p (when force-p
(doom-refresh-clear-cache)) (doom-refresh-clear-cache))
(unless (or (persistent-soft-fetch 'last-pkg-refresh "emacs") (unless (or (persistent-soft-fetch 'last-pkg-refresh "emacs")
@ -31,13 +33,14 @@
"Get which backend the package NAME was installed with. Can either be elpa or "Get which backend the package NAME was installed with. Can either be elpa or
quelpa. Throws an error if NOERROR is nil and the package isn't installed." quelpa. Throws an error if NOERROR is nil and the package isn't installed."
(cl-assert (symbolp name) t) (cl-assert (symbolp name) t)
(doom-initialize)
(cond ((and (or (quelpa-setup-p) (cond ((and (or (quelpa-setup-p)
(error "Could not initialize quelpa")) (error "Could not initialize quelpa"))
(assq name quelpa-cache)) (assq name quelpa-cache))
'quelpa) 'quelpa)
((assq name package-alist) ((assq name package-alist)
'elpa) 'elpa)
((package-built-in-p name)
'emacs)
((not noerror) ((not noerror)
(error "%s package is not installed" name)))) (error "%s package is not installed" name))))
@ -84,7 +87,7 @@ installed with. Returns nil otherwise, or if package isn't installed."
(doom-initialize-packages) (doom-initialize-packages)
(and (package-installed-p name) (and (package-installed-p name)
(let* ((plist (cdr (assq name doom-packages))) (let* ((plist (cdr (assq name doom-packages)))
(old-backend (doom-package-backend name t)) (old-backend (doom-package-backend name 'noerror))
(new-backend (if (plist-get plist :recipe) 'quelpa 'elpa))) (new-backend (if (plist-get plist :recipe) 'quelpa 'elpa)))
(not (eq old-backend new-backend))))) (not (eq old-backend new-backend)))))
@ -114,14 +117,12 @@ If INSTALLED-ONLY-P, only return packages that are installed."
;;;###autoload ;;;###autoload
(defun doom-get-depending-on (name) (defun doom-get-depending-on (name)
"Return a list of packages that depend on the package named NAME." "Return a list of packages that depend on the package named NAME."
(doom-initialize)
(when-let* ((desc (cadr (assq name package-alist)))) (when-let* ((desc (cadr (assq name package-alist))))
(mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)))) (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t))))
;;;###autoload ;;;###autoload
(defun doom-get-dependencies-for (name &optional only) (defun doom-get-dependencies-for (name &optional only)
"Return a list of dependencies for a package." "Return a list of dependencies for a package."
(doom-initialize)
(package--get-deps name only)) (package--get-deps name only))
;;;###autoload ;;;###autoload
@ -156,8 +157,9 @@ Used by `doom//packages-update'."
(load ,(expand-file-name "core.el" doom-core-dir))) (load ,(expand-file-name "core.el" doom-core-dir)))
(doom-package-outdated-p ',pkg))) (doom-package-outdated-p ',pkg)))
futures)) futures))
(append (delq nil (mapcar #'doom-package-outdated-p elpa-pkgs)) (delq nil
(delq nil (mapcar #'async-get (reverse futures))))))) (append (mapcar #'doom-package-outdated-p elpa-pkgs)
(mapcar #'async-get (reverse futures)))))))
;;;###autoload ;;;###autoload
(defun doom-get-orphaned-packages () (defun doom-get-orphaned-packages ()
@ -214,7 +216,6 @@ Used by `doom//packages-install'."
(symbol-name (car other)))) (symbol-name (car other))))
(defun doom--packages-choose (prompt) (defun doom--packages-choose (prompt)
(doom-initialize)
(let ((table (cl-loop for pkg in package-alist (let ((table (cl-loop for pkg in package-alist
unless (package-built-in-p (cdr pkg)) unless (package-built-in-p (cdr pkg))
collect (cons (package-desc-full-name (cdr pkg)) collect (cons (package-desc-full-name (cdr pkg))
@ -270,7 +271,6 @@ example; the package name can be omitted)."
(defun doom-update-package (name &optional force-p) (defun doom-update-package (name &optional force-p)
"Updates package NAME (a symbol) if it is out of date, using quelpa or "Updates package NAME (a symbol) if it is out of date, using quelpa or
package.el as appropriate." package.el as appropriate."
(doom-initialize)
(unless (package-installed-p name) (unless (package-installed-p name)
(user-error "%s isn't installed" name)) (user-error "%s isn't installed" name))
(when (doom-package-different-backend-p name) (when (doom-package-different-backend-p name)
@ -299,7 +299,6 @@ package.el as appropriate."
(defun doom-delete-package (name &optional force-p) (defun doom-delete-package (name &optional force-p)
"Uninstalls package NAME if it exists, and clears it from `quelpa-cache'." "Uninstalls package NAME if it exists, and clears it from `quelpa-cache'."
(doom-initialize)
(unless (package-installed-p name) (unless (package-installed-p name)
(user-error "%s isn't installed" name)) (user-error "%s isn't installed" name))
(let ((inhibit-message (not doom-debug-mode)) (let ((inhibit-message (not doom-debug-mode))
@ -319,13 +318,14 @@ package.el as appropriate."
;; ;;
;; Interactive commands ;; Batch/interactive commands
;; ;;
;;;###autoload ;;;###autoload
(defun doom//packages-install () (defun doom//packages-install ()
"Interactive command for installing missing packages." "Interactive command for installing missing packages."
(interactive) (interactive)
(message! "Looking for packages to install...")
(let ((packages (doom-get-missing-packages))) (let ((packages (doom-get-missing-packages)))
(cond ((not packages) (cond ((not packages)
(message! (green "No packages to install!"))) (message! (green "No packages to install!")))
@ -414,29 +414,28 @@ package.el as appropriate."
(defun doom//packages-autoremove () (defun doom//packages-autoremove ()
"Interactive command for auto-removing orphaned packages." "Interactive command for auto-removing orphaned packages."
(interactive) (interactive)
(message! "Looking for orphaned packages...")
(let ((packages (doom-get-orphaned-packages))) (let ((packages (doom-get-orphaned-packages)))
(cond ((not packages) (cond ((not packages)
(message! (green "No unused packages to remove"))) (message! (green "No unused packages to remove")))
((not (or (getenv "YES") ((not
(y-or-n-p (or (getenv "YES")
(format "%s packages will be deleted:\n\n%s\n\nProceed?" (y-or-n-p
(length packages) (format
(mapconcat "%s packages will be deleted:\n\n%s\n\nProceed?"
(lambda (sym) (length packages)
(format (mapconcat
"+ %s (%s)" (lambda (sym)
sym (format "+ %s (%s)" sym
(let ((backend (doom-package-backend sym))) (let ((backend (doom-package-backend sym)))
(if (doom-package-different-backend-p sym) (if (doom-package-different-backend-p sym)
(if (eq backend 'quelpa) (if (eq backend 'quelpa)
"QUELPA->ELPA" "QUELPA->ELPA"
"ELPA->QUELPA") "ELPA->QUELPA")
(if (eq backend 'quelpa) (upcase (symbol-name backend))))))
"QUELPA" (sort (cl-copy-list packages) #'string-lessp)
"ELPA"))))) "\n")))))
(sort (cl-copy-list packages) #'string-lessp)
"\n")))))
(message! (yellow "Aborted!"))) (message! (yellow "Aborted!")))
(t (t
@ -453,6 +452,10 @@ package.el as appropriate."
(doom//reload-load-path))))) (doom//reload-load-path)))))
;;
;; Interactive commands
;;
;;;###autoload ;;;###autoload
(defalias 'doom/install-package #'package-install) (defalias 'doom/install-package #'package-install)
@ -478,7 +481,9 @@ Use this interactively. Use `doom-delete-package' for direct calls."
(if (package-installed-p package) (if (package-installed-p package)
(if (y-or-n-p (format "%s will be deleted. Confirm?" package)) (if (y-or-n-p (format "%s will be deleted. Confirm?" package))
(message "%s %s" (message "%s %s"
(if (doom-delete-package package t) "Deleted" "Failed to delete") (if (doom-delete-package package t)
"Deleted"
"Failed to delete")
package) package)
(message "Aborted")) (message "Aborted"))
(message "%s isn't installed" package)))) (message "%s isn't installed" package))))