1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-27 07:41:28 -08:00

emacs-lisp/package.el: Refactor pre-execute prompt

This commit is contained in:
Artur Malabarba 2015-04-05 22:44:17 +01:00
parent 7436b68132
commit b6610d5547
3 changed files with 56 additions and 51 deletions

View file

@ -2697,6 +2697,31 @@ call will upgrade the package."
(length upgrades)
(if (= (length upgrades) 1) "" "s")))))
(defun package-menu--prompt-transaction-p (ins del)
"Prompt the user about installing INS and deleting DEL.
INS and DEL are lists of `package-desc'. Either may be nil, but
not both."
(y-or-n-p
(concat
(when ins
(let ((lins (length ins)))
(if (= lins 1)
(format "INSTALL package `%s'"
(package-desc-full-name (car ins)))
(format "INSTALL these %d packages (%s)"
lins
(mapconcat #'package-desc-full-name ins ", ")))))
(when (and del ins) " and ")
(when del
(let ((ldel (length del)))
(if (= ldel 1)
(format "DELETE package `%s'"
(package-desc-full-name (car del)))
(format "DELETE these %d packages (%s)"
ldel
(mapconcat #'package-desc-full-name del ", ")))))
"? ")))
(defun package-menu-execute (&optional noquery)
"Perform marked Package Menu actions.
Packages marked for installation are downloaded and installed;
@ -2718,43 +2743,21 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
((eq cmd ?I)
(push pkg-desc install-list))))
(forward-line)))
(when install-list
(if (or
noquery
(yes-or-no-p
(if (= (length install-list) 1)
(format "Install package `%s'? "
(package-desc-full-name (car install-list)))
(format "Install these %d packages (%s)? "
(length install-list)
(mapconcat #'package-desc-full-name
install-list ", ")))))
(mapc (lambda (p)
;; Don't mark as selected if it's a new version of
;; an installed package.
(package-install p (and (not (package-installed-p p))
(package-installed-p
(package-desc-name p)))))
install-list)))
;; Delete packages, prompting if necessary.
(when delete-list
(if (or
noquery
(yes-or-no-p
(if (= (length delete-list) 1)
(format "Delete package `%s'? "
(package-desc-full-name (car delete-list)))
(format "Delete these %d packages (%s)? "
(length delete-list)
(mapconcat #'package-desc-full-name
delete-list ", ")))))
(dolist (elt (package--sort-by-dependence delete-list))
(condition-case-unless-debug err
(package-delete elt)
(error (message (cadr err)))))
(error "Aborted")))
(if (not (or delete-list install-list))
(message "No operations specified.")
(unless (or delete-list install-list)
(user-error "No operations specified"))
(when (or noquery
(package-menu--prompt-transaction-p install-list delete-list))
;; Don't mark as selected if it's a new version of an installed
;; package.
(mapc (lambda (p) (package-install p (and (not (package-installed-p p))
(package-installed-p
(package-desc-name p)))))
install-list)
;; Delete packages.
(dolist (elt (package--sort-by-dependence delete-list))
(condition-case-unless-debug err
(package-delete elt)
(error (message (cadr err)))))
(when package-selected-packages
(let ((removable (package--removable-packages)))
(when (and removable
@ -2764,8 +2767,8 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
(mapconcat #'symbol-name removable ", "))))
;; We know these are removable, so we can use force instead of sorting them.
(mapc (lambda (p) (package-delete (cadr (assq p package-alist)) 'force 'nosave))
removable))))
(package-menu--generate t t))))
removable)))))
(package-menu--generate t t)))
(defun package-menu--version-predicate (A B)
(let ((vA (or (aref (cadr A) 1) '(0)))