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)
(package-desc-name pkg)
pkg)))
(when (and mark-selected (not (package--user-selected-p name)))
(customize-save-variable 'package-selected-packages (customize-save-variable 'package-selected-packages
(cons pkg 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,6 +1459,11 @@ 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)
;; 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 (cl-loop for p in package-selected-packages
unless (package-installed-p p) unless (package-installed-p p)
collect p into lst collect p into lst
@ -1453,7 +1474,7 @@ If some packages are not installed propose to install them."
(length lst) (length lst)
(mapconcat #'symbol-name lst ", "))) (mapconcat #'symbol-name lst ", ")))
(mapc #'package-install lst)) (mapc #'package-install lst))
(message "All your packages are already installed")))) (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)
;; 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 (let ((needed (cl-loop for p in package-selected-packages
if (assq p package-alist) if (assq p package-alist)
append (package--get-deps p)))) ;; `p' and its dependencies are needed.
append (cons p (package--get-deps p)))))
(cl-loop for p in (mapcar #'car package-alist) (cl-loop for p in (mapcar #'car package-alist)
unless (or (memq p needed) unless (memq p needed)
(memq p package-selected-packages))
collect p into lst collect p into lst
finally (if lst finally (if lst
(when (y-or-n-p (format "%s packages will be deleted:\n%s, proceed? " (when (y-or-n-p
(format "%s packages will be deleted:\n%s, proceed? "
(length lst) (length lst)
(mapconcat #'symbol-name lst ", "))) (mapconcat #'symbol-name lst ", ")))
(mapc (lambda (p) (mapc (lambda (p)
(package-delete (cadr (assq p package-alist)) t)) (package-delete (cadr (assq p package-alist)) t))
lst)) lst))
(message "Nothing to autoremove"))))) (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))