Subject: Re: bug#76568: 'package-install' should not install duplicate packages

From: Stefan Kangas <[email-masked]>
Date: Tue, 4 Mar 2025 02:34:54 +0000

Ship Mints <[email-masked]> writes:

> 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.

Please submit a patch, but could we also have tests for this please?

Thanks in advance.

>
> (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