GNU bug report logs -
#72414
29.4; use-package :defer keyword does not honor ":defer nil"
Previous Next
Reported by: Derek Upham <derek_upham <at> mailfence.com>
Date: Thu, 1 Aug 2024 23:32:02 UTC
Severity: normal
Found in version 29.4
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#72414: 29.4; use-package :defer keyword does not honor ":defer nil"
which was filed against the emacs package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 72414 <at> debbugs.gnu.org.
--
72414: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=72414
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
> From: John Wiegley <johnw <at> gnu.org>
> Cc: Derek Upham <derek_upham <at> mailfence.com>, 72414 <at> debbugs.gnu.org
> Date: Fri, 02 Aug 2024 15:32:07 -0700
>
> >>>>> Eli Zaretskii <eliz <at> gnu.org> writes:
>
> >> The way the code above uses plist-member doesn't match the
> >> documentation. The test looks for the simple presence of a :defer
> >> key/value, and doesn't distinguish between any of the possible values:
> >> t, nil, or an integer.
> >>
> >> Replacing plist-member with plist-get should fix the problem. A ":defer
> >> nil" would produce the same nil value as a missing :defer.
>
> > Thanks for the report and the analysis.
> >
> > John, any comments or suggestions about this?
>
> This sounds like a very good analysis, and I’m so glad you caught this. Yes,
> it shouldn’t just be a plist membership test; it should lookup the member in
> the plist AND if it’s present and non-nil, then the truth of the condition
> should be established.
>
> So, from:
>
> (when (and (not (plist-member args :load))
> (not (plist-member args :defer))
> (not (plist-member args :no-require)))
> (setq args (append args `(:load (,name)))))
>
> to:
>
> (when (and (not (plist-get args :load))
> (not (plist-get args :defer))
> (not (plist-get args :no-require)))
> (setq args (append args `(:load (,name)))))
Thanks, installed on the emacs-30 release branch, and closing the bug.
[Message part 3 (message/rfc822, inline)]
- The relevant file is "lisp/use-package/use-package-core.el".
- The function is "use-package-normalize-keywords".
- This is as of commit 4c6e9f5b004, current for this file on the
"emacs-30" tag.
Near the bottom of the use-package-normalize-keywords function, we have
the following code block.
;; If at this point no :load, :defer or :no-require has been seen, then
;; :load the package itself.
(when (and (not (plist-member args :load))
(not (plist-member args :defer))
(not (plist-member args :no-require)))
(setq args (append args `(:load (,name)))))
The intent is that we add an immediate-load instruction to the keyword
list, if there is no reason to not add it. We have a couple of possible
reasons to not add it:
1. There's already a :load keyword.
2. We have asked use-package to :defer loading.
3. We have asked use-package to not require the package, to avoid
certain byte-compilation problems.
The Use-Package documentation section 3.2 goes into more detail about
the :defer keyword behavior in (2).
If you customize the user option ‘use-package-always-defer’ to
non-‘nil’, the ‘use-package’ macro will behave as if ‘:defer t’ is
always specified. This can be overridden for individual declarations
using either ‘:defer nil’ or ‘:demand t’ (*note Forcing loading::).
The way the code above uses plist-member doesn't match the
documentation. The test looks for the simple presence of a :defer
key/value, and doesn't distinguish between any of the possible values:
t, nil, or an integer.
Replacing plist-member with plist-get should fix the problem. A ":defer
nil" would produce the same nil value as a missing :defer.
In GNU Emacs 29.4 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.42,
cairo version 1.18.0) of 2024-06-29, modified by Debian built on sbuild
Windowing system distributor 'The X.Org Foundation', version 11.0.12101011
System Description: Debian GNU/Linux trixie/sid
Configured using:
'configure --build x86_64-linux-gnu --prefix=/usr
--sharedstatedir=/var/lib --libexecdir=/usr/libexec
--localstatedir=/var/lib --infodir=/usr/share/info
--mandir=/usr/share/man --with-libsystemd --with-pop=yes
--enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.4/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.4/site-lisp:/usr/share/emacs/site-lisp
--with-sound=alsa --without-gconf --with-mailutils
--with-native-compilation --build x86_64-linux-gnu --prefix=/usr
--sharedstatedir=/var/lib --libexecdir=/usr/libexec
--localstatedir=/var/lib --infodir=/usr/share/info
--mandir=/usr/share/man --with-libsystemd --with-pop=yes
--enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.4/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.4/site-lisp:/usr/share/emacs/site-lisp
--with-sound=alsa --without-gconf --with-mailutils
--with-native-compilation --with-cairo --with-x=yes
--with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
-Werror=implicit-function-declaration
-ffile-prefix-map=/build/reproducible-path/emacs-29.4+1=. -fstack-protector-strong
-fstack-clash-protection -Wformat -Werror=format-security
-fcf-protection -Wall' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2'
LDFLAGS=-Wl,-z,relro'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3
THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2
XPM GTK3 ZLIB
Important settings:
value of $LANG: en_US.UTF-8
value of $XMODIFIERS: @im=ibus
locale-coding-system: utf-8-unix
--
Derek Upham
derek_upham <at> mailfence.com
This bug report was last modified 348 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.