As part of my production upgrade to 30.1, and before I wrote a program to install my local ELPA tree from scratch, I tried to first curate my packages and change from MELPA to generally equivalent GNU ELPA or non-GNU ELPA archives. The result was that I had two of each package installed. I think there's a bug in 'package-install' which, when invoked from 'package-install-button-action', processes the new package spec, and incorrectly checks to see if the package is already installed. Interactive invocation of 'package-install' yields the package name from the prompt, not its archive description. If the below is correct, I can submit a patch to make 'package-install' behave like 'package-reinstall' for the non-interactive case. (defun package-install (pkg &optional dont-select) ... (if-let* ((transaction (if (package-desc-p pkg) ;; Problem seems to be here. If the new pkg desc is for a ;; different archive directory name style, package-installed-p ;; fails as it checks to see if the new directory exists (which ;; does not), ignoring the old archive directory. (unless (package-installed-p pkg) (package-compute-transaction (list pkg) (package-desc-reqs pkg))) In contrast, 'package-reinstall' does the right thing by first deleting the existing package before installing the new one. (defun package-reinstall (pkg) ... (package-delete (if (package-desc-p pkg) pkg (cadr (assq pkg package-alist))) 'force 'nosave) (package-install pkg 'dont-select)) -Stephane