diff options
| -rw-r--r-- | lisp/ChangeLog | 12 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 105 |
2 files changed, 77 insertions, 40 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 61e05705c41..d3850310dc5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -2,6 +2,18 @@ | |||
| 2 | 2 | ||
| 3 | * emacs-lisp/package.el (package-delete): Document NOSAVE. | 3 | * emacs-lisp/package.el (package-delete): Document NOSAVE. |
| 4 | (package--get-deps): delete-dups when ONLY is nil. | 4 | (package--get-deps): delete-dups when ONLY is nil. |
| 5 | (package-autoremove): Warn the user if `package-selected-packages' | ||
| 6 | is empty. | ||
| 7 | |||
| 8 | (package--user-selected-p): New function. | ||
| 9 | (package-delete, package-install, package-install-from-buffer): | ||
| 10 | Use it | ||
| 11 | (package-selected-packages): Mention it. | ||
| 12 | |||
| 13 | (package-initialize): Don't populate `package-selected-packages'. | ||
| 14 | (package-install-user-selected-packages, package-autoremove): | ||
| 15 | Special handling for empty `package-selected-packages'. | ||
| 16 | (package-install): Fix when PKG is a package-desc. | ||
| 5 | 17 | ||
| 6 | 2015-02-03 Thierry Volpiatto <thierry.volpiatto@gmail.com> | 18 | 2015-02-03 Thierry Volpiatto <thierry.volpiatto@gmail.com> |
| 7 | 19 | ||
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ade36d7c7d3..bda88b659d1 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -340,7 +340,11 @@ when installing a new package. | |||
| 340 | This variable will be used by `package-autoremove' to decide | 340 | This variable will be used by `package-autoremove' to decide |
| 341 | which packages are no more needed. | 341 | which packages are no more needed. |
| 342 | You can use it to (re)install packages on other machines | 342 | You can use it to (re)install packages on other machines |
| 343 | by running `package-user-selected-packages-install'." | 343 | by running `package-user-selected-packages-install'. |
| 344 | |||
| 345 | To check if a package is contained in this list here, use | ||
| 346 | `package--user-selected-p', as it may populate the variable with | ||
| 347 | a sane initial value." | ||
| 344 | :group 'package | 348 | :group 'package |
| 345 | :type '(repeat symbol)) | 349 | :type '(repeat symbol)) |
| 346 | 350 | ||
| @@ -1189,6 +1193,17 @@ number." | |||
| 1189 | nil)) | 1193 | nil)) |
| 1190 | alist))) | 1194 | alist))) |
| 1191 | 1195 | ||
| 1196 | (defun package--user-selected-p (pkg) | ||
| 1197 | "Return non-nil if PKG is a package was installed by the user. | ||
| 1198 | PKG is a package name. | ||
| 1199 | This looks into `package-selected-packages', populating it first | ||
| 1200 | if it is still empty." | ||
| 1201 | (unless (consp package-selected-packages) | ||
| 1202 | (customize-save-variable | ||
| 1203 | 'package-selected-packages | ||
| 1204 | (setq package-selected-packages (package--find-non-dependencies)))) | ||
| 1205 | (memq pkg package-selected-packages)) | ||
| 1206 | |||
| 1192 | (defun package-download-transaction (packages) | 1207 | (defun package-download-transaction (packages) |
| 1193 | "Download and install all the packages in PACKAGES. | 1208 | "Download and install all the packages in PACKAGES. |
| 1194 | PACKAGES should be a list of package-desc. | 1209 | PACKAGES should be a list of package-desc. |
| @@ -1222,9 +1237,12 @@ to `package-selected-packages'." | |||
| 1222 | package-archive-contents)) | 1237 | package-archive-contents)) |
| 1223 | nil t)) | 1238 | nil t)) |
| 1224 | t))) | 1239 | t))) |
| 1225 | (when (and mark-selected (not (memq pkg package-selected-packages))) | 1240 | (let ((name (if (package-desc-p pkg) |
| 1226 | (customize-save-variable 'package-selected-packages | 1241 | (package-desc-name pkg) |
| 1227 | (cons pkg package-selected-packages))) | 1242 | pkg))) |
| 1243 | (when (and mark-selected (not (package--user-selected-p name))) | ||
| 1244 | (customize-save-variable 'package-selected-packages | ||
| 1245 | (cons name package-selected-packages)))) | ||
| 1228 | (package-download-transaction | 1246 | (package-download-transaction |
| 1229 | (if (package-desc-p pkg) | 1247 | (if (package-desc-p pkg) |
| 1230 | (package-compute-transaction (list pkg) | 1248 | (package-compute-transaction (list pkg) |
| @@ -1239,8 +1257,7 @@ to `package-selected-packages'." | |||
| 1239 | "Reinstall package: " | 1257 | "Reinstall package: " |
| 1240 | (mapcar #'symbol-name | 1258 | (mapcar #'symbol-name |
| 1241 | (mapcar #'car package-alist)))))) | 1259 | (mapcar #'car package-alist)))))) |
| 1242 | (package-delete (cadr (assq pkg package-alist)) 'force | 1260 | (package-delete (cadr (assq pkg package-alist)) 'force 'nosave) |
| 1243 | (memq pkg package-selected-packages)) | ||
| 1244 | (package-install pkg)) | 1261 | (package-install pkg)) |
| 1245 | 1262 | ||
| 1246 | (defun package-strip-rcs-id (str) | 1263 | (defun package-strip-rcs-id (str) |
| @@ -1402,10 +1419,9 @@ Downloads and installs required packages as needed." | |||
| 1402 | (package-download-transaction transaction)) | 1419 | (package-download-transaction transaction)) |
| 1403 | ;; Install the package itself. | 1420 | ;; Install the package itself. |
| 1404 | (package-unpack pkg-desc) | 1421 | (package-unpack pkg-desc) |
| 1405 | (unless (memq name package-selected-packages) | 1422 | (unless (package--user-selected-p name) |
| 1406 | (push name package-selected-packages) | ||
| 1407 | (customize-save-variable 'package-selected-packages | 1423 | (customize-save-variable 'package-selected-packages |
| 1408 | package-selected-packages)) | 1424 | (cons name package-selected-packages))) |
| 1409 | pkg-desc)) | 1425 | pkg-desc)) |
| 1410 | 1426 | ||
| 1411 | ;;;###autoload | 1427 | ;;;###autoload |
| @@ -1443,17 +1459,22 @@ The file can either be a tar file or an Emacs Lisp file." | |||
| 1443 | "Ensure packages in `package-selected-packages' are installed. | 1459 | "Ensure packages in `package-selected-packages' are installed. |
| 1444 | If some packages are not installed propose to install them." | 1460 | If some packages are not installed propose to install them." |
| 1445 | (interactive) | 1461 | (interactive) |
| 1446 | (cl-loop for p in package-selected-packages | 1462 | ;; We don't need to populate `package-selected-packages' before |
| 1447 | unless (package-installed-p p) | 1463 | ;; using here, because the outcome is the same either way (nothing |
| 1448 | collect p into lst | 1464 | ;; gets installed). |
| 1449 | finally | 1465 | (if (not package-selected-packages) |
| 1450 | (if lst | 1466 | (message "`package-selected-packages' is empty, nothing to install") |
| 1451 | (when (y-or-n-p | 1467 | (cl-loop for p in package-selected-packages |
| 1452 | (format "%s packages will be installed:\n%s, proceed?" | 1468 | unless (package-installed-p p) |
| 1453 | (length lst) | 1469 | collect p into lst |
| 1454 | (mapconcat #'symbol-name lst ", "))) | 1470 | finally |
| 1455 | (mapc #'package-install lst)) | 1471 | (if lst |
| 1456 | (message "All your packages are already installed")))) | 1472 | (when (y-or-n-p |
| 1473 | (format "%s packages will be installed:\n%s, proceed?" | ||
| 1474 | (length lst) | ||
| 1475 | (mapconcat #'symbol-name lst ", "))) | ||
| 1476 | (mapc #'package-install lst)) | ||
| 1477 | (message "All your packages are already installed"))))) | ||
| 1457 | 1478 | ||
| 1458 | (defun package--used-elsewhere-p (pkg-desc &optional pkg-list) | 1479 | (defun package--used-elsewhere-p (pkg-desc &optional pkg-list) |
| 1459 | "Non-nil if PKG-DESC is a dependency of a package in PKG-LIST. | 1480 | "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 | |||
| 1509 | (unless (cdr pkgs) | 1530 | (unless (cdr pkgs) |
| 1510 | (setq package-alist (delq pkgs package-alist)))) | 1531 | (setq package-alist (delq pkgs package-alist)))) |
| 1511 | ;; Update package-selected-packages. | 1532 | ;; Update package-selected-packages. |
| 1512 | (when (and (memq name package-selected-packages) | 1533 | (when (and (null nosave) |
| 1513 | (null nosave)) | 1534 | (package--user-selected-p name)) |
| 1514 | (customize-save-variable | 1535 | (customize-save-variable |
| 1515 | 'package-selected-packages (remove name package-selected-packages))) | 1536 | 'package-selected-packages (remove name package-selected-packages))) |
| 1516 | (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) | 1537 | (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) |
| @@ -1523,21 +1544,28 @@ Packages that are no more needed by other packages in | |||
| 1523 | `package-selected-packages' and their dependencies | 1544 | `package-selected-packages' and their dependencies |
| 1524 | will be deleted." | 1545 | will be deleted." |
| 1525 | (interactive) | 1546 | (interactive) |
| 1526 | (let ((needed (cl-loop for p in package-selected-packages | 1547 | ;; If `package-selected-packages' is nil, it would make no sense to |
| 1527 | if (assq p package-alist) | 1548 | ;; try to populate it here, because then `package-autoremove' will |
| 1528 | append (package--get-deps p)))) | 1549 | ;; do absolutely nothing. |
| 1529 | (cl-loop for p in (mapcar #'car package-alist) | 1550 | (when (or package-selected-packages |
| 1530 | unless (or (memq p needed) | 1551 | (yes-or-no-p |
| 1531 | (memq p package-selected-packages)) | 1552 | "`package-selected-packages' is empty! Really remove ALL packages? ")) |
| 1532 | collect p into lst | 1553 | (let ((needed (cl-loop for p in package-selected-packages |
| 1533 | finally (if lst | 1554 | if (assq p package-alist) |
| 1534 | (when (y-or-n-p (format "%s packages will be deleted:\n%s, proceed? " | 1555 | ;; `p' and its dependencies are needed. |
| 1535 | (length lst) | 1556 | append (cons p (package--get-deps p))))) |
| 1536 | (mapconcat #'symbol-name lst ", "))) | 1557 | (cl-loop for p in (mapcar #'car package-alist) |
| 1537 | (mapc (lambda (p) | 1558 | unless (memq p needed) |
| 1538 | (package-delete (cadr (assq p package-alist)) t)) | 1559 | collect p into lst |
| 1539 | lst)) | 1560 | finally (if lst |
| 1540 | (message "Nothing to autoremove"))))) | 1561 | (when (y-or-n-p |
| 1562 | (format "%s packages will be deleted:\n%s, proceed? " | ||
| 1563 | (length lst) | ||
| 1564 | (mapconcat #'symbol-name lst ", "))) | ||
| 1565 | (mapc (lambda (p) | ||
| 1566 | (package-delete (cadr (assq p package-alist)) t)) | ||
| 1567 | lst)) | ||
| 1568 | (message "Nothing to autoremove")))))) | ||
| 1541 | 1569 | ||
| 1542 | (defun package-archive-base (desc) | 1570 | (defun package-archive-base (desc) |
| 1543 | "Return the archive containing the package NAME." | 1571 | "Return the archive containing the package NAME." |
| @@ -1663,9 +1691,6 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages." | |||
| 1663 | (unless no-activate | 1691 | (unless no-activate |
| 1664 | (dolist (elt package-alist) | 1692 | (dolist (elt package-alist) |
| 1665 | (package-activate (car elt)))) | 1693 | (package-activate (car elt)))) |
| 1666 | (when (and package-alist (not package-selected-packages)) | ||
| 1667 | (customize-save-variable 'package-selected-packages | ||
| 1668 | (package--find-non-dependencies))) | ||
| 1669 | (setq package--initialized t)) | 1694 | (setq package--initialized t)) |
| 1670 | 1695 | ||
| 1671 | 1696 | ||