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:
parent
6d767f961f
commit
c184e85ea2
2 changed files with 77 additions and 40 deletions
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue