aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorArtur Malabarba2015-02-03 13:43:10 +0000
committerArtur Malabarba2015-02-03 13:54:41 +0000
commitc184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b (patch)
treef62bbf32a9a6717aa1676b991d7680e36d0154e8 /lisp
parent6d767f961fe9f3bff9f59f5902db7925e6da19ef (diff)
downloademacs-c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b.tar.gz
emacs-c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b.zip
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.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog12
-rw-r--r--lisp/emacs-lisp/package.el105
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
62015-02-03 Thierry Volpiatto <thierry.volpiatto@gmail.com> 182015-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.
340This variable will be used by `package-autoremove' to decide 340This variable will be used by `package-autoremove' to decide
341which packages are no more needed. 341which packages are no more needed.
342You can use it to (re)install packages on other machines 342You can use it to (re)install packages on other machines
343by running `package-user-selected-packages-install'." 343by running `package-user-selected-packages-install'.
344
345To check if a package is contained in this list here, use
346`package--user-selected-p', as it may populate the variable with
347a 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.
1198PKG is a package name.
1199This looks into `package-selected-packages', populating it first
1200if 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.
1194PACKAGES should be a list of package-desc. 1209PACKAGES 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.
1444If some packages are not installed propose to install them." 1460If 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
1524will be deleted." 1545will 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