diff options
| author | Artur Malabarba | 2015-02-05 19:36:59 -0200 |
|---|---|---|
| committer | Artur Malabarba | 2015-02-05 20:12:47 -0200 |
| commit | 3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6 (patch) | |
| tree | db0be78f030744d7a089e352e11a2d2a563ea8a2 | |
| parent | 6b1d71150b80dfbe4d50e78e6b4fb259931ac907 (diff) | |
| download | emacs-3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6.tar.gz emacs-3c5ac257029ddc60caf87a6ed4e229ceb3fbf9f6.zip | |
emacs-lisp/package.el (package-menu-execute): Delete packages in order.
| -rw-r--r-- | lisp/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 39 |
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 @@ | |||
| 1 | 2015-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 | |||
| 1 | 2015-02-05 Stefan Monnier <monnier@iro.umontreal.ca> | 8 | 2015-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. | ||
| 2356 | PACKAGE is included as the first element of the returned list. | ||
| 2357 | ONLY is an alist associating package names to package objects. | ||
| 2358 | Only these packages will be in the return value an their cdrs are | ||
| 2359 | destructively 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. | ||
| 2371 | That is, any element of the returned list is guaranteed to not | ||
| 2372 | directly depend on any elements that come before it. | ||
| 2373 | |||
| 2374 | PACKAGE-LIST is a list of package-desc objects. | ||
| 2375 | Indirect dependencies are guaranteed to be returned in order only | ||
| 2376 | if 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. |
| 2356 | Packages marked for installation are downloaded and installed; | 2390 | Packages 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 | ||