diff options
author | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-02-03 13:43:10 +0000 |
---|---|---|
committer | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-02-03 13:54:41 +0000 |
commit | c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b (patch) | |
tree | f62bbf32a9a6717aa1676b991d7680e36d0154e8 /lisp/emacs-lisp/package.el | |
parent | 6d767f961fe9f3bff9f59f5902db7925e6da19ef (diff) | |
download | emacs-c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b.tar.gz emacs-c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b.tar.bz2 emacs-c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b.zip |
emacs-lisp/package.el (package--user-selected-p): New function.
Populates `package-selected-packages' if necessary, and then checks if
symbol PKG is contained in it.
Diffstat (limited to 'lisp/emacs-lisp/package.el')
-rw-r--r-- | lisp/emacs-lisp/package.el | 105 |
1 files changed, 65 insertions, 40 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ade36d7c7d3..bda88b659d1 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -340,7 +340,11 @@ when installing a new package. This variable will be used by `package-autoremove' to decide which packages are no more needed. You can use it to (re)install packages on other machines -by running `package-user-selected-packages-install'." +by running `package-user-selected-packages-install'. + +To check if a package is contained in this list here, use +`package--user-selected-p', as it may populate the variable with +a sane initial value." :group 'package :type '(repeat symbol)) @@ -1189,6 +1193,17 @@ number." nil)) alist))) +(defun package--user-selected-p (pkg) + "Return non-nil if PKG is a package was installed by the user. +PKG is a package name. +This looks into `package-selected-packages', populating it first +if it is still empty." + (unless (consp package-selected-packages) + (customize-save-variable + 'package-selected-packages + (setq package-selected-packages (package--find-non-dependencies)))) + (memq pkg package-selected-packages)) + (defun package-download-transaction (packages) "Download and install all the packages in PACKAGES. PACKAGES should be a list of package-desc. @@ -1222,9 +1237,12 @@ to `package-selected-packages'." package-archive-contents)) nil t)) t))) - (when (and mark-selected (not (memq pkg package-selected-packages))) - (customize-save-variable 'package-selected-packages - (cons pkg package-selected-packages))) + (let ((name (if (package-desc-p pkg) + (package-desc-name pkg) + pkg))) + (when (and mark-selected (not (package--user-selected-p name))) + (customize-save-variable 'package-selected-packages + (cons name package-selected-packages)))) (package-download-transaction (if (package-desc-p pkg) (package-compute-transaction (list pkg) @@ -1239,8 +1257,7 @@ to `package-selected-packages'." "Reinstall package: " (mapcar #'symbol-name (mapcar #'car package-alist)))))) - (package-delete (cadr (assq pkg package-alist)) 'force - (memq pkg package-selected-packages)) + (package-delete (cadr (assq pkg package-alist)) 'force 'nosave) (package-install pkg)) (defun package-strip-rcs-id (str) @@ -1402,10 +1419,9 @@ Downloads and installs required packages as needed." (package-download-transaction transaction)) ;; Install the package itself. (package-unpack pkg-desc) - (unless (memq name package-selected-packages) - (push name package-selected-packages) + (unless (package--user-selected-p name) (customize-save-variable 'package-selected-packages - package-selected-packages)) + (cons name package-selected-packages))) pkg-desc)) ;;;###autoload @@ -1443,17 +1459,22 @@ The file can either be a tar file or an Emacs Lisp file." "Ensure packages in `package-selected-packages' are installed. If some packages are not installed propose to install them." (interactive) - (cl-loop for p in package-selected-packages - unless (package-installed-p p) - collect p into lst - finally - (if lst - (when (y-or-n-p - (format "%s packages will be installed:\n%s, proceed?" - (length lst) - (mapconcat #'symbol-name lst ", "))) - (mapc #'package-install lst)) - (message "All your packages are already installed")))) + ;; We don't need to populate `package-selected-packages' before + ;; using here, because the outcome is the same either way (nothing + ;; gets installed). + (if (not package-selected-packages) + (message "`package-selected-packages' is empty, nothing to install") + (cl-loop for p in package-selected-packages + unless (package-installed-p p) + collect p into lst + finally + (if lst + (when (y-or-n-p + (format "%s packages will be installed:\n%s, proceed?" + (length lst) + (mapconcat #'symbol-name lst ", "))) + (mapc #'package-install lst)) + (message "All your packages are already installed"))))) (defun package--used-elsewhere-p (pkg-desc &optional pkg-list) "Non-nil if PKG-DESC is a dependency of a package in PKG-LIST. @@ -1509,8 +1530,8 @@ If NOSAVE is non-nil, the package is not removed from (unless (cdr pkgs) (setq package-alist (delq pkgs package-alist)))) ;; Update package-selected-packages. - (when (and (memq name package-selected-packages) - (null nosave)) + (when (and (null nosave) + (package--user-selected-p name)) (customize-save-variable 'package-selected-packages (remove name package-selected-packages))) (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) @@ -1523,21 +1544,28 @@ Packages that are no more needed by other packages in `package-selected-packages' and their dependencies will be deleted." (interactive) - (let ((needed (cl-loop for p in package-selected-packages - if (assq p package-alist) - append (package--get-deps p)))) - (cl-loop for p in (mapcar #'car package-alist) - unless (or (memq p needed) - (memq p package-selected-packages)) - collect p into lst - finally (if lst - (when (y-or-n-p (format "%s packages will be deleted:\n%s, proceed? " - (length lst) - (mapconcat #'symbol-name lst ", "))) - (mapc (lambda (p) - (package-delete (cadr (assq p package-alist)) t)) - lst)) - (message "Nothing to autoremove"))))) + ;; If `package-selected-packages' is nil, it would make no sense to + ;; try to populate it here, because then `package-autoremove' will + ;; do absolutely nothing. + (when (or package-selected-packages + (yes-or-no-p + "`package-selected-packages' is empty! Really remove ALL packages? ")) + (let ((needed (cl-loop for p in package-selected-packages + if (assq p package-alist) + ;; `p' and its dependencies are needed. + append (cons p (package--get-deps p))))) + (cl-loop for p in (mapcar #'car package-alist) + unless (memq p needed) + collect p into lst + finally (if lst + (when (y-or-n-p + (format "%s packages will be deleted:\n%s, proceed? " + (length lst) + (mapconcat #'symbol-name lst ", "))) + (mapc (lambda (p) + (package-delete (cadr (assq p package-alist)) t)) + lst)) + (message "Nothing to autoremove")))))) (defun package-archive-base (desc) "Return the archive containing the package NAME." @@ -1663,9 +1691,6 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages." (unless no-activate (dolist (elt package-alist) (package-activate (car elt)))) - (when (and package-alist (not package-selected-packages)) - (customize-save-variable 'package-selected-packages - (package--find-non-dependencies))) (setq package--initialized t)) |