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.
This commit is contained in:
Artur Malabarba 2015-02-03 13:43:10 +00:00
parent 6d767f961f
commit c184e85ea2
2 changed files with 77 additions and 40 deletions

View file

@ -2,6 +2,18 @@
* emacs-lisp/package.el (package-delete): Document NOSAVE. * emacs-lisp/package.el (package-delete): Document NOSAVE.
(package--get-deps): delete-dups when ONLY is nil. (package--get-deps): delete-dups when ONLY is nil.
(package-autoremove): Warn the user if `package-selected-packages'
is empty.
(package--user-selected-p): New function.
(package-delete, package-install, package-install-from-buffer):
Use it
(package-selected-packages): Mention it.
(package-initialize): Don't populate `package-selected-packages'.
(package-install-user-selected-packages, package-autoremove):
Special handling for empty `package-selected-packages'.
(package-install): Fix when PKG is a package-desc.
2015-02-03 Thierry Volpiatto <thierry.volpiatto@gmail.com> 2015-02-03 Thierry Volpiatto <thierry.volpiatto@gmail.com>

View file

@ -340,7 +340,11 @@ when installing a new package.
This variable will be used by `package-autoremove' to decide This variable will be used by `package-autoremove' to decide
which packages are no more needed. which packages are no more needed.
You can use it to (re)install packages on other machines 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 :group 'package
:type '(repeat symbol)) :type '(repeat symbol))
@ -1189,6 +1193,17 @@ number."
nil)) nil))
alist))) 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) (defun package-download-transaction (packages)
"Download and install all the packages in PACKAGES. "Download and install all the packages in PACKAGES.
PACKAGES should be a list of package-desc. PACKAGES should be a list of package-desc.
@ -1222,9 +1237,12 @@ to `package-selected-packages'."
package-archive-contents)) package-archive-contents))
nil t)) nil t))
t))) t)))
(when (and mark-selected (not (memq pkg package-selected-packages))) (let ((name (if (package-desc-p pkg)
(customize-save-variable 'package-selected-packages (package-desc-name pkg)
(cons pkg package-selected-packages))) 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 (package-download-transaction
(if (package-desc-p pkg) (if (package-desc-p pkg)
(package-compute-transaction (list pkg) (package-compute-transaction (list pkg)
@ -1239,8 +1257,7 @@ to `package-selected-packages'."
"Reinstall package: " "Reinstall package: "
(mapcar #'symbol-name (mapcar #'symbol-name
(mapcar #'car package-alist)))))) (mapcar #'car package-alist))))))
(package-delete (cadr (assq pkg package-alist)) 'force (package-delete (cadr (assq pkg package-alist)) 'force 'nosave)
(memq pkg package-selected-packages))
(package-install pkg)) (package-install pkg))
(defun package-strip-rcs-id (str) (defun package-strip-rcs-id (str)
@ -1402,10 +1419,9 @@ Downloads and installs required packages as needed."
(package-download-transaction transaction)) (package-download-transaction transaction))
;; Install the package itself. ;; Install the package itself.
(package-unpack pkg-desc) (package-unpack pkg-desc)
(unless (memq name package-selected-packages) (unless (package--user-selected-p name)
(push name package-selected-packages)
(customize-save-variable 'package-selected-packages (customize-save-variable 'package-selected-packages
package-selected-packages)) (cons name package-selected-packages)))
pkg-desc)) pkg-desc))
;;;###autoload ;;;###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. "Ensure packages in `package-selected-packages' are installed.
If some packages are not installed propose to install them." If some packages are not installed propose to install them."
(interactive) (interactive)
(cl-loop for p in package-selected-packages ;; We don't need to populate `package-selected-packages' before
unless (package-installed-p p) ;; using here, because the outcome is the same either way (nothing
collect p into lst ;; gets installed).
finally (if (not package-selected-packages)
(if lst (message "`package-selected-packages' is empty, nothing to install")
(when (y-or-n-p (cl-loop for p in package-selected-packages
(format "%s packages will be installed:\n%s, proceed?" unless (package-installed-p p)
(length lst) collect p into lst
(mapconcat #'symbol-name lst ", "))) finally
(mapc #'package-install lst)) (if lst
(message "All your packages are already installed")))) (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) (defun package--used-elsewhere-p (pkg-desc &optional pkg-list)
"Non-nil if PKG-DESC is a dependency of a package in 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) (unless (cdr pkgs)
(setq package-alist (delq pkgs package-alist)))) (setq package-alist (delq pkgs package-alist))))
;; Update package-selected-packages. ;; Update package-selected-packages.
(when (and (memq name package-selected-packages) (when (and (null nosave)
(null nosave)) (package--user-selected-p name))
(customize-save-variable (customize-save-variable
'package-selected-packages (remove name package-selected-packages))) 'package-selected-packages (remove name package-selected-packages)))
(message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) (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 `package-selected-packages' and their dependencies
will be deleted." will be deleted."
(interactive) (interactive)
(let ((needed (cl-loop for p in package-selected-packages ;; If `package-selected-packages' is nil, it would make no sense to
if (assq p package-alist) ;; try to populate it here, because then `package-autoremove' will
append (package--get-deps p)))) ;; do absolutely nothing.
(cl-loop for p in (mapcar #'car package-alist) (when (or package-selected-packages
unless (or (memq p needed) (yes-or-no-p
(memq p package-selected-packages)) "`package-selected-packages' is empty! Really remove ALL packages? "))
collect p into lst (let ((needed (cl-loop for p in package-selected-packages
finally (if lst if (assq p package-alist)
(when (y-or-n-p (format "%s packages will be deleted:\n%s, proceed? " ;; `p' and its dependencies are needed.
(length lst) append (cons p (package--get-deps p)))))
(mapconcat #'symbol-name lst ", "))) (cl-loop for p in (mapcar #'car package-alist)
(mapc (lambda (p) unless (memq p needed)
(package-delete (cadr (assq p package-alist)) t)) collect p into lst
lst)) finally (if lst
(message "Nothing to autoremove"))))) (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) (defun package-archive-base (desc)
"Return the archive containing the package NAME." "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 (unless no-activate
(dolist (elt package-alist) (dolist (elt package-alist)
(package-activate (car elt)))) (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)) (setq package--initialized t))