GNU bug report logs - #72141
29.4; package-upgrade vs package-load-list

Previous Next

Package: emacs;

Reported by: Thierry Volpiatto <thievol <at> posteo.net>

Date: Tue, 16 Jul 2024 14:44:02 UTC

Severity: normal

Found in version 29.4

To reply to this bug, email your comments to 72141 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Tue, 16 Jul 2024 14:44:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Thierry Volpiatto <thievol <at> posteo.net>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 16 Jul 2024 14:44:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: bug-gnu-emacs <at> gnu.org
Subject: 29.4; package-upgrade vs package-load-list
Date: Tue, 16 Jul 2024 14:46:37 +0000
I think there is a bug here, but please verify with following recipe as
I don't use widely package installation, at least for myself.  When reading
the code I believe it is reproductible as well on emacs-30+.

1) Install package foo and bar.
2) Disable them in package-load-list ((foo nil) (bar nil) all).
3) Wait some time until foo and/or bar have new versions available.
4) Call package-upgrade-all.  It will call package-upgrade on foo
and bar (and possibly others).  When package-upgrade find foo
package it will (1) delete it and (2) call package-install which
will refuse to install (error) because foo is disabled.

As a result we have lost foo package, it is now uninstalled.
Same problem with M-x package-upgrade, foo and bar are listed in
completion and made available whereas they are going to fail to
upgrade.



In GNU Emacs 29.4 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo
 version 1.16.0, Xaw3d scroll bars) of 2024-06-23 built on IPad-S340
Windowing system distributor 'The X.Org Foundation', version 11.0.12101004
System Description: Linux Mint 21.3

Configured using:
 'configure CFLAGS=-O8 --bindir=/usr/local/sbin/emacs-29.3 --with-cairo
 --with-x-toolkit=lucid --with-modules --without-tree-sitter
 --without-native-compilation'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NOTIFY
INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS
X11 XAW3D XDBE XIM XINPUT2 XPM LUCID ZLIB

Important settings:
  value of $LANG: fr_FR.UTF-8
  locale-coding-system: utf-8-unix

Major mode: 

Minor modes in effect:
  emms-mode-line-mode: t
  emms-playing-time-display-mode: t
  emms-playing-time-mode: t
  server-mode: t
  psession-mode: t
  psession-savehist-mode: t
  register-preview-mode: t
  global-git-gutter-mode: t
  display-time-mode: t
  winner-mode: t
  tv-save-place-mode: t
  helm-epa-mode: t
  helm-descbinds-mode: t
  helm-top-poll-mode: t
  helm-adaptive-mode: t
  helm-mode: t
  helm-minibuffer-history-mode: t
  helm-ff-icon-mode: t
  shell-dirtrack-mode: t
  helm-popup-tip-mode: t
  async-bytecomp-package-mode: t
  dired-async-mode: t
  minibuffer-depth-indicate-mode: t
  gcmh-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Features:
(shadow epa-mail face-remap helm-ring emacsbug ediff ediff-merg
ediff-mult ediff-wind ediff-diff ediff-help ediff-init ediff-util
gnus-cite smiley w3m-form w3m-symbol qp config-w3m w3m timezone w3m-hist
bookmark-w3m w3m-ems w3m-favicon w3m-image w3m-fb tab-line w3m-proc
w3m-util mail-extr textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check addressbook-bookmark tv-mu4e-config
gnus-and-mu4e mu4e-patch mu4e-contrib eshell esh-cmd esh-ext esh-opt
esh-proc esh-io esh-arg esh-module esh-groups esh-util mu4e mu4e-org
mu4e-notification notifications mu4e-main smtpmail mu4e-view
mu4e-mime-parts mu4e-headers mu4e-thread mu4e-actions mu4e-compose
mu4e-draft gnus-msg mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark
mu4e-message flow-fill hl-line mu4e-contacts mu4e-update mu4e-folders
mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars
mu4e-helpers mu4e-config mu4e-window ido mu4e-obsolete svg-lib color
epa-file dired-x image-file image-converter char-fold tramp-adb tramp-sh
ffap cl-indent cl-print helm-command helm-elisp helm-eval edebug debug
backtrace mm-archive network-stream url-cache url-http url-auth url-gw
nsm helm-packages async-package finder lisp-mnt tramp-archive tramp-gvfs
tramp-cache time-stamp zeroconf helm-x-files helm-for-files
helm-bookmark helm-info bookmark emms-config emms-idapi-browser
emms-idapi emms-idapi-musicbrainz emms-mpris emms-librefm-stream
emms-librefm-scrobbler emms-playlist-limit emms-i18n emms-history
emms-score emms-stream-info emms-metaplaylist-mode emms-bookmarks
emms-cue emms-mode-line-icon emms-browser sort emms-volume
emms-volume-sndioctl emms-volume-mixerctl emms-volume-pulse
emms-volume-amixer emms-playlist-sort emms-last-played emms-player-xine
emms-player-mpd tq emms-lyrics emms-url emms-streams emms-show-all
emms-tag-editor emms-tag-tracktag emms-mark emms-mode-line emms-cache
emms-info-native emms-info-native-spc emms-info-native-mp3
emms-info-native-ogg emms-info-native-opus emms-info-native-flac
emms-info-native-vorbis bindat emms-info-exiftool emms-info-tinytag
emms-info-metaflac emms-info-opusinfo emms-info-ogginfo
emms-info-mp3info emms-playlist-mode emms-player-vlc emms-player-mpv
emms-playing-time emms-info emms-later-do emms-player-mplayer
emms-player-simple emms-source-playlist emms-source-file locate
emms-setup emms emms-compat emms-auto helm-external helm-net helm-ls-git
vc-git diff-mode vc vc-dispatcher conf-mode flymake-shellcheck cus-start
flymake-proc flymake project warnings sh-script smie treesit executable
org-element org-persist org-id org-refile avl-tree generator oc-basic
cl-extra ol-eww eww url-queue thingatpt mm-url ol-rmail ol-mhe ol-irc
ol-info ol-gnus nnselect gnus-art mm-uu mml2015 mm-view mml-smime smime
gnutls dig gnus-sum shr pixel-fill kinsoku url-file svg dom gnus-group
gnus-undo gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail
mail-source utf7 nnoo gnus-spec gnus-int gnus-range message sendmail
yank-media puny rfc822 mml mml-sec mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils
mailheader gnus-win gnus nnheader gnus-util mail-utils range mm-util
mail-prsvr ol-docview doc-view jka-compr ol-bibtex bibtex ol-bbdb ol-w3m
ol-doi org-link-doi org-config ob-gnuplot org-crypt org-protocol org ob
ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src ob-comint
org-pcomplete org-list org-footnote org-faces org-entities noutline
outline ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold
org-fold-core org-keys oc org-loaddefs find-func org-version org-compat
org-macs make-mode bug-reference naquadah-theme view solar cal-dst
holidays holiday-loaddefs appt diary-lib diary-loaddefs cal-menu
calendar cal-loaddefs server imenu psession frameset w3m-load
register-preview git-gutter mule-util dired-extension time winner
describe-variable help-fns radix-tree help-mode tv-utils
tv-save-place.el advice init-helm epa derived epg rfc6068 epg-config
helm-epa helm-descbinds cus-edit pp icons wid-edit helm-sys
helm-adaptive helm-mode helm-misc helm-files image-dired
image-dired-tags image-dired-external image-dired-util xdg image-mode
exif filenotify tramp tramp-loaddefs trampver tramp-integration files-x
tramp-compat rx shell pcomplete parse-time iso8601 time-date
helm-buffers all-the-icons all-the-icons-faces data-material
data-weathericons data-octicons data-fileicons data-faicons
data-alltheicons helm-occur helm-tags helm-locate helm-grep wgrep-helm
wgrep grep compile text-property-search comint ansi-osc ring helm-regexp
format-spec ansi-color helm-utils helm-help helm-types
helm-extensions-autoloads helm-autoloads helm helm-global-bindings
helm-easymenu edmacro kmacro helm-core async-bytecomp helm-source
helm-multi-match helm-lib dired-async async dired-aux dired
dired-loaddefs isl-autoloads mb-depth avoid cus-load gcmh easy-mmode
corfu-autoloads filechooser-autoloads ledger-mode-autoloads
magit-autoloads pcase git-commit-autoloads magit-section-autoloads
dash-autoloads markdown-mode-autoloads transient-autoloads finder-inf
with-editor-autoloads info compat-autoloads package browse-url url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x
map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs cl-lib rmc
iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify lcms2 dynamic-setting system-font-setting
font-render-setting cairo x-toolkit xinput2 x multi-tty
make-network-process emacs)

Memory information:
((conses 16 1126986 282642)
 (symbols 48 47791 7)
 (strings 32 329278 39126)
 (string-bytes 1 9084964)
 (vectors 16 119581)
 (vector-slots 8 2518384 196657)
 (floats 8 4123 3733)
 (intervals 56 15474 3437)
 (buffers 976 165))
<#secure method=pgpmime mode=sign>

-- 
Thierry




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sat, 27 Jul 2024 07:16:01 GMT) Full text and rfc822 format available.

Message #8 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Thierry Volpiatto <thievol <at> posteo.net>,
 Philip Kaludercic <philipk <at> posteo.net>
Cc: 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sat, 27 Jul 2024 10:14:59 +0300
> From: Thierry Volpiatto <thievol <at> posteo.net>
> Date: Tue, 16 Jul 2024 14:46:37 +0000
> 
> 
> I think there is a bug here, but please verify with following recipe as
> I don't use widely package installation, at least for myself.  When reading
> the code I believe it is reproductible as well on emacs-30+.
> 
> 1) Install package foo and bar.
> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
> 3) Wait some time until foo and/or bar have new versions available.
> 4) Call package-upgrade-all.  It will call package-upgrade on foo
> and bar (and possibly others).  When package-upgrade find foo
> package it will (1) delete it and (2) call package-install which
> will refuse to install (error) because foo is disabled.
> 
> As a result we have lost foo package, it is now uninstalled.
> Same problem with M-x package-upgrade, foo and bar are listed in
> completion and made available whereas they are going to fail to
> upgrade.

Philip, any comments or suggestions?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 28 Jul 2024 11:49:02 GMT) Full text and rfc822 format available.

Message #11 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Philip Kaludercic <philipk <at> posteo.net>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: Thierry Volpiatto <thievol <at> posteo.net>, 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 28 Jul 2024 11:47:44 +0000
[Message part 1 (text/plain, inline)]
Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: Thierry Volpiatto <thievol <at> posteo.net>
>> Date: Tue, 16 Jul 2024 14:46:37 +0000
>> 
>> 
>> I think there is a bug here, but please verify with following recipe as
>> I don't use widely package installation, at least for myself.  When reading
>> the code I believe it is reproductible as well on emacs-30+.
>> 
>> 1) Install package foo and bar.
>> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>> 3) Wait some time until foo and/or bar have new versions available.
>> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>> and bar (and possibly others).  When package-upgrade find foo
>> package it will (1) delete it and (2) call package-install which
>> will refuse to install (error) because foo is disabled.
>> 
>> As a result we have lost foo package, it is now uninstalled.
>> Same problem with M-x package-upgrade, foo and bar are listed in
>> completion and made available whereas they are going to fail to
>> upgrade.
>
> Philip, any comments or suggestions?

The issue is that we don't install a package if it is disabled.  So
either we allow installing (but don't activate) disabled packages, or we
ignore disabled packages during upgrades.  That might just need this
change:

[Message part 2 (text/plain, inline)]
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 7cae8d68bc0..eb77d99fad2 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2286,6 +2286,9 @@ package--upgradeable-packages
       (or (let ((available
                  (assq (car elt) package-archive-contents)))
             (and available
+                 (package-disabled-p
+                  (cadr elt)
+                  (package-desc-version (cadr elt)))
                  (or (and
                       include-builtins
                       (not (package-desc-version (cadr elt))))
[Message part 3 (text/plain, inline)]
-- 
	Philip Kaludercic on peregrine

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 28 Jul 2024 12:25:02 GMT) Full text and rfc822 format available.

Message #14 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: Thierry Volpiatto <thievol <at> posteo.net>, Eli Zaretskii <eliz <at> gnu.org>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 28 Jul 2024 12:27:10 +0000
[Message part 1 (text/plain, inline)]
Philip Kaludercic <philipk <at> posteo.net> writes:

> Eli Zaretskii <eliz <at> gnu.org> writes:
>
>>> From: Thierry Volpiatto <thievol <at> posteo.net>
>>> Date: Tue, 16 Jul 2024 14:46:37 +0000
>>> 
>>> 
>>> I think there is a bug here, but please verify with following recipe as
>>> I don't use widely package installation, at least for myself.  When reading
>>> the code I believe it is reproductible as well on emacs-30+.
>>> 
>>> 1) Install package foo and bar.
>>> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>>> 3) Wait some time until foo and/or bar have new versions available.
>>> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>>> and bar (and possibly others).  When package-upgrade find foo
>>> package it will (1) delete it and (2) call package-install which
>>> will refuse to install (error) because foo is disabled.
>>> 
>>> As a result we have lost foo package, it is now uninstalled.
>>> Same problem with M-x package-upgrade, foo and bar are listed in
>>> completion and made available whereas they are going to fail to
>>> upgrade.
>>
>> Philip, any comments or suggestions?
>
> The issue is that we don't install a package if it is disabled.  So
> either we allow installing (but don't activate) disabled packages, or we
> ignore disabled packages during upgrades.  That might just need this
> change:
>
> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
> index 7cae8d68bc0..eb77d99fad2 100644
> --- a/lisp/emacs-lisp/package.el
> +++ b/lisp/emacs-lisp/package.el
> @@ -2286,6 +2286,9 @@ package--upgradeable-packages
>        (or (let ((available
>                   (assq (car elt) package-archive-contents)))
>              (and available
> +                 (package-disabled-p
> +                  (cadr elt)
> +                  (package-desc-version (cadr elt)))
>                   (or (and
>                        include-builtins
>                        (not (package-desc-version (cadr elt))))

If nothing in package.el or elsewhere relay on the fact that
package--upgradeable-packages returns the disabled packages
that looks good.
Also why in this function you are using (mapcar 'car (seq-filter ...))?
Perhaps one loop could be avoided here? (just asking, I am not familiar
with seq, I don't use it).

Thanks.

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 28 Jul 2024 12:31:01 GMT) Full text and rfc822 format available.

Message #17 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: thievol <at> posteo.net, 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 28 Jul 2024 15:27:31 +0300
> From: Philip Kaludercic <philipk <at> posteo.net>
> Cc: Thierry Volpiatto <thievol <at> posteo.net>,  72141 <at> debbugs.gnu.org
> Date: Sun, 28 Jul 2024 11:47:44 +0000
> 
> Eli Zaretskii <eliz <at> gnu.org> writes:
> 
> >> From: Thierry Volpiatto <thievol <at> posteo.net>
> >> Date: Tue, 16 Jul 2024 14:46:37 +0000
> >> 
> >> 
> >> I think there is a bug here, but please verify with following recipe as
> >> I don't use widely package installation, at least for myself.  When reading
> >> the code I believe it is reproductible as well on emacs-30+.
> >> 
> >> 1) Install package foo and bar.
> >> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
> >> 3) Wait some time until foo and/or bar have new versions available.
> >> 4) Call package-upgrade-all.  It will call package-upgrade on foo
> >> and bar (and possibly others).  When package-upgrade find foo
> >> package it will (1) delete it and (2) call package-install which
> >> will refuse to install (error) because foo is disabled.
> >> 
> >> As a result we have lost foo package, it is now uninstalled.
> >> Same problem with M-x package-upgrade, foo and bar are listed in
> >> completion and made available whereas they are going to fail to
> >> upgrade.
> >
> > Philip, any comments or suggestions?
> 
> The issue is that we don't install a package if it is disabled.  So
> either we allow installing (but don't activate) disabled packages, or we
> ignore disabled packages during upgrades.

The latter, I'd say.  It makes little sense to upgrade disabled
packages.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 28 Jul 2024 12:37:01 GMT) Full text and rfc822 format available.

Message #20 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: thievol <at> posteo.net, Philip Kaludercic <philipk <at> posteo.net>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 28 Jul 2024 12:39:51 +0000
[Message part 1 (text/plain, inline)]
Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: Philip Kaludercic <philipk <at> posteo.net>
>> Cc: Thierry Volpiatto <thievol <at> posteo.net>,  72141 <at> debbugs.gnu.org
>> Date: Sun, 28 Jul 2024 11:47:44 +0000
>> 
>> Eli Zaretskii <eliz <at> gnu.org> writes:
>> 
>> >> From: Thierry Volpiatto <thievol <at> posteo.net>
>> >> Date: Tue, 16 Jul 2024 14:46:37 +0000
>> >> 
>> >> 
>> >> I think there is a bug here, but please verify with following recipe as
>> >> I don't use widely package installation, at least for myself.  When reading
>> >> the code I believe it is reproductible as well on emacs-30+.
>> >> 
>> >> 1) Install package foo and bar.
>> >> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>> >> 3) Wait some time until foo and/or bar have new versions available.
>> >> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>> >> and bar (and possibly others).  When package-upgrade find foo
>> >> package it will (1) delete it and (2) call package-install which
>> >> will refuse to install (error) because foo is disabled.
>> >> 
>> >> As a result we have lost foo package, it is now uninstalled.
>> >> Same problem with M-x package-upgrade, foo and bar are listed in
>> >> completion and made available whereas they are going to fail to
>> >> upgrade.
>> >
>> > Philip, any comments or suggestions?
>> 
>> The issue is that we don't install a package if it is disabled.  So
>> either we allow installing (but don't activate) disabled packages, or we
>> ignore disabled packages during upgrades.
>
> The latter, I'd say.  It makes little sense to upgrade disabled
> packages.

When I posted initially this bugreport I wrote this (fully not tested):

    (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
      ;; Initialize the package system to get the list of package
      ;; symbols for completion.
      (package--archives-initialize)
      (let ((pkgs (if include-builtins
                      (append package-alist
                              (mapcan
                               (lambda (elt)
                                 (when (not (assq (car elt) package-alist))
                                   (list (list (car elt) (package--from-builtin elt)))))
                               package--builtins))
                    package-alist))) 
        (cl-loop for (sym desc) in pkgs
                 for available = (assq sym package-archive-contents)
                 when (or (and available
                               (or (and
                                    include-builtins
                                    (not (package-desc-version desc)))
                                   (version-list-<
                                    (package-desc-version desc)
                                    (package-desc-version (cadr available)))
                                   (and filter-load-list
                                        (pcase (assq p package-load-list)
                                          (`(,sym ,val) (or (not (eq val nil))
                                                            (not (stringp val))))))))
                          (package-vc-p desc))
                 collect sym)))

Perhaps package-disabled-p can be used instead of the pcase (I didn't
know its existence).

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Thu, 01 Aug 2024 06:46:01 GMT) Full text and rfc822 format available.

Message #23 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Thierry Volpiatto <thievol <at> posteo.net>
Cc: Eli Zaretskii <eliz <at> gnu.org>, Philip Kaludercic <philipk <at> posteo.net>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Thu, 01 Aug 2024 06:48:13 +0000
[Message part 1 (text/plain, inline)]
Thierry Volpiatto <thievol <at> posteo.net> writes:

> Eli Zaretskii <eliz <at> gnu.org> writes:
>
>>> From: Philip Kaludercic <philipk <at> posteo.net>
>>> Cc: Thierry Volpiatto <thievol <at> posteo.net>,  72141 <at> debbugs.gnu.org
>>> Date: Sun, 28 Jul 2024 11:47:44 +0000
>>> 
>>> Eli Zaretskii <eliz <at> gnu.org> writes:
>>> 
>>> >> From: Thierry Volpiatto <thievol <at> posteo.net>
>>> >> Date: Tue, 16 Jul 2024 14:46:37 +0000
>>> >> 
>>> >> 
>>> >> I think there is a bug here, but please verify with following recipe as
>>> >> I don't use widely package installation, at least for myself.  When reading
>>> >> the code I believe it is reproductible as well on emacs-30+.
>>> >> 
>>> >> 1) Install package foo and bar.
>>> >> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>>> >> 3) Wait some time until foo and/or bar have new versions available.
>>> >> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>>> >> and bar (and possibly others).  When package-upgrade find foo
>>> >> package it will (1) delete it and (2) call package-install which
>>> >> will refuse to install (error) because foo is disabled.
>>> >> 
>>> >> As a result we have lost foo package, it is now uninstalled.
>>> >> Same problem with M-x package-upgrade, foo and bar are listed in
>>> >> completion and made available whereas they are going to fail to
>>> >> upgrade.
>>> >
>>> > Philip, any comments or suggestions?
>>> 
>>> The issue is that we don't install a package if it is disabled.  So
>>> either we allow installing (but don't activate) disabled packages, or we
>>> ignore disabled packages during upgrades.
>>
>> The latter, I'd say.  It makes little sense to upgrade disabled
>> packages.
>
> When I posted initially this bugreport I wrote this (fully not tested):
>
>     (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
>       ;; Initialize the package system to get the list of package
>       ;; symbols for completion.
>       (package--archives-initialize)
>       (let ((pkgs (if include-builtins
>                       (append package-alist
>                               (mapcan
>                                (lambda (elt)
>                                  (when (not (assq (car elt) package-alist))
>                                    (list (list (car elt) (package--from-builtin elt)))))
>                                package--builtins))
>                     package-alist))) 
>         (cl-loop for (sym desc) in pkgs
>                  for available = (assq sym package-archive-contents)
>                  when (or (and available
>                                (or (and
>                                     include-builtins
>                                     (not (package-desc-version desc)))
>                                    (version-list-<
>                                     (package-desc-version desc)
>                                     (package-desc-version (cadr available)))
>                                    (and filter-load-list
>                                         (pcase (assq p package-load-list)
>                                           (`(,sym ,val) (or (not (eq val nil))
>                                                             (not (stringp val))))))))
>                           (package-vc-p desc))
>                  collect sym)))
>
> Perhaps package-disabled-p can be used instead of the pcase (I didn't
> know its existence).

Here a version fixing typo and using package-disabled-p (same, still
fully untested)
Note the extra optional arg filter-load-list that allow preserving the initial behavior
if needed (better name?).

(defun package--upgradeable-packages (&optional include-builtins filter-load-list)
  ;; Initialize the package system to get the list of package
  ;; symbols for completion.
  (package--archives-initialize)
  (let ((pkgs (if include-builtins
                  (append package-alist
                          (mapcan
                           (lambda (elt)
                             (when (not (assq (car elt) package-alist))
                               (list (list (car elt) (package--from-builtin elt)))))
                           package--builtins))
                package-alist))) 
    (cl-loop for (sym desc) in pkgs
             for available = (assq sym package-archive-contents)
             for cversion = (and available (package-desc-version desc))
             when (or (and available
                           (or (and
                                include-builtins
                                (not (package-desc-version desc)))
                               (version-list-<
                                cversion
                                (package-desc-version (cadr available)))
                               (and filter-load-list
                                    (package-disabled-p sym cversion))))
                      (package-vc-p desc))
             collect sym)))

Also there is IMO another inconsistency in package-upgrade where the
completion is done inconditionally on packages+builtins and later
package-install-upgrade-built-in is let bounded to prevent
package-install to upgrade built-in in case user chose a built-in!

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sat, 03 Aug 2024 03:20:01 GMT) Full text and rfc822 format available.

Message #26 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Thierry Volpiatto <thievol <at> posteo.net>
Cc: Eli Zaretskii <eliz <at> gnu.org>, Philip Kaludercic <philipk <at> posteo.net>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sat, 03 Aug 2024 03:22:37 +0000
[Message part 1 (text/plain, inline)]
Thierry Volpiatto <thievol <at> posteo.net> writes:

> Thierry Volpiatto <thievol <at> posteo.net> writes:
>
>> Eli Zaretskii <eliz <at> gnu.org> writes:
>>
>>>> From: Philip Kaludercic <philipk <at> posteo.net>
>>>> Cc: Thierry Volpiatto <thievol <at> posteo.net>,  72141 <at> debbugs.gnu.org
>>>> Date: Sun, 28 Jul 2024 11:47:44 +0000
>>>> 
>>>> Eli Zaretskii <eliz <at> gnu.org> writes:
>>>> 
>>>> >> From: Thierry Volpiatto <thievol <at> posteo.net>
>>>> >> Date: Tue, 16 Jul 2024 14:46:37 +0000
>>>> >> 
>>>> >> 
>>>> >> I think there is a bug here, but please verify with following recipe as
>>>> >> I don't use widely package installation, at least for myself.  When reading
>>>> >> the code I believe it is reproductible as well on emacs-30+.
>>>> >> 
>>>> >> 1) Install package foo and bar.
>>>> >> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>>>> >> 3) Wait some time until foo and/or bar have new versions available.
>>>> >> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>>>> >> and bar (and possibly others).  When package-upgrade find foo
>>>> >> package it will (1) delete it and (2) call package-install which
>>>> >> will refuse to install (error) because foo is disabled.
>>>> >> 
>>>> >> As a result we have lost foo package, it is now uninstalled.
>>>> >> Same problem with M-x package-upgrade, foo and bar are listed in
>>>> >> completion and made available whereas they are going to fail to
>>>> >> upgrade.
>>>> >
>>>> > Philip, any comments or suggestions?
>>>> 
>>>> The issue is that we don't install a package if it is disabled.  So
>>>> either we allow installing (but don't activate) disabled packages, or we
>>>> ignore disabled packages during upgrades.
>>>
>>> The latter, I'd say.  It makes little sense to upgrade disabled
>>> packages.
>>
>> When I posted initially this bugreport I wrote this (fully not tested):
>>
>>     (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
>>       ;; Initialize the package system to get the list of package
>>       ;; symbols for completion.
>>       (package--archives-initialize)
>>       (let ((pkgs (if include-builtins
>>                       (append package-alist
>>                               (mapcan
>>                                (lambda (elt)
>>                                  (when (not (assq (car elt) package-alist))
>>                                    (list (list (car elt) (package--from-builtin elt)))))
>>                                package--builtins))
>>                     package-alist))) 
>>         (cl-loop for (sym desc) in pkgs
>>                  for available = (assq sym package-archive-contents)
>>                  when (or (and available
>>                                (or (and
>>                                     include-builtins
>>                                     (not (package-desc-version desc)))
>>                                    (version-list-<
>>                                     (package-desc-version desc)
>>                                     (package-desc-version (cadr available)))
>>                                    (and filter-load-list
>>                                         (pcase (assq p package-load-list)
>>                                           (`(,sym ,val) (or (not (eq val nil))
>>                                                             (not (stringp val))))))))
>>                           (package-vc-p desc))
>>                  collect sym)))
>>
>> Perhaps package-disabled-p can be used instead of the pcase (I didn't
>> know its existence).
>
> Here a version fixing typo and using package-disabled-p (same, still
> fully untested)
> Note the extra optional arg filter-load-list that allow preserving the initial behavior
> if needed (better name?).
>
> (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
>   ;; Initialize the package system to get the list of package
>   ;; symbols for completion.
>   (package--archives-initialize)
>   (let ((pkgs (if include-builtins
>                   (append package-alist
>                           (mapcan
>                            (lambda (elt)
>                              (when (not (assq (car elt) package-alist))
>                                (list (list (car elt) (package--from-builtin elt)))))
>                            package--builtins))
>                 package-alist))) 
>     (cl-loop for (sym desc) in pkgs
>              for available = (assq sym package-archive-contents)
>              for cversion = (and available (package-desc-version desc))
>              when (or (and available
>                            (or (and
>                                 include-builtins
>                                 (not (package-desc-version desc)))
>                                (version-list-<
>                                 cversion
>                                 (package-desc-version (cadr available)))
>                                (and filter-load-list
>                                     (package-disabled-p sym cversion))))
>                       (package-vc-p desc))
>              collect sym)))
>
> Also there is IMO another inconsistency in package-upgrade where the
> completion is done inconditionally on packages+builtins and later
> package-install-upgrade-built-in is let bounded to prevent
> package-install to upgrade built-in in case user chose a built-in!

I finally rewrited a `package--upgradeable-packages` for helm and could test
it (versions I sent previously haven't been tested and are wrong), it is
working fine.  I can send a patch if you want let me know.

Thanks.

https://github.com/emacs-helm/helm/blob/master/helm-packages.el#L266

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 04 Aug 2024 14:58:02 GMT) Full text and rfc822 format available.

Message #29 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Philip Kaludercic <philipk <at> posteo.net>
To: Thierry Volpiatto <thievol <at> posteo.net>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 04 Aug 2024 14:57:23 +0000
Thierry Volpiatto <thievol <at> posteo.net> writes:

> Thierry Volpiatto <thievol <at> posteo.net> writes:
>
>> Thierry Volpiatto <thievol <at> posteo.net> writes:
>>
>>> Eli Zaretskii <eliz <at> gnu.org> writes:
>>>
>>>>> From: Philip Kaludercic <philipk <at> posteo.net>
>>>>> Cc: Thierry Volpiatto <thievol <at> posteo.net>,  72141 <at> debbugs.gnu.org
>>>>> Date: Sun, 28 Jul 2024 11:47:44 +0000
>>>>> 
>>>>> Eli Zaretskii <eliz <at> gnu.org> writes:
>>>>> 
>>>>> >> From: Thierry Volpiatto <thievol <at> posteo.net>
>>>>> >> Date: Tue, 16 Jul 2024 14:46:37 +0000
>>>>> >> 
>>>>> >> 
>>>>> >> I think there is a bug here, but please verify with following recipe as
>>>>> >> I don't use widely package installation, at least for myself.
>>>>> >> When reading
>>>>> >> the code I believe it is reproductible as well on emacs-30+.
>>>>> >> 
>>>>> >> 1) Install package foo and bar.
>>>>> >> 2) Disable them in package-load-list ((foo nil) (bar nil) all).
>>>>> >> 3) Wait some time until foo and/or bar have new versions available.
>>>>> >> 4) Call package-upgrade-all.  It will call package-upgrade on foo
>>>>> >> and bar (and possibly others).  When package-upgrade find foo
>>>>> >> package it will (1) delete it and (2) call package-install which
>>>>> >> will refuse to install (error) because foo is disabled.
>>>>> >> 
>>>>> >> As a result we have lost foo package, it is now uninstalled.
>>>>> >> Same problem with M-x package-upgrade, foo and bar are listed in
>>>>> >> completion and made available whereas they are going to fail to
>>>>> >> upgrade.
>>>>> >
>>>>> > Philip, any comments or suggestions?
>>>>> 
>>>>> The issue is that we don't install a package if it is disabled.  So
>>>>> either we allow installing (but don't activate) disabled packages, or we
>>>>> ignore disabled packages during upgrades.
>>>>
>>>> The latter, I'd say.  It makes little sense to upgrade disabled
>>>> packages.
>>>
>>> When I posted initially this bugreport I wrote this (fully not tested):
>>>
>>>     (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
>>>       ;; Initialize the package system to get the list of package
>>>       ;; symbols for completion.
>>>       (package--archives-initialize)
>>>       (let ((pkgs (if include-builtins
>>>                       (append package-alist
>>>                               (mapcan
>>>                                (lambda (elt)
>>>                                  (when (not (assq (car elt) package-alist))
>>>                                    (list (list (car elt) (package--from-builtin elt)))))
>>>                                package--builtins))
>>>                     package-alist))) 
>>>         (cl-loop for (sym desc) in pkgs
>>>                  for available = (assq sym package-archive-contents)
>>>                  when (or (and available
>>>                                (or (and
>>>                                     include-builtins
>>>                                     (not (package-desc-version desc)))
>>>                                    (version-list-<
>>>                                     (package-desc-version desc)
>>>                                     (package-desc-version (cadr available)))
>>>                                    (and filter-load-list
>>>                                         (pcase (assq p package-load-list)
>>>                                           (`(,sym ,val) (or (not (eq val nil))
>>>                                                             (not (stringp val))))))))
>>>                           (package-vc-p desc))
>>>                  collect sym)))
>>>
>>> Perhaps package-disabled-p can be used instead of the pcase (I didn't
>>> know its existence).
>>
>> Here a version fixing typo and using package-disabled-p (same, still
>> fully untested)
>> Note the extra optional arg filter-load-list that allow preserving the initial behavior
>> if needed (better name?).
>>
>> (defun package--upgradeable-packages (&optional include-builtins filter-load-list)
>>   ;; Initialize the package system to get the list of package
>>   ;; symbols for completion.
>>   (package--archives-initialize)
>>   (let ((pkgs (if include-builtins
>>                   (append package-alist
>>                           (mapcan
>>                            (lambda (elt)
>>                              (when (not (assq (car elt) package-alist))
>>                                (list (list (car elt) (package--from-builtin elt)))))
>>                            package--builtins))
>>                 package-alist))) 
>>     (cl-loop for (sym desc) in pkgs
>>              for available = (assq sym package-archive-contents)
>>              for cversion = (and available (package-desc-version desc))
>>              when (or (and available
>>                            (or (and
>>                                 include-builtins
>>                                 (not (package-desc-version desc)))
>>                                (version-list-<
>>                                 cversion
>>                                 (package-desc-version (cadr available)))
>>                                (and filter-load-list
>>                                     (package-disabled-p sym cversion))))
>>                       (package-vc-p desc))
>>              collect sym)))
>>
>> Also there is IMO another inconsistency in package-upgrade where the
>> completion is done inconditionally on packages+builtins and later
>> package-install-upgrade-built-in is let bounded to prevent
>> package-install to upgrade built-in in case user chose a built-in!
>
> I finally rewrited a `package--upgradeable-packages` for helm and could test
> it (versions I sent previously haven't been tested and are wrong), it is
> working fine.  I can send a patch if you want let me know.

Gladly, then I'd like to try it out it and perhaps write a ERT test.

> Thanks.
>
> https://github.com/emacs-helm/helm/blob/master/helm-packages.el#L266

-- 
	Philip Kaludercic on peregrine




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sun, 04 Aug 2024 17:13:02 GMT) Full text and rfc822 format available.

Message #32 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: Thierry Volpiatto <thievol <at> posteo.net>, Eli Zaretskii <eliz <at> gnu.org>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sun, 04 Aug 2024 17:15:04 +0000
[Message part 1 (text/plain, inline)]
Hello Philip,

Philip Kaludercic <philipk <at> posteo.net> writes:

> Gladly, then I'd like to try it out it and perhaps write a ERT test.

Patch attached, please review and test it before merging ;-)

Thanks.

-- 
Thierry
[0001-Fix-bug-72141-package-upgrade-should-not-include-dis.patch (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Sat, 10 Aug 2024 17:14:01 GMT) Full text and rfc822 format available.

Message #35 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Thierry Volpiatto <thievol <at> posteo.net>
Cc: Philip Kaludercic <philipk <at> posteo.net>, Eli Zaretskii <eliz <at> gnu.org>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Sat, 10 Aug 2024 17:16:54 +0000
[Message part 1 (text/plain, inline)]
Thierry Volpiatto <thievol <at> posteo.net> writes:

> Hello Philip,
>
> Philip Kaludercic <philipk <at> posteo.net> writes:
>
>> Gladly, then I'd like to try it out it and perhaps write a ERT test.
>
> Patch attached, please review and test it before merging ;-)
>
> Thanks.

Also, I recently had to read package.el code and I found many loops are
too complex and/or too difficult to read, here are some:

--8<---------------cut here---------------start------------->8---
(equal
 ;; old
 (mapcar #'symbol-name (mapcar #'car package-alist))
 ;; new
 (mapcar (lambda (pkg) (symbol-name (car pkg))) package-alist))

(equal
 ;; old
 (mapcar
  (lambda (p) (cons (package-desc-full-name p) p))
  (delq nil
        (mapcar (lambda (p) (unless (package-built-in-p p) p))
                (apply #'append (mapcar #'cdr (package--alist))))))
 ;; new
 (cl-loop for (p desc) in package-alist
          unless (package-built-in-p p)
          collect (cons (package-desc-full-name desc) desc)))

;; Change w3m to an installed package in your Emacs.
(let ((alist (package-desc-extras (cadr (assq 'w3m package-alist)))))
  (equal
   ;; old
   (mapcar #'macroexp-quote
           (apply #'nconc
                  (mapcar (lambda (pair) (list (car pair) (cdr pair))) alist)))
   ;; new
   (cl-loop for lst in alist
            nconc `(,(car lst) ,(macroexp-quote (cdr lst))))))

(equal
 ;; old
 (mapcar #'file-truename
         (cl-remove-if-not #'stringp
                           (mapcar #'car load-history)))
 ;; new
 (cl-loop for (name _rest) in load-history
          when (stringp name)
          collect (file-truename name)))
--8<---------------cut here---------------end--------------->8---

I have a patch for this, let me know if interested, or perhaps I should
open a new bug report ?

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Mon, 12 Aug 2024 16:38:02 GMT) Full text and rfc822 format available.

Message #38 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Philip Kaludercic <philipk <at> posteo.net>
To: Thierry Volpiatto <thievol <at> posteo.net>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Mon, 12 Aug 2024 16:36:43 +0000
Thierry Volpiatto <thievol <at> posteo.net> writes:

> Hello Philip,
>
> Philip Kaludercic <philipk <at> posteo.net> writes:
>
>> Gladly, then I'd like to try it out it and perhaps write a ERT test.
>
> Patch attached, please review and test it before merging ;-)

Sorry for the delay.

> Thanks.
>
> -- 
> Thierry
>
> From 292e251a383c1fb53cc377cd32f71705e6742f85 Mon Sep 17 00:00:00 2001
> From: Thierry Volpiatto <thievol <at> posteo.net>
> Date: Sat, 3 Aug 2024 06:07:28 +0200
> Subject: [PATCH] Fix bug#72141, package-upgrade should not include disabled
>  packages
>
> * lisp/emacs-lisp/package.el (package--upgradeable-packages):
> Rewrite with a new optional arg to filter out disabled packages from
> output.
> (package-upgrade, package-upgrade-all): Use it and filter out built-in
> packages from completion according package-install-upgrade-built-in
> value.
> ---
>  lisp/emacs-lisp/package.el | 60 ++++++++++++++++++++++----------------
>  1 file changed, 35 insertions(+), 25 deletions(-)
>
> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
> index 7cae8d68bc0..83996c9d6de 100644
> --- a/lisp/emacs-lisp/package.el
> +++ b/lisp/emacs-lisp/package.el
> @@ -2259,11 +2259,15 @@ had been enabled."
>    "Upgrade package NAME if a newer version exists."
>    (interactive
>     (list (completing-read
> -          "Upgrade package: " (package--upgradeable-packages t) nil t)))
> +          "Upgrade package: " (package--upgradeable-packages
> +                               package-install-upgrade-built-in
> +                               'ignore-disabled)
> +          nil t)))
>    (let* ((package (if (symbolp name)
>                        name
>                      (intern name)))
>           (pkg-desc (cadr (assq package package-alist)))
> +         ;; Keep this binding for non-interactive use.
>           (package-install-upgrade-built-in (not pkg-desc)))
>      ;; `pkg-desc' will be nil when the package is an "active built-in".
>      (if (and pkg-desc (package-vc-p pkg-desc))
> @@ -2275,32 +2279,37 @@ had been enabled."
>                         ;; before.  Mark it as installed explicitly.
>                         (and pkg-desc 'dont-select)))))
>  
> -(defun package--upgradeable-packages (&optional include-builtins)
> +(defun package--upgradeable-packages (&optional
> +                                        include-builtins ignore-disabled)
>    ;; Initialize the package system to get the list of package
>    ;; symbols for completion.
>    (package--archives-initialize)
> -  (mapcar
> -   #'car
> -   (seq-filter
> -    (lambda (elt)
> -      (or (let ((available
> -                 (assq (car elt) package-archive-contents)))
> -            (and available
> -                 (or (and
> -                      include-builtins
> -                      (not (package-desc-version (cadr elt))))
> -                     (version-list-<
> -                      (package-desc-version (cadr elt))
> -                      (package-desc-version (cadr available))))))
> -          (package-vc-p (cadr elt))))
> -    (if include-builtins
> -        (append package-alist
> -                (mapcan
> -                 (lambda (elt)
> -                   (when (not (assq (car elt) package-alist))
> -                     (list (list (car elt) (package--from-builtin elt)))))
> -                 package--builtins))
> -      package-alist))))
> +  (let ((pkgs (if include-builtins
> +                  (append package-alist
> +                          (append package-alist
> +                                  (mapcan
> +                                   (lambda (elt)
> +                                     (when (not (assq (car elt) package-alist))
> +                                       (list
> +                                        (list
> +                                         (car elt)
> +                                         (package--from-builtin elt)))))
> +                                   package--builtins)))
> +                package-alist)))
> +    (cl-loop for (sym desc) in pkgs
> +             for available =
> +             (if-let ((av (assq sym package-archive-contents)))
> +                 (if ignore-disabled
> +                     (and (not (package-disabled-p sym cversion)) av) av))
                                                          ^
This loop really confused me.  Specifically               here
If I am not mistaken, cversion might be set by the last iteration, no?
In that case, we are passing some version string unrelated to sym?

I am leaning towards keeping the existing loop, i.e. not rewriting
anything while fixing a bug.  It is probably easier for me to do that.
Do you have any comments on tricks or traps that I should keep in mind?

> +             for cversion = (and available (package-desc-version desc))
> +             when (or (and available
> +                           (or (and include-builtins (not cversion))
> +                               (and cversion
> +                                    (version-list-<
> +                                     cversion
> +                                     (package-desc-version (cadr available))))))
> +                      (package-vc-p desc))
> +             collect sym)))
>  
>  ;;;###autoload
>  (defun package-upgrade-all (&optional query)
> @@ -2315,7 +2324,8 @@ from ELPA by either using `\\[package-upgrade]' or
>  `\\<package-menu-mode-map>\\[package-menu-mark-install]' after `\\[list-packages]'."
>    (interactive (list (not noninteractive)))
>    (package-refresh-contents)
> -  (let ((upgradeable (package--upgradeable-packages)))
> +  (let ((upgradeable (package--upgradeable-packages
> +                      package-install-upgrade-built-in 'ignore-disabled)))
>      (if (not upgradeable)
>          (message "No packages to upgrade")
>        (when (and query

Thierry Volpiatto <thievol <at> posteo.net> writes:

> Thierry Volpiatto <thievol <at> posteo.net> writes:
>
>> Hello Philip,
>>
>> Philip Kaludercic <philipk <at> posteo.net> writes:
>>
>>> Gladly, then I'd like to try it out it and perhaps write a ERT test.
>>
>> Patch attached, please review and test it before merging ;-)
>>
>> Thanks.
>
> Also, I recently had to read package.el code and I found many loops are
> too complex and/or too difficult to read, here are some:
>

[...]

>
> I have a patch for this, let me know if interested, or perhaps I should
> open a new bug report ?

I have some spare time now, and if I also find some spare energy, I plan
to clean up a number of things in package.el, mainly removing duplicate
logic and making the code more flexible.  I'll start work on a separate
branch, and that's why I am not too enthusiastic about these kinds of
changes on master (for now).

-- 
	Philip Kaludercic on peregrine




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Mon, 12 Aug 2024 17:34:02 GMT) Full text and rfc822 format available.

Message #41 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: Thierry Volpiatto <thievol <at> posteo.net>, Eli Zaretskii <eliz <at> gnu.org>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Mon, 12 Aug 2024 17:36:21 +0000
[Message part 1 (text/plain, inline)]
Philip Kaludercic <philipk <at> posteo.net> writes:

> Thierry Volpiatto <thievol <at> posteo.net> writes:
>
>> Hello Philip,
>>
>> Philip Kaludercic <philipk <at> posteo.net> writes:
>>
>>> Gladly, then I'd like to try it out it and perhaps write a ERT test.
>>
>> Patch attached, please review and test it before merging ;-)
>
> Sorry for the delay.
>
>> Thanks.
>>
>> -- 
>> Thierry
>>
>> From 292e251a383c1fb53cc377cd32f71705e6742f85 Mon Sep 17 00:00:00 2001
>> From: Thierry Volpiatto <thievol <at> posteo.net>
>> Date: Sat, 3 Aug 2024 06:07:28 +0200
>> Subject: [PATCH] Fix bug#72141, package-upgrade should not include disabled
>>  packages
>>
>> * lisp/emacs-lisp/package.el (package--upgradeable-packages):
>> Rewrite with a new optional arg to filter out disabled packages from
>> output.
>> (package-upgrade, package-upgrade-all): Use it and filter out built-in
>> packages from completion according package-install-upgrade-built-in
>> value.
>> ---
>>  lisp/emacs-lisp/package.el | 60 ++++++++++++++++++++++----------------
>>  1 file changed, 35 insertions(+), 25 deletions(-)
>>
>> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
>> index 7cae8d68bc0..83996c9d6de 100644
>> --- a/lisp/emacs-lisp/package.el
>> +++ b/lisp/emacs-lisp/package.el
>> @@ -2259,11 +2259,15 @@ had been enabled."
>>    "Upgrade package NAME if a newer version exists."
>>    (interactive
>>     (list (completing-read
>> -          "Upgrade package: " (package--upgradeable-packages t) nil t)))
>> +          "Upgrade package: " (package--upgradeable-packages
>> +                               package-install-upgrade-built-in
>> +                               'ignore-disabled)
>> +          nil t)))
>>    (let* ((package (if (symbolp name)
>>                        name
>>                      (intern name)))
>>           (pkg-desc (cadr (assq package package-alist)))
>> +         ;; Keep this binding for non-interactive use.
>>           (package-install-upgrade-built-in (not pkg-desc)))
>>      ;; `pkg-desc' will be nil when the package is an "active built-in".
>>      (if (and pkg-desc (package-vc-p pkg-desc))
>> @@ -2275,32 +2279,37 @@ had been enabled."
>>                         ;; before.  Mark it as installed explicitly.
>>                         (and pkg-desc 'dont-select)))))
>>  
>> -(defun package--upgradeable-packages (&optional include-builtins)
>> +(defun package--upgradeable-packages (&optional
>> +                                        include-builtins ignore-disabled)
>>    ;; Initialize the package system to get the list of package
>>    ;; symbols for completion.
>>    (package--archives-initialize)
>> -  (mapcar
>> -   #'car
>> -   (seq-filter
>> -    (lambda (elt)
>> -      (or (let ((available
>> -                 (assq (car elt) package-archive-contents)))
>> -            (and available
>> -                 (or (and
>> -                      include-builtins
>> -                      (not (package-desc-version (cadr elt))))
>> -                     (version-list-<
>> -                      (package-desc-version (cadr elt))
>> -                      (package-desc-version (cadr available))))))
>> -          (package-vc-p (cadr elt))))
>> -    (if include-builtins
>> -        (append package-alist
>> -                (mapcan
>> -                 (lambda (elt)
>> -                   (when (not (assq (car elt) package-alist))
>> -                     (list (list (car elt) (package--from-builtin elt)))))
>> -                 package--builtins))
>> -      package-alist))))
>> +  (let ((pkgs (if include-builtins
>> +                  (append package-alist
>> +                          (append package-alist
>> +                                  (mapcan
>> +                                   (lambda (elt)
>> +                                     (when (not (assq (car elt) package-alist))
>> +                                       (list
>> +                                        (list
>> +                                         (car elt)
>> +                                         (package--from-builtin elt)))))
>> +                                   package--builtins)))
>> +                package-alist)))
>> +    (cl-loop for (sym desc) in pkgs
>> +             for available =
>> +             (if-let ((av (assq sym package-archive-contents)))
>> +                 (if ignore-disabled
>> +                     (and (not (package-disabled-p sym cversion)) av) av))
>                                                           ^
> This loop really confused me.  Specifically               here
> If I am not mistaken, cversion might be set by the last iteration, no?
> In that case, we are passing some version string unrelated to sym?

Yes, indeed, this is an error, thanks to catch it.

> I am leaning towards keeping the existing loop, i.e. not rewriting
> anything while fixing a bug.  It is probably easier for me to do that.

No problem, it is probably better to not introduce a new bug for now.

> Do you have any comments on tricks or traps that I should keep in
> mind?

Yes the other changes are about built-in packages that are shown in
completion, and refused later by package-install.

>>  (defun package-upgrade-all (&optional query)
>> @@ -2315,7 +2324,8 @@ from ELPA by either using `\\[package-upgrade]' or
>>  `\\<package-menu-mode-map>\\[package-menu-mark-install]' after `\\[list-packages]'."
>>    (interactive (list (not noninteractive)))
>>    (package-refresh-contents)
>> -  (let ((upgradeable (package--upgradeable-packages)))
>> +  (let ((upgradeable (package--upgradeable-packages
>> +                      package-install-upgrade-built-in

Here.

>> I have a patch for this, let me know if interested, or perhaps I should
>> open a new bug report ?
>
> I have some spare time now, and if I also find some spare energy, I plan
> to clean up a number of things in package.el, mainly removing duplicate
> logic and making the code more flexible.  I'll start work on a separate
> branch, and that's why I am not too enthusiastic about these kinds of
> changes on master (for now).

Great, no problem, as long as it is cleaned up that's good ;-)

Thanks.

-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72141; Package emacs. (Mon, 12 Aug 2024 18:14:02 GMT) Full text and rfc822 format available.

Message #44 received at 72141 <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thievol <at> posteo.net>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: Thierry Volpiatto <thievol <at> posteo.net>, Eli Zaretskii <eliz <at> gnu.org>,
 72141 <at> debbugs.gnu.org
Subject: Re: bug#72141: 29.4; package-upgrade vs package-load-list
Date: Mon, 12 Aug 2024 18:16:29 +0000
[Message part 1 (text/plain, inline)]
Philip Kaludercic <philipk <at> posteo.net> writes:

> This loop really confused me.  Specifically               here
> If I am not mistaken, cversion might be set by the last iteration, no?
> In that case, we are passing some version string unrelated to sym?

For the record:


[...]

    (cl-loop for (sym desc) in pkgs
             for pkg = (assq sym package-archive-contents)
             for cversion = (and pkg (package-desc-version desc))
             for available = (when pkg
                               (if ignore-disabled
                                   (and (not (package-disabled-p
                                              sym cversion))
                                        pkg)
                                 pkg))

[...]



-- 
Thierry
[signature.asc (application/pgp-signature, inline)]

This bug report was last modified 66 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.