From 7f925dd039e54a5b9b45c4a8494d4c48eae4655f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Feb 2017 19:15:58 -0500 Subject: [PATCH] Move package commands to core/autoload/packages.el --- core/autoload/packages.el | 151 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 core/autoload/packages.el diff --git a/core/autoload/packages.el b/core/autoload/packages.el new file mode 100644 index 000000000..9adc427d0 --- /dev/null +++ b/core/autoload/packages.el @@ -0,0 +1,151 @@ +;;; packages.el + +;;;###autoload +(defun doom-package-outdated-p (package) + "Determine whether PACKAGE (a symbol) is outdated or not. If outdated, returns +a cons cell, whose car is the current version string of PACKAGE (a symbol), and +whose cdr is the latest version of the package. Be sure to run +`package-refresh-contents' beforehand, or the return value could be out of +date." + (unless package-selected-packages + (doom-initialize)) + (when (and (memq package package-selected-packages) + (package-installed-p package) + (quelpa-setup-p)) + (let* ((pkg-recipe (cdr (assq 'quelpa quelpa-cache))) + (cur-desc (cadr (or (assq package package-alist) + (assq package package--builtins)))) + (cur-version (package-desc-version cur-desc)) + (inhibit-message t) + new-version) + (setq new-version + (if pkg-recipe + (let ((ver (quelpa-checkout + pkg-recipe + (f-expand (symbol-name package) quelpa-build-dir)))) + (or (and ver (version-to-list ver)) cur-version)) + (package-desc-version (cadr (assq package package-archive-contents))))) + (unless (version-list-<= new-version cur-version) + (cons cur-version new-version))))) + +;;;###autoload +(defun doom/packages-install () + "Install missing packages." + (interactive) + (let ((pkg-n (doom-reload-packages :install))) + (if (= pkg-n 0) + (message "Nothing to install") + (message "\nInstalled %s packages:\n%s" pkg-n + (mapconcat (lambda (pkg) (concat "+ " (symbol-name pkg))) + doom-installed-packages "\n"))))) + +;;;###autoload +(defun doom/packages-update () + "Update outdated packages. This includes quelpa-installed packages and ELPA +packages. This will delete old versions of packages as well." + (interactive) + (message "Refreshing packages...") + (doom-initialize t) + (if (not package-alist) + (message "No packages are installed") + (require 'quelpa) + (when (quelpa-setup-p) + (setq quelpa-cache (--filter (package-installed-p (car it)) quelpa-cache))) + (let* ((err 0) + (quelpa-packages (-map 'car quelpa-cache)) + (elpa-packages (-difference (package--find-non-dependencies) quelpa-packages)) + quelpa-modified-p + outdated-packages) + (message "ELPA\n%s\n\nQUELPA\n%s" elpa-packages quelpa-packages) + (dolist (pkg (append quelpa-packages elpa-packages)) + (awhen (doom-package-outdated-p pkg) + (push (list pkg it) outdated-packages))) + (message "\nOUTDATED\n%s" outdated-packages) + ;; (cond ((not outdated-packages) + ;; (message "Everything is up-to-date")) + + ;; ((not (y-or-n-p + ;; (format "%s packages will be updated:\n%s\n\nProceed?" + ;; (length outdated-packages) + ;; (mapconcat (lambda (pkg) (format "%s: %s -> %s" + ;; (car pkg) + ;; (car (cdr pkg)) + ;; (cdr (cdr pkg)))) + ;; (--sort (string-lessp (symbol-name (car it)) + ;; (symbol-name (car other))) + ;; outdated-packages) ", ")))) + ;; (message "Aborted")) + + ;; (t + ;; (dolist (pkg outdated-packages) + ;; (condition-case ex + ;; (cond ((assq pkg quelpa-outdated-packages) + ;; (let ((inhibit-message t)) + ;; (quelpa package) + ;; (setq quelpa-modified-p t))) + ;; ((memq pkg elpa-outdated-packages) + ;; (let ((desc (cadr (assq pkg package-alist))) + ;; (archive (cadr (assoc pkg package-archive-contents)))) + ;; (package-install-from-archive archive) + ;; (delete-directory (package-desc-dir desc) t))) + ;; (t (error "Not a valid package"))) + ;; ('error + ;; (setq err (1+ err)) + ;; (message "ERROR (%s): %s" pkg ex)))))) + ;; (when quelpa-modified-p + ;; (quelpa-save-cache)) + ;; (if (> err 0) + ;; (message "Done, but with %s errors" err) + ;; (message "Done")) + ))) + +;;;###autoload +(defun doom/packages-clean () + "Delete packages that are no longer used or depended on." + (interactive) + (doom-reload-packages) + (let* ((package-selected-packages (-intersection (package--find-non-dependencies) + (append doom-packages doom-protected-packages))) + (packages-to-delete (-difference (package--removable-packages) doom-protected-packages)) + quelpa-modified-p) + (cond ((not package-selected-packages) + (message "No packages installed!")) + + ((not packages-to-delete) + (message "No unused packages to remove.")) + + ((not (y-or-n-p + (format "%s packages will be deleted:\n%s\n\nProceed?" + (length packages-to-delete) + (mapconcat 'symbol-name (-sort 'string-lessp packages-to-delete) ", ")))) + (message "Aborted.")) + + (t + (require 'quelpa) + (quelpa-setup-p) + (dolist (p packages-to-delete) + (package-delete (cadr (assq p package-alist)) t) + (when (and quelpa-cache (assq p quelpa-cache)) + (setq quelpa-cache (assq-delete-all p quelpa-cache) + quelpa-modified-p t))) + (when quelpa-modified-p + (quelpa-save-cache)))))) + +;;;###autoload +(defun doom/packages-reload () + "Reload `load-path' by scanning all packages. Run this if you ran make update +or make clean outside of Emacs." + (interactive) + (doom-initialize t) + (message "Reloaded %s packages" (length package-alist))) + +;;;###autoload +(defun doom/packages-delete (&optional package) + "Attempt to delete PACKAGE. Wraps around `package-delete'." + (interactive) + (doom-reload-packages) + (let* ((pkg (or package (completing-read "Delete package: " doom-packages nil t))) + (pkg-desc (cdr (assq pkg package-alist)))) + (unless pkg-desc + (error "Couldn't find the package %s" package)) + (package-delete pkg-desc)))