aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorArtur Malabarba2015-02-05 19:36:59 -0200
committerArtur Malabarba2015-02-05 20:12:47 -0200
commit3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6 (patch)
treedb0be78f030744d7a089e352e11a2d2a563ea8a2 /lisp
parent6b1d71150b80dfbe4d50e78e6b4fb259931ac907 (diff)
downloademacs-3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6.tar.gz
emacs-3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6.zip
emacs-lisp/package.el (package-menu-execute): Delete packages in order.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/emacs-lisp/package.el39
2 files changed, 44 insertions, 2 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index f9b56421297..be03e569e58 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
12015-02-05 Artur Malabarba <bruce.connor.am@gmail.com>
2
3 * emacs-lisp/package.el (package--sort-by-dependence): New
4 function. Return PACKAGE-LIST sorted by dependencies.
5 (package-menu-execute): Use it to delete packages in order.
6 (package--sort-deps-in-alist): New function.
7
12015-02-05 Stefan Monnier <monnier@iro.umontreal.ca> 82015-02-05 Stefan Monnier <monnier@iro.umontreal.ca>
2 9
3 * textmodes/css-mode.el (scss-smie--not-interpolation-p): Vars can be 10 * textmodes/css-mode.el (scss-smie--not-interpolation-p): Vars can be
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 67cd44d6758..2932efa7535 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2351,6 +2351,40 @@ call will upgrade the package."
2351 (length upgrades) 2351 (length upgrades)
2352 (if (= (length upgrades) 1) "" "s"))))) 2352 (if (= (length upgrades) 1) "" "s")))))
2353 2353
2354(defun package--sort-deps-in-alist (package only)
2355 "Return a list of dependencies for PACKAGE sorted by dependency.
2356PACKAGE is included as the first element of the returned list.
2357ONLY is an alist associating package names to package objects.
2358Only these packages will be in the return value an their cdrs are
2359destructively set to nil in ONLY."
2360 (let ((out))
2361 (dolist (dep (package-desc-reqs package))
2362 (when-let ((cell (assq (car dep) only))
2363 (dep-package (cdr-safe cell)))
2364 (setcdr cell nil)
2365 (setq out (append (package--sort-deps-in-alist dep-package only)
2366 out))))
2367 (cons package out)))
2368
2369(defun package--sort-by-dependence (package-list)
2370 "Return PACKAGE-LIST sorted by dependence.
2371That is, any element of the returned list is guaranteed to not
2372directly depend on any elements that come before it.
2373
2374PACKAGE-LIST is a list of package-desc objects.
2375Indirect dependencies are guaranteed to be returned in order only
2376if all the in-between dependencies are also in PACKAGE-LIST."
2377 (let ((alist (mapcar (lambda (p) (cons (package-desc-name p) p)) package-list))
2378 out-list)
2379 (dolist (cell alist out-list)
2380 ;; `package--sort-deps-in-alist' destructively changes alist, so
2381 ;; some cells might already be empty. We check this here.
2382 (when-let ((pkg-desc (cdr cell)))
2383 (setcdr cell nil)
2384 (setq out-list
2385 (append (package--sort-deps-in-alist pkg-desc alist)
2386 out-list))))))
2387
2354(defun package-menu-execute (&optional noquery) 2388(defun package-menu-execute (&optional noquery)
2355 "Perform marked Package Menu actions. 2389 "Perform marked Package Menu actions.
2356Packages marked for installation are downloaded and installed; 2390Packages marked for installation are downloaded and installed;
@@ -2398,7 +2432,7 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
2398 (length delete-list) 2432 (length delete-list)
2399 (mapconcat #'package-desc-full-name 2433 (mapconcat #'package-desc-full-name
2400 delete-list ", "))))) 2434 delete-list ", ")))))
2401 (dolist (elt delete-list) 2435 (dolist (elt (package--sort-by-dependence delete-list))
2402 (condition-case-unless-debug err 2436 (condition-case-unless-debug err
2403 (package-delete elt) 2437 (package-delete elt)
2404 (error (message (cadr err))))) 2438 (error (message (cadr err)))))
@@ -2412,7 +2446,8 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
2412 (format "These %d packages are no longer needed, delete them (%s)? " 2446 (format "These %d packages are no longer needed, delete them (%s)? "
2413 (length removable) 2447 (length removable)
2414 (mapconcat #'symbol-name removable ", ")))) 2448 (mapconcat #'symbol-name removable ", "))))
2415 (mapc (lambda (p) (package-delete (cadr (assq p package-alist)))) 2449 ;; We know these are removable, so we can use force instead of sorting them.
2450 (mapc (lambda (p) (package-delete (cadr (assq p package-alist)) 'force 'nosave))
2416 removable)))) 2451 removable))))
2417 (package-menu--generate t t)))) 2452 (package-menu--generate t t))))
2418 2453