Package: emacs;
Reported by: Christopher Howard <christopher <at> librehacker.com>
Date: Sun, 22 Jun 2025 04:26:03 UTC
Severity: normal
Found in version 30.1.90
Done: Christopher Howard <christopher <at> librehacker.com>
To reply to this bug, email your comments to 78860 AT debbugs.gnu.org.
There is no need to reopen the bug first.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Sun, 22 Jun 2025 04:26:03 GMT) Full text and rfc822 format available.Christopher Howard <christopher <at> librehacker.com>
:bug-gnu-emacs <at> gnu.org
.
(Sun, 22 Jun 2025 04:26:03 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Christopher Howard <christopher <at> librehacker.com> To: bug-gnu-emacs <at> gnu.org Subject: 30.1.90; eshell: wrong-number-of-arguments Date: Sat, 21 Jun 2025 20:24:38 -0800
When I run the command "git status" in eshell, I am getting the error "wrong-number-of-arguments". M-x package-isolate <ENTER> <ENTER> M-x eshell <ENTER> git status <ENTER> [or] *git status <ENTER> With debug-on-error, here is the backtrace: ``` Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2) eshell-stringify("status" nil) #f(compiled-function (i) #<bytecode 0x12a893834464da57>)("status") mapcar(#f(compiled-function (i) #<bytecode 0x12a893834464da57>) ("status")) eshell-connection-local-command("/home/christopher/.guix-home/profile/bin/git" ("status")) eshell-external-command("/home/christopher/.guix-home/profile/bin/git" ("status")) eshell-explicit-command("*git" ("status")) run-hook-with-args-until-success(eshell-explicit-command "*git" ("status")) eshell-named-command("*git" ("status")) eval((eshell-named-command '"*git" '("status"))) eshell-do-eval((eshell-named-command '"*git" '("status")) nil) eshell-do-eval((unwind-protect (eshell-named-command '"*git" '("status")) (mapc #'funcall eshell-this-command-hook)) nil) #f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)() funcall(#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)) (let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>))) eval((let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)))) eshell-do-eval((let ((eshell-this-command-hook '(ignore))) (unwind-protect (eshell-named-command '"*git" '("status")) (mapc #'funcall eshell-this-command-hook))) nil) (condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '(ignore))) (unwind-protect (eshell-named-command '"*git" '("status")) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (eshell-named-command '"*git" '...) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))) eshell-do-eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (eshell-named-command '"*git" '...) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) nil) eshell-do-eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (eshell-named-command '"*git" '...) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) nil) #f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)() funcall(#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)) (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)])) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>))) eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)))) eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (condition-case err (eshell-do-eval '(let ((eshell-this-command-hook ...)) (unwind-protect (eshell-named-command ... ...) (mapc ... eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))) nil) eshell-do-eval((progn (let ((eshell-current-handles '[nil (... t) (... t)])) (condition-case err (eshell-do-eval '(let (...) (unwind-protect ... ...)) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))) nil) eshell-do-eval((unwind-protect (progn (let ((eshell-current-handles '[nil ... ...])) (condition-case err (eshell-do-eval '(let ... ...) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))) (run-hooks 'eshell-post-command-hook)) nil) eshell-do-eval((progn 'nil (unwind-protect (progn (let ((eshell-current-handles '...)) (condition-case err (eshell-do-eval '... nil) ((debug error) (eshell-errorn ...) (eshell-close-handles 1))))) (run-hooks 'eshell-post-command-hook))) nil) #f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)() funcall(#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)) (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>))) eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode -0x165b8d1d61fa8b16>)))) eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let ((eshell-current-handles ...)) (condition-case err (eshell-do-eval ... nil) (... ... ...)))) (run-hooks 'eshell-post-command-hook))))) eshell-resume-eval((nil (let ((eshell-current-handles '[nil (... t) (... t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let (...) (condition-case err ... ...))) (run-hooks 'eshell-post-command-hook)))) nil)) eshell-eval-command((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let ((eshell-current-handles ...)) (condition-case err (eshell-do-eval ... nil) (... ... ...)))) (run-hooks 'eshell-post-command-hook)))) "*git status") eshell-send-input(nil) funcall-interactively(eshell-send-input nil) call-interactively(eshell-send-input nil nil) command-execute(eshell-send-input) ``` In GNU Emacs 30.1.90 (build 5, x86_64-pc-linux-gnu, GTK+ Version 3.24.43, cairo version 1.18.4) of 2025-06-16 built on nightshade Repository revision: a2bfce5d2a7d046a45c25364f3c69b3d8a776081 Repository branch: emacs-30 Windowing system distributor 'The X.Org Foundation', version 11.0.12101015 System Description: Guix System Configured using: 'configure --prefix=/home/christopher/local' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG LCMS2 LIBOTF LIBSELINUX LIBXML2 M17N_FLT MODULES 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 $EMACSLOADPATH: /home/christopher/local/share/emacs/30.1.90/lisp value of $LANG: en_US.utf8 locale-coding-system: utf-8-unix Major mode: Eshell Minor modes in effect: eshell-prompt-mode: t eshell-pred-mode: t eshell-hist-mode: t eshell-cmpl-mode: t eshell-proc-mode: t eshell-arg-mode: t repeat-mode: t rcirc-track-minor-mode: t server-mode: t minibuffer-depth-indicate-mode: t global-display-line-numbers-mode: t display-line-numbers-mode: t tooltip-mode: t global-eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t minibuffer-regexp-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 Load-path shadows: None found. Features: (shadow sort flyspell ispell face-remap mail-extr emacsbug message yank-media puny rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils help-fns radix-tree cl-print debug backtrace find-func em-xtra em-unix em-tramp em-term term disp-table ehelp em-smart em-script em-prompt em-pred em-ls em-hist em-glob em-extpipe em-elecslash thingatpt tramp trampver tramp-integration tramp-message tramp-compat xdg shell format-spec tramp-loaddefs em-cmpl em-dirs em-basic em-banner em-alias esh-mode esh-var eshell esh-cmd generator esh-ext esh-opt esh-proc esh-io esh-arg pcomplete esh-module esh-module-loaddefs esh-util pcase ange-ftp comint ansi-osc ansi-color files-x rx jka-compr misearch multi-isearch vc-git diff-mode track-changes easy-mmode vc-dispatcher bookmark text-property-search pp repeat rcirc parse-time iso8601 time-date ring dired-x dired dired-loaddefs cl-extra help-mode use-package-core server kmacro mb-depth display-line-numbers cus-load green-phosphor-theme finder-inf 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 icons 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 touch-screen 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 gtk x-toolkit xinput2 x multi-tty move-toolbar make-network-process emacs) Memory information: ((conses 16 179702 28595) (symbols 48 16464 2) (strings 32 53212 2712) (string-bytes 1 1428680) (vectors 16 32306) (vector-slots 8 1023137 126537) (floats 8 73 34) (intervals 56 2312 489) (buffers 992 16)) -- 馃摏 Christopher Howard 馃殌 gemini://gem.librehacker.com 馃寪 http://gem.librehacker.com 讘专讗砖讬转 讘专讗 讗诇讛讬诐 讗转 讛砖诪讬诐 讜讗转 讛讗专抓
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Sun, 22 Jun 2025 06:00:02 GMT) Full text and rfc822 format available.Message #8 received at 78860 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Christopher Howard <christopher <at> librehacker.com> Cc: 78860 <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Sun, 22 Jun 2025 08:59:11 +0300
> From: Christopher Howard <christopher <at> librehacker.com> > Date: Sat, 21 Jun 2025 20:24:38 -0800 > > > When I run the command "git status" in eshell, I am getting the error "wrong-number-of-arguments". > > M-x package-isolate <ENTER> <ENTER> > M-x eshell <ENTER> > git status <ENTER> [or] *git status <ENTER> > > With debug-on-error, here is the backtrace: > > ``` > Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2) > eshell-stringify("status" nil) > #f(compiled-function (i) #<bytecode 0x12a893834464da57>)("status") > mapcar(#f(compiled-function (i) #<bytecode 0x12a893834464da57>) ("status")) > eshell-connection-local-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > eshell-external-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > eshell-explicit-command("*git" ("status")) Crystal ball says you a version mismatch between the code that calls Eshell and Eshell itself. Because eshell-stringify indeed accepted only 1 argument in Emacs 30, but in Emacs 31 it can accept 2. FTR: I cannot reproduce this problem.
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Sun, 22 Jun 2025 14:40:04 GMT) Full text and rfc822 format available.Message #11 received at 78860 <at> debbugs.gnu.org (full text, mbox):
From: Christopher Howard <christopher <at> librehacker.com> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 78860 <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Sun, 22 Jun 2025 06:38:47 -0800
Eli Zaretskii <eliz <at> gnu.org> writes: > Crystal ball says you a version mismatch between the code that calls > Eshell and Eshell itself. Because eshell-stringify indeed accepted > only 1 argument in Emacs 30, but in Emacs 31 it can accept 2. Do you see anything in the bug report info that might suggest I am pulling in code from a weird place? At first, I was sure it must be something weird in my configuration or the packages I was using. So I did two things: (1) I adjusted my emacs start script to unset EMACSNATIVELOADPATH, so that emacs is not pulling code from any Emacs packages installed by Guix. EMACSLOADPATH only points to /home/christopher/local/share/emacs/30.1.90/lisp. (2) I used package-isolate to test this, with no packages, which in my understanding launches an instance of emacs that does not use my init file and does not have any packages loaded. I think that would also mean that the instance would not have any special eshell options set, nor be using any eshell special modules. If I follow each of the underlined functions in the backtrace, they each take me either to a file in ~/local/share/emacs/30.1.90/lisp/ or ~/Repos/emacs-30/src/. So I'm wondering where I went wrong. Maybe some bad code cached somewhere? Or something wrong with my checkout of the emacs-30 branch? I confirmed also this problem does not occur in the emacs-29 installed by Guix. -- Christopher Howard
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Sun, 22 Jun 2025 15:05:03 GMT) Full text and rfc822 format available.Message #14 received at 78860 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Christopher Howard <christopher <at> librehacker.com> Cc: 78860 <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Sun, 22 Jun 2025 18:04:52 +0300
> X-Spam-Status: No, score=0 tagged_above=-10 required=5 tests=[none] > autolearn=ham autolearn_force=no > From: Christopher Howard <christopher <at> librehacker.com> > Cc: 78860 <at> debbugs.gnu.org > Date: Sun, 22 Jun 2025 06:38:47 -0800 > > Eli Zaretskii <eliz <at> gnu.org> writes: > > > Crystal ball says you a version mismatch between the code that calls > > Eshell and Eshell itself. Because eshell-stringify indeed accepted > > only 1 argument in Emacs 30, but in Emacs 31 it can accept 2. > > Do you see anything in the bug report info that might suggest I am pulling in code from a weird place? I don't have enough information to say anything definitive, but the backtrace you posted, viz.: > Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2) > eshell-stringify("status" nil) > #f(compiled-function (i) #<bytecode 0x12a893834464da57>)("status") > mapcar(#f(compiled-function (i) #<bytecode 0x12a893834464da57>) ("status")) > eshell-connection-local-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > eshell-external-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > eshell-explicit-command("*git" ("status")) clearly shows that some byte-compiled function called from eshell-connection-local-command called eshell-stringify with 2 arguments, something that will only work in Emacs 31. Whereas your bug report says you are running Emacs 30.1.90. My first suspect would be Eshell, but that's all I could say. > So I'm wondering where I went wrong. Maybe some bad code cached somewhere? Or something wrong with my checkout of the emacs-30 branch? Maybe look at the value of load-history, it could tell you where you are loading Lisp packages from.
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Sun, 22 Jun 2025 15:53:03 GMT) Full text and rfc822 format available.Message #17 received at 78860 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: christopher <at> librehacker.com Cc: 78860 <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Sun, 22 Jun 2025 18:51:33 +0300
> Cc: 78860 <at> debbugs.gnu.org > Date: Sun, 22 Jun 2025 18:04:52 +0300 > From: Eli Zaretskii <eliz <at> gnu.org> > > > X-Spam-Status: No, score=0 tagged_above=-10 required=5 tests=[none] > > autolearn=ham autolearn_force=no > > From: Christopher Howard <christopher <at> librehacker.com> > > Cc: 78860 <at> debbugs.gnu.org > > Date: Sun, 22 Jun 2025 06:38:47 -0800 > > > > Eli Zaretskii <eliz <at> gnu.org> writes: > > > > > Crystal ball says you a version mismatch between the code that calls > > > Eshell and Eshell itself. Because eshell-stringify indeed accepted > > > only 1 argument in Emacs 30, but in Emacs 31 it can accept 2. > > > > Do you see anything in the bug report info that might suggest I am pulling in code from a weird place? > > I don't have enough information to say anything definitive, but the > backtrace you posted, viz.: > > > Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2) > > eshell-stringify("status" nil) > > #f(compiled-function (i) #<bytecode 0x12a893834464da57>)("status") > > mapcar(#f(compiled-function (i) #<bytecode 0x12a893834464da57>) ("status")) > > eshell-connection-local-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > > eshell-external-command("/home/christopher/.guix-home/profile/bin/git" ("status")) > > eshell-explicit-command("*git" ("status")) > > clearly shows that some byte-compiled function called from > eshell-connection-local-command called eshell-stringify with 2 > arguments, something that will only work in Emacs 31. Whereas your > bug report says you are running Emacs 30.1.90. I think this comes from here: (defun eshell-connection-local-command (command args) "Insert output from an external COMMAND, using ARGS. This always runs COMMAND using the connection associated with the current working directory." (setq args (eshell-stringify-list (flatten-tree args))) <<<<<<<<<<<< eshell-stringify-list is a defsubst in esh-util.el: (defsubst eshell-stringify-list (args &optional quoted) "Convert each element of ARGS into a string value." (mapcar (lambda (i) (eshell-stringify i quoted)) args)) The above is the version from Emacs 31, which clearly calls eshell-stringify with 2 arguments. So my guess is that your Eshell was somehow compiled when loading esh-util.el brought in the version from Emacs 31, and now esh-ext.elc (or the corresponding *.eln?) has the wrong definition of eshell-stringify-list expanded in it. My suggestion is to recompile all the *.el files under /home/christopher/local/share/emacs/30.1.90/lisp/eshell/, or maybe rebuild and reinstall Emacs anew.
Christopher Howard <christopher <at> librehacker.com>
:Christopher Howard <christopher <at> librehacker.com>
:Message #22 received at 78860-done <at> debbugs.gnu.org (full text, mbox):
From: Christopher Howard <christopher <at> librehacker.com> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 78860-done <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Sun, 22 Jun 2025 18:36:51 -0800
I determined that, for some unknown reason the elc file for esh-ext.el was not being recompiled, even after a "make clean". I was able to resolve this issue by running a "make distclean" instead, which deletes the all the elc files under the lisp directory. I'm mildy curious why that "make clean" does not delete elc files. In most projects I've used, make clean delete all compiled files. But I'm sure there must be some arcane reason for it, probably documented in some installation instructions I didn't bother to read. -- Christopher Howard
bug-gnu-emacs <at> gnu.org
:bug#78860
; Package emacs
.
(Mon, 23 Jun 2025 11:36:03 GMT) Full text and rfc822 format available.Message #25 received at 78860 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Christopher Howard <christopher <at> librehacker.com> Cc: 78860 <at> debbugs.gnu.org Subject: Re: bug#78860: 30.1.90; eshell: wrong-number-of-arguments Date: Mon, 23 Jun 2025 14:35:14 +0300
> From: Christopher Howard <christopher <at> librehacker.com> > Cc: 78860-done <at> debbugs.gnu.org > Date: Sun, 22 Jun 2025 18:36:51 -0800 > > I determined that, for some unknown reason the elc file for esh-ext.el was not being recompiled, even after a "make clean". I was able to resolve this issue by running a "make distclean" instead, which deletes the all the elc files under the lisp directory. OK, thanks. > I'm mildy curious why that "make clean" does not delete elc files. In most projects I've used, make clean delete all compiled files. But I'm sure there must be some arcane reason for it, probably documented in some installation instructions I didn't bother to read. The reason why we don't delete *.elc files as part of "make clean" is that Emacs release tarballs come with the *.elc files, and therefore they technically aren't considered "compiled by the build process". But "make distclean" doesn't remove the *.elc files, either, for the same reason. You need to use "make maintainer-clean" for that.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.