diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 3a019905960..ed7d666ebf4 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2533,42 +2533,44 @@ package-delete ;; upgraded package. (package--newest-p pkg-desc)) (package--save-selected-packages (remove name package-selected-packages))) - (cond ((not (string-prefix-p (file-name-as-directory - (expand-file-name package-user-dir)) - (expand-file-name dir))) - ;; Don't delete "system" packages. - (error "Package `%s' is a system package, not deleting" - (package-desc-full-name pkg-desc))) - ((and (null force) - (setq pkg-used-elsewhere-by - (package--used-elsewhere-p pkg-desc))) - ;; Don't delete packages used as dependency elsewhere. - (error "Package `%s' is used by `%s' as dependency, not deleting" - (package-desc-full-name pkg-desc) - (package-desc-name pkg-used-elsewhere-by))) - (t - (add-hook 'post-command-hook #'package-menu--post-refresh) - (package--delete-directory dir) - ;; Remove NAME-VERSION.signed and NAME-readme.txt files. - ;; - ;; NAME-readme.txt files are no longer created, but they - ;; may be left around from an earlier install. - (dolist (suffix '(".signed" "readme.txt")) - (let* ((version (package-version-join (package-desc-version pkg-desc))) - (file (concat (if (string= suffix ".signed") - dir - (substring dir 0 (- (length version)))) - suffix))) - (when (file-exists-p file) - (delete-file file)))) - ;; Update package-alist. + (let ((package-alist ;see bug#65475 (let ((pkgs (assq name package-alist))) - (delete pkg-desc pkgs) - (unless (cdr pkgs) - (setq package-alist (delq pkgs package-alist)))) - (package--quickstart-maybe-refresh) - (message "Package `%s' deleted." - (package-desc-full-name pkg-desc)))))) + (if (null (remove pkg-desc (cdr pkgs))) + (remq pkgs package-alist) + package-alist)))) + (cond ((not (string-prefix-p (file-name-as-directory + (expand-file-name package-user-dir)) + (expand-file-name dir))) + ;; Don't delete "system" packages. + (error "Package `%s' is a system package, not deleting" + (package-desc-full-name pkg-desc))) + ((and (null force) + (setq pkg-used-elsewhere-by + (package--used-elsewhere-p pkg-desc))) + ;; Don't delete packages used as dependency elsewhere. + (error "Package `%s' is used by `%s' as dependency, not deleting" + (package-desc-full-name pkg-desc) + (package-desc-name pkg-used-elsewhere-by))) + (t + (add-hook 'post-command-hook #'package-menu--post-refresh) + (package--delete-directory dir) + ;; Remove NAME-VERSION.signed and NAME-readme.txt files. + ;; + ;; NAME-readme.txt files are no longer created, but they + ;; may be left around from an earlier install. + (dolist (suffix '(".signed" "readme.txt")) + (let* ((version (package-version-join (package-desc-version pkg-desc))) + (file (concat (if (string= suffix ".signed") + dir + (substring dir 0 (- (length version)))) + suffix))) + (when (file-exists-p file) + (delete-file file)))) + ;; Update package-alist. + (set-default-toplevel-value 'package-alist package-alist) + (package--quickstart-maybe-refresh) + (message "Package `%s' deleted." + (package-desc-full-name pkg-desc))))))) ;;;###autoload (defun package-reinstall (pkg)