From 1905cb763738396e16849006ffb07b24c9795b4d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 2 Feb 2015 16:20:55 -0800 Subject: [PATCH 01/11] Omit unnecessary var if GTK or NS * frame.c, frame.h (frame_default_tool_bar_height) [USE_GTK||HAVE_NS]: Now a constant zero on these platforms. --- src/ChangeLog | 6 ++++++ src/frame.c | 4 ++++ src/frame.h | 2 ++ 3 files changed, 12 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index d3f667e6374..a1d4c7dbd08 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2015-02-03 Paul Eggert + + Omit unnecessary var if GTK or NS + * frame.c, frame.h (frame_default_tool_bar_height) [USE_GTK||HAVE_NS]: + Now a constant zero on these platforms. + 2015-02-01 Martin Rudalics * xdisp.c (Fwindow_text_pixel_size): Add optional argument BUFFER. diff --git a/src/frame.c b/src/frame.c index e4adfe8f08f..890e8972617 100644 --- a/src/frame.c +++ b/src/frame.c @@ -68,7 +68,11 @@ static struct frame *last_nonminibuf_frame; bool frame_garbaged; /* The default tool bar height for future frames. */ +#if defined USE_GTK || defined HAVE_NS +enum { frame_default_tool_bar_height = 0 }; +#else int frame_default_tool_bar_height; +#endif #ifdef HAVE_WINDOW_SYSTEM static void x_report_frame_params (struct frame *, Lisp_Object *); diff --git a/src/frame.h b/src/frame.h index cb0044cfe23..0c08d12c92e 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1100,7 +1100,9 @@ SET_FRAME_VISIBLE (struct frame *f, int v) extern Lisp_Object selected_frame; +#if ! (defined USE_GTK || defined HAVE_NS) extern int frame_default_tool_bar_height; +#endif extern struct frame *decode_window_system_frame (Lisp_Object); extern struct frame *decode_live_frame (Lisp_Object); From 24fa4ff944c63cda41ea8ad041f9e434603157fc Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 3 Feb 2015 09:24:57 +0100 Subject: [PATCH 02/11] Further work on suppressing shell history in Tramp Fixes: debbugs:19731 * net/tramp-sh.el (tramp-histfile-override): Fix docstring. (tramp-open-shell, tramp-maybe-open-connection): Set also HISTFILESIZE and HISTSIZE when needed. --- lisp/ChangeLog | 6 ++++++ lisp/net/tramp-sh.el | 33 +++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 77361bc3a01..80ee86ac958 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2015-02-03 Michael Albinus + + * net/tramp-sh.el (tramp-histfile-override): Fix docstring. + (tramp-open-shell, tramp-maybe-open-connection): Set also + HISTFILESIZE and HISTSIZE when needed. (Bug#19731) + 2015-02-02 Artur Malabarba * emacs-lisp/package.el (package--find-non-dependencies): New diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 8e519b13e5f..9c8a222285c 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -71,10 +71,11 @@ When setting to a string, it redirects the shell history to that file. Be careful when setting to \"/dev/null\"; this might result in undesired results when using \"bash\" as shell. -The value t, the default value, unsets any setting of HISTFILE. -If you set this variable to nil, however, the *override* is -disabled, so the history will go to the default storage -location, e.g. \"$HOME/.sh_history\"." +The value t, the default value, unsets any setting of HISTFILE, +and sets both HISTFILESIZE and HISTSIZE to 0. If you set this +variable to nil, however, the *override* is disabled, so the +history will go to the default storage location, +e.g. \"$HOME/.sh_history\"." :group 'tramp :version "25.1" :type '(choice (const :tag "Do not override HISTFILE" nil) @@ -3901,15 +3902,16 @@ file exists and nonzero exit status otherwise." ;; when called as sh) on startup; this way, we avoid the startup ;; file clobbering $PS1. $PROMPT_COMMAND is another way to set ;; the prompt in /bin/bash, it must be discarded as well. + ;; $HISTFILE is set according to `tramp-histfile-override'. (tramp-send-command vec (format "exec env ENV='' %s PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s" - (if tramp-histfile-override - (concat - "HISTFILE=" - (if (stringp tramp-histfile-override) - (tramp-shell-quote-argument tramp-histfile-override) "")) - "") + (if (stringp tramp-histfile-override) + (format "HISTFILE=%s" + (tramp-shell-quote-argument tramp-histfile-override)) + (if tramp-histfile-override + "HISTFILE='' HISTFILESIZE=0 HISTSIZE=0" + "")) (tramp-shell-quote-argument tramp-end-of-output) shell (or extra-args "")) t)) @@ -4631,10 +4633,13 @@ connection if a previous connection has died for some reason." (delete-process p)) (setenv "TERM" tramp-terminal-type) (setenv "LC_ALL" "en_US.utf8") - (when tramp-histfile-override - (setenv "HISTFILE" - (and (stringp tramp-histfile-override) - tramp-histfile-override))) + (if (stringp tramp-histfile-override) + (setenv "HISTFILE" tramp-histfile-override) + (if tramp-histfile-override + (progn + (setenv "HISTFILE") + (setenv "HISTFILESIZE" "0") + (setenv "HISTSIZE" "0")))) (setenv "PROMPT_COMMAND") (setenv "PS1" tramp-initial-end-of-output) (let* ((target-alist (tramp-compute-multi-hops vec)) From e17d033781b8cd995cf23899543025e9f9ce1e23 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 11:08:02 +0000 Subject: [PATCH 03/11] NEWS: Document package.el's improved dependency-handling. --- etc/ChangeLog | 4 ++++ etc/NEWS | 22 ++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/etc/ChangeLog b/etc/ChangeLog index 8bc1afbef52..37031890945 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,7 @@ +2015-02-03 Artur Malabarba + + * NEWS: Document package.el's improved dependency-handling. + 2015-01-29 Francesc Rocher * images/splash.svg, images/splash.png: diff --git a/etc/NEWS b/etc/NEWS index 4b0a268d8f2..72e23562868 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -66,10 +66,6 @@ so if you want to use it, you can always take a copy from an older Emacs. * Changes in Emacs 25.1 -** `package-install-from-buffer' and `package-install-file' work on directories. -This follows the same rules as installing from a .tar file, except the --pkg file is optional. - ** New function `custom-prompt-customize-unsaved-options' checks for unsaved customizations and prompts user to customize (if found). @@ -201,6 +197,24 @@ Unicode standards. * Changes in Specialized Modes and Packages in Emacs 25.1 +** package.el +*** `package-install-from-buffer' and `package-install-file' work on directories. +This follows the same rules as installing from a .tar file, except the +-pkg file is optional. + +*** Packages which are dependencies of other packages cannot be deleted. +The FORCE argument to `package-delete' overrides this. + +*** New custom variable `package-selected-packages' tracks packages +which were installed by the user (as opposed to installed as +dependencies). This variable can also be manually customized. + +*** New command `package-install-user-selected-packages' installs all +packages from `package-selected-packages' which are currently missing. + +*** New command `package-autoremove' removes all packages which were +installed strictly as dependencies but are no longer needed. + ** Shell When you invoke `shell' interactively, the *shell* buffer will now From 88acd70e67a1096200fb18b586310a4126ea024a Mon Sep 17 00:00:00 2001 From: Thierry Volpiatto Date: Mon, 2 Feb 2015 21:35:29 +0100 Subject: [PATCH 04/11] emacs-lisp/package.el (package-reinstall): Don't change selected status. --- lisp/ChangeLog | 5 +++++ lisp/emacs-lisp/package.el | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 80ee86ac958..71326266558 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2015-02-03 Thierry Volpiatto + + * emacs-lisp/package.el (package-reinstall): Don't change package's selected status. + (package-delete): New NOSAVE argument. + 2015-02-03 Michael Albinus * net/tramp-sh.el (tramp-histfile-override): Fix docstring. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 16271060626..869b2f03bd9 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1239,7 +1239,8 @@ to `package-selected-packages'." "Reinstall package: " (mapcar #'symbol-name (mapcar #'car package-alist)))))) - (package-delete (cadr (assq pkg package-alist)) t) + (package-delete (cadr (assq pkg package-alist)) 'force + (memq pkg package-selected-packages)) (package-install pkg)) (defun package-strip-rcs-id (str) @@ -1470,7 +1471,7 @@ with PKG-DESC entry removed." (and (memq pkg (mapcar #'car (package-desc-reqs (cadr p)))) (car p)))))) -(defun package-delete (pkg-desc &optional force) +(defun package-delete (pkg-desc &optional force nosave) "Delete package PKG-DESC. Argument PKG-DESC is a full description of package as vector. @@ -1506,7 +1507,8 @@ elsewhere." (unless (cdr pkgs) (setq package-alist (delq pkgs package-alist)))) ;; Update package-selected-packages. - (when (memq name package-selected-packages) + (when (and (memq name package-selected-packages) + (null nosave)) (customize-save-variable 'package-selected-packages (remove name package-selected-packages))) (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) From 0ee15a20bc4f0039a32a095fea956f578ef8f002 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 11:19:56 +0000 Subject: [PATCH 05/11] emacs-lisp/package.el (package-delete): Document NOSAVE. --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/package.el | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 71326266558..d1c0256f024 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2015-02-03 Artur Malabarba + + * emacs-lisp/package.el (package-delete): Document NOSAVE. + 2015-02-03 Thierry Volpiatto * emacs-lisp/package.el (package-reinstall): Don't change package's selected status. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 869b2f03bd9..9a0c9829ddf 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1477,8 +1477,10 @@ with PKG-DESC entry removed." Argument PKG-DESC is a full description of package as vector. When package is used elsewhere as dependency of another package, refuse deleting it and return an error. -If FORCE is non--nil package will be deleted even if it is used -elsewhere." +If FORCE is non-nil package will be deleted even if it is used +elsewhere. +If NOSAVE is non-nil, the package is not removed from +`package-selected-packages'." (let ((dir (package-desc-dir pkg-desc)) (name (package-desc-name pkg-desc)) pkg-used-elsewhere-by) From 2a4a94db1a42c297fc902eba3a2b99afdfc957bc Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 11:36:10 +0000 Subject: [PATCH 06/11] emacs-lisp/package.el (package--get-deps): delete-dups when ONLY is nil. --- lisp/ChangeLog | 1 + lisp/emacs-lisp/package.el | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d1c0256f024..61e05705c41 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,6 +1,7 @@ 2015-02-03 Artur Malabarba * emacs-lisp/package.el (package-delete): Document NOSAVE. + (package--get-deps): delete-dups when ONLY is nil. 2015-02-03 Thierry Volpiatto diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 9a0c9829ddf..ade36d7c7d3 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1436,7 +1436,7 @@ The file can either be a tar file or an Emacs Lisp file." (direct direct-deps) (separate (list direct-deps indirect-deps)) (indirect indirect-deps) - (t (append direct-deps indirect-deps))))) + (t (delete-dups (append direct-deps indirect-deps)))))) ;;;###autoload (defun package-install-user-selected-packages () From 6d767f961fe9f3bff9f59f5902db7925e6da19ef Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 11:38:08 +0000 Subject: [PATCH 07/11] automated/package-test.el (package-test-get-deps): New test. --- test/ChangeLog | 4 +++ test/automated/package-test.el | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/test/ChangeLog b/test/ChangeLog index a9834cc0f3f..56e3ac08e54 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,7 @@ +2015-02-03 Artur Malabarba + + * automated/package-test.el (package-test-get-deps): New test. + 2015-01-31 Stefan Monnier * automated/eieio-tests.el (eieio-test-23-inheritance-check): Simplify. diff --git a/test/automated/package-test.el b/test/automated/package-test.el index a8488652c2f..004e2e89895 100644 --- a/test/automated/package-test.el +++ b/test/automated/package-test.el @@ -73,6 +73,24 @@ :kind 'single) "Expected `package-desc' parsed from new-pkg-1.0.el.") +(defvar simple-depend-desc-1 + (package-desc-create :name 'simple-depend-1 + :version '(1 0) + :summary "A single-file package with a dependency." + :kind 'single + :reqs '((simple-depend (1 0)) + (multi-file (0 1)))) + "`package-desc' used for testing dependencies.") + +(defvar simple-depend-desc-2 + (package-desc-create :name 'simple-depend-2 + :version '(1 0) + :summary "A single-file package with a dependency." + :kind 'single + :reqs '((simple-depend-1 (1 0)) + (multi-file (0 1)))) + "`package-desc' used for testing dependencies.") + (defvar package-test-data-dir (expand-file-name "data/package" package-test-file-dir) "Base directory of package test files.") @@ -479,6 +497,35 @@ Must called from within a `tar-mode' buffer." (should (equal archive-contents (list 1 package-x-test--single-archive-entry-1-4)))))) +(ert-deftest package-test-get-deps () + "Test `package-test-get-deps' with complex structures." + (let ((package-alist + (mapcar (lambda (p) (list (package-desc-name p) p)) + (list simple-single-desc + simple-depend-desc + multi-file-desc + new-pkg-desc + simple-depend-desc-1 + simple-depend-desc-2)))) + (should + (equal (package--get-deps 'simple-depend) + '(simple-single))) + (should + (equal (package--get-deps 'simple-depend 'indirect) + nil)) + (should + (equal (package--get-deps 'simple-depend 'direct) + '(simple-single))) + (should + (equal (package--get-deps 'simple-depend-2) + '(simple-depend-1 multi-file simple-depend simple-single))) + (should + (equal (package--get-deps 'simple-depend-2 'indirect) + '(simple-depend multi-file simple-single))) + (should + (equal (package--get-deps 'simple-depend-2 'direct) + '(simple-depend-1 multi-file))))) + (provide 'package-test) ;;; package-test.el ends here From c184e85ea2adfc5b63f1fe55a6fa2eaaacbda97b Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 13:43:10 +0000 Subject: [PATCH 08/11] 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. --- lisp/ChangeLog | 12 +++++ 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 @@ * emacs-lisp/package.el (package-delete): Document NOSAVE. (package--get-deps): delete-dups when ONLY is nil. + (package-autoremove): Warn the user if `package-selected-packages' + is empty. + + (package--user-selected-p): New function. + (package-delete, package-install, package-install-from-buffer): + Use it + (package-selected-packages): Mention it. + + (package-initialize): Don't populate `package-selected-packages'. + (package-install-user-selected-packages, package-autoremove): + Special handling for empty `package-selected-packages'. + (package-install): Fix when PKG is a package-desc. 2015-02-03 Thierry Volpiatto 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. This variable will be used by `package-autoremove' to decide which packages are no more needed. You can use it to (re)install packages on other machines -by running `package-user-selected-packages-install'." +by running `package-user-selected-packages-install'. + +To check if a package is contained in this list here, use +`package--user-selected-p', as it may populate the variable with +a sane initial value." :group 'package :type '(repeat symbol)) @@ -1189,6 +1193,17 @@ number." nil)) alist))) +(defun package--user-selected-p (pkg) + "Return non-nil if PKG is a package was installed by the user. +PKG is a package name. +This looks into `package-selected-packages', populating it first +if it is still empty." + (unless (consp package-selected-packages) + (customize-save-variable + 'package-selected-packages + (setq package-selected-packages (package--find-non-dependencies)))) + (memq pkg package-selected-packages)) + (defun package-download-transaction (packages) "Download and install all the packages in PACKAGES. PACKAGES should be a list of package-desc. @@ -1222,9 +1237,12 @@ to `package-selected-packages'." package-archive-contents)) nil t)) t))) - (when (and mark-selected (not (memq pkg package-selected-packages))) - (customize-save-variable 'package-selected-packages - (cons pkg package-selected-packages))) + (let ((name (if (package-desc-p pkg) + (package-desc-name pkg) + pkg))) + (when (and mark-selected (not (package--user-selected-p name))) + (customize-save-variable 'package-selected-packages + (cons name package-selected-packages)))) (package-download-transaction (if (package-desc-p pkg) (package-compute-transaction (list pkg) @@ -1239,8 +1257,7 @@ to `package-selected-packages'." "Reinstall package: " (mapcar #'symbol-name (mapcar #'car package-alist)))))) - (package-delete (cadr (assq pkg package-alist)) 'force - (memq pkg package-selected-packages)) + (package-delete (cadr (assq pkg package-alist)) 'force 'nosave) (package-install pkg)) (defun package-strip-rcs-id (str) @@ -1402,10 +1419,9 @@ Downloads and installs required packages as needed." (package-download-transaction transaction)) ;; Install the package itself. (package-unpack pkg-desc) - (unless (memq name package-selected-packages) - (push name package-selected-packages) + (unless (package--user-selected-p name) (customize-save-variable 'package-selected-packages - package-selected-packages)) + (cons name package-selected-packages))) pkg-desc)) ;;;###autoload @@ -1443,17 +1459,22 @@ The file can either be a tar file or an Emacs Lisp file." "Ensure packages in `package-selected-packages' are installed. If some packages are not installed propose to install them." (interactive) - (cl-loop for p in package-selected-packages - unless (package-installed-p p) - collect p into lst - finally - (if lst - (when (y-or-n-p - (format "%s packages will be installed:\n%s, proceed?" - (length lst) - (mapconcat #'symbol-name lst ", "))) - (mapc #'package-install lst)) - (message "All your packages are already installed")))) + ;; We don't need to populate `package-selected-packages' before + ;; using here, because the outcome is the same either way (nothing + ;; gets installed). + (if (not package-selected-packages) + (message "`package-selected-packages' is empty, nothing to install") + (cl-loop for p in package-selected-packages + unless (package-installed-p p) + collect p into lst + finally + (if lst + (when (y-or-n-p + (format "%s packages will be installed:\n%s, proceed?" + (length lst) + (mapconcat #'symbol-name lst ", "))) + (mapc #'package-install lst)) + (message "All your packages are already installed"))))) (defun package--used-elsewhere-p (pkg-desc &optional pkg-list) "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 (unless (cdr pkgs) (setq package-alist (delq pkgs package-alist)))) ;; Update package-selected-packages. - (when (and (memq name package-selected-packages) - (null nosave)) + (when (and (null nosave) + (package--user-selected-p name)) (customize-save-variable 'package-selected-packages (remove name package-selected-packages))) (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) @@ -1523,21 +1544,28 @@ Packages that are no more needed by other packages in `package-selected-packages' and their dependencies will be deleted." (interactive) - (let ((needed (cl-loop for p in package-selected-packages - if (assq p package-alist) - append (package--get-deps p)))) - (cl-loop for p in (mapcar #'car package-alist) - unless (or (memq p needed) - (memq p package-selected-packages)) - collect p into lst - finally (if lst - (when (y-or-n-p (format "%s packages will be deleted:\n%s, proceed? " - (length lst) - (mapconcat #'symbol-name lst ", "))) - (mapc (lambda (p) - (package-delete (cadr (assq p package-alist)) t)) - lst)) - (message "Nothing to autoremove"))))) + ;; If `package-selected-packages' is nil, it would make no sense to + ;; try to populate it here, because then `package-autoremove' will + ;; do absolutely nothing. + (when (or package-selected-packages + (yes-or-no-p + "`package-selected-packages' is empty! Really remove ALL packages? ")) + (let ((needed (cl-loop for p in package-selected-packages + if (assq p package-alist) + ;; `p' and its dependencies are needed. + append (cons p (package--get-deps p))))) + (cl-loop for p in (mapcar #'car package-alist) + unless (memq p needed) + collect p into lst + finally (if lst + (when (y-or-n-p + (format "%s packages will be deleted:\n%s, proceed? " + (length lst) + (mapconcat #'symbol-name lst ", "))) + (mapc (lambda (p) + (package-delete (cadr (assq p package-alist)) t)) + lst)) + (message "Nothing to autoremove")))))) (defun package-archive-base (desc) "Return the archive containing the package NAME." @@ -1663,9 +1691,6 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages." (unless no-activate (dolist (elt package-alist) (package-activate (car elt)))) - (when (and package-alist (not package-selected-packages)) - (customize-save-variable 'package-selected-packages - (package--find-non-dependencies))) (setq package--initialized t)) From 504fada7e7502b9052076c20f16f55d7e9bd3c58 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 13:56:13 +0000 Subject: [PATCH 09/11] emacs-lisp/package.el (package-desc-status): Add "dependency" status to Package Menu. --- lisp/ChangeLog | 6 ++++++ lisp/emacs-lisp/package.el | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d3850310dc5..c834d7cc168 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -15,6 +15,12 @@ Special handling for empty `package-selected-packages'. (package-install): Fix when PKG is a package-desc. + (package-desc-status): Add "dependency" status to the Package + Menu. + (package-menu--status-predicate, package-menu--print-info) + (package-menu-mark-delete, package-menu--find-upgrades) + (package-menu--status-predicate, describe-package-1): Use it + 2015-02-03 Thierry Volpiatto * emacs-lisp/package.el (package-reinstall): Don't change package's selected status. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index bda88b659d1..298604e9892 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1759,7 +1759,7 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages." 'font-lock-face 'font-lock-builtin-face) ".")) (pkg-dir - (insert (propertize (if (equal status "unsigned") + (insert (propertize (if (member status '("unsigned" "dependency")) "Installed" (capitalize status)) ;FIXME: Why comment-face? 'font-lock-face 'font-lock-comment-face)) @@ -2025,7 +2025,8 @@ package PKG-DESC, add one. The alist is keyed with PKG-DESC." (lle (assq name package-load-list)) (held (cadr lle)) (version (package-desc-version pkg-desc)) - (signed (package-desc-signed pkg-desc))) + (signed (or (not package-list-unsigned) + (package-desc-signed pkg-desc)))) (cond ((eq dir 'builtin) "built-in") ((and lle (null held)) "disabled") @@ -2040,7 +2041,9 @@ package PKG-DESC, add one. The alist is keyed with PKG-DESC." (cond ((not (file-exists-p (package-desc-dir pkg-desc))) "deleted") ((eq pkg-desc (cadr (assq name package-alist))) - (if (or (not package-list-unsigned) signed) "installed" "unsigned")) + (if (not signed) "unsigned" + (if (package--user-selected-p name) + "installed" "dependency"))) (t "obsolete"))) (t (let* ((ins (cadr (assq name package-alist))) @@ -2051,8 +2054,9 @@ package PKG-DESC, add one. The alist is keyed with PKG-DESC." "new" "available")) ((version-list-< version ins-v) "obsolete") ((version-list-= version ins-v) - (if (or (not package-list-unsigned) signed) - "installed" "unsigned")))))))) + (if (not signed) "unsigned" + (if (package--user-selected-p name) + "installed" "dependency"))))))))) (defun package-menu--refresh (&optional packages keywords) "Re-populate the `tabulated-list-entries'. @@ -2181,6 +2185,7 @@ Return (PKG-DESC [NAME VERSION STATUS DOC])." (`"held" 'font-lock-constant-face) (`"disabled" 'font-lock-warning-face) (`"installed" 'font-lock-comment-face) + (`"dependency" 'font-lock-comment-face) (`"unsigned" 'font-lock-warning-face) (_ 'font-lock-warning-face)))) ; obsolete. (list pkg-desc @@ -2223,7 +2228,8 @@ If optional arg BUTTON is non-nil, describe its associated package." (defun package-menu-mark-delete (&optional _num) "Mark a package for deletion and move to the next line." (interactive "p") - (if (member (package-menu-get-status) '("installed" "obsolete" "unsigned")) + (if (member (package-menu-get-status) + '("installed" "dependency" "obsolete" "unsigned")) (tabulated-list-put-tag "D" t) (forward-line))) @@ -2277,7 +2283,7 @@ If optional arg BUTTON is non-nil, describe its associated package." ;; ENTRY is (PKG-DESC [NAME VERSION STATUS DOC]) (let ((pkg-desc (car entry)) (status (aref (cadr entry) 2))) - (cond ((member status '("installed" "unsigned")) + (cond ((member status '("installed" "dependency" "unsigned")) (push pkg-desc installed)) ((member status '("available" "new")) (setq available (package--append-to-alist pkg-desc available)))))) @@ -2393,6 +2399,8 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm." ((string= sB "available") nil) ((string= sA "installed") t) ((string= sB "installed") nil) + ((string= sA "dependency") t) + ((string= sB "dependency") nil) ((string= sA "unsigned") t) ((string= sB "unsigned") nil) ((string= sA "held") t) From 2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 17:51:39 -0200 Subject: [PATCH 10/11] emacs-lisp/package.el (package-menu-execute): Offer to remove packages. --- lisp/ChangeLog | 4 +++ lisp/emacs-lisp/package.el | 53 ++++++++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c834d7cc168..38d41b27ef4 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -21,6 +21,10 @@ (package-menu-mark-delete, package-menu--find-upgrades) (package-menu--status-predicate, describe-package-1): Use it + (package--removable-packages): New function. + (package-autoremove): Use it. + (package-menu-execute): Offer to remove unneeded packages. + 2015-02-03 Thierry Volpiatto * emacs-lisp/package.el (package-reinstall): Don't change package's selected status. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 298604e9892..d013fd4a329 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1536,6 +1536,18 @@ If NOSAVE is non-nil, the package is not removed from 'package-selected-packages (remove name package-selected-packages))) (message "Package `%s' deleted." (package-desc-full-name pkg-desc)))))) +(defun package--removable-packages () + "Return a list of names of packages no longer needed. +These are packages which are neither contained in +`package-selected-packages' nor a dependency of one that is." + (let ((needed (cl-loop for p in package-selected-packages + if (assq p package-alist) + ;; `p' and its dependencies are needed. + append (cons p (package--get-deps p))))) + (cl-loop for p in (mapcar #'car package-alist) + unless (memq p needed) + collect p))) + ;;;###autoload (defun package-autoremove () "Remove packages that are no more needed. @@ -1550,22 +1562,16 @@ will be deleted." (when (or package-selected-packages (yes-or-no-p "`package-selected-packages' is empty! Really remove ALL packages? ")) - (let ((needed (cl-loop for p in package-selected-packages - if (assq p package-alist) - ;; `p' and its dependencies are needed. - append (cons p (package--get-deps p))))) - (cl-loop for p in (mapcar #'car package-alist) - unless (memq p needed) - collect p into lst - finally (if lst - (when (y-or-n-p - (format "%s packages will be deleted:\n%s, proceed? " - (length lst) - (mapconcat #'symbol-name lst ", "))) - (mapc (lambda (p) - (package-delete (cadr (assq p package-alist)) t)) - lst)) - (message "Nothing to autoremove")))))) + (let ((removable (package--removable-packages))) + (if removable + (when (y-or-n-p + (format "%s packages will be deleted:\n%s, proceed? " + (length removable) + (mapconcat #'symbol-name removable ", "))) + (mapc (lambda (p) + (package-delete (cadr (assq p package-alist)) t)) + removable) + (message "Nothing to autoremove")))))) (defun package-archive-base (desc) "Return the archive containing the package NAME." @@ -2377,9 +2383,18 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm." (package-delete elt) (error (message (cadr err))))) (error "Aborted"))) - (if (or delete-list install-list) - (package-menu--generate t t) - (message "No operations specified.")))) + (if (not (or delete-list install-list)) + (message "No operations specified.") + (when package-selected-packages + (let ((removable (package--removable-packages))) + (when (and removable + (y-or-n-p + (format "These %d packages are no longer needed, delete them (%s)? " + (length removable) + (mapconcat #'symbol-name removable ", ")))) + (mapc (lambda (p) (package-delete (cadr (assq p package-alist)))) + removable)))) + (package-menu--generate t t)))) (defun package-menu--version-predicate (A B) (let ((vA (or (aref (cadr A) 1) '(0))) From 200a47d45cf8550e5995dd23025acaf3edf81b4a Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Tue, 3 Feb 2015 18:14:28 -0200 Subject: [PATCH 11/11] emacs-lisp/package.el (package--read-pkg-desc): Fix tar-desc reference. --- lisp/ChangeLog | 3 +++ lisp/emacs-lisp/package.el | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 38d41b27ef4..c18a8ff0f52 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -25,6 +25,9 @@ (package-autoremove): Use it. (package-menu-execute): Offer to remove unneeded packages. + (package--read-pkg-desc, package-tar-file-info): Fix reference to + tar-desc. + 2015-02-03 Thierry Volpiatto * emacs-lisp/package.el (package-reinstall): Don't change package's selected status. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index d013fd4a329..fa620eb6bb6 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1345,7 +1345,9 @@ The return result is a `package-desc'." (error "No package descriptor file found")) (with-current-buffer (tar--extract tar-desc) (unwind-protect - (package--read-pkg-desc 'tar) + (or (package--read-pkg-desc 'tar) + (error "Can't find define-package in %s" + (tar-header-name tar-desc))) (kill-buffer (current-buffer)))))) (defun package-dir-info () @@ -1378,13 +1380,12 @@ Return the pkg-desc, with desc-kind set to KIND." (unwind-protect (let* ((pkg-def-parsed (read (current-buffer))) (pkg-desc - (if (not (eq (car pkg-def-parsed) 'define-package)) - (error "Can't find define-package in %s" - (tar-header-name tar-desc)) + (when (eq (car pkg-def-parsed) 'define-package) (apply #'package-desc-from-define (append (cdr pkg-def-parsed)))))) - (setf (package-desc-kind pkg-desc) kind) - pkg-desc))) + (when pkg-desc + (setf (package-desc-kind pkg-desc) kind) + pkg-desc)))) ;;;###autoload