Subject: bug#72333: Magit/Transient error message

From: Simon Tournier <[email-masked]>
Date: Fri, 30 Aug 2024 18:33:46 +0200

Hi,

On Sun, 28 Jul 2024 at 15:41, daniel szmulewicz <[email-masked]> wrote:
> Running M-x magit-branch generates the following error:
>
> transient-setup: Symbol’s function definition is void:
> transient-prefix-object
>
> In order to reproduce:
>
> guix shell emacs emacs-magit -- emacs -Q
>
> M-x magit-version
> Magit 3.3.0-8.538cb2f, Transient 0.7.3, Git 2.45.2, Emacs 29.4, gnu/linux

Well, that’s annoying.  Using Guix revision d531237 (CommitDate: Thu Aug
29), I also get this error about Transient and thus it makes Magit
hardly usable with local fixes.

This issue is that emacs-magit does not use the package emacs-transient
but the built-in transient.  I mean it fails similarly when removing
emacs-transient from the list of propagated-inputs.

Why is emacs-transient not loaded?

--8<---------------cut here---------------start------------->8---
$ ag --elisp 'defvar transient--buffer' $(./pre-inst-env guix build -S emacs-transient)
/gnu/store/jhbk7wzs9lh7myav6czyxx4i2wgyw3vl-emacs-transient-0.7.4-checkout/lisp/transient.el
1547:(defvar transient--buffer-name " *transient*"
1550:(defvar transient--buffer nil

$ ./pre-inst-env guix shell -C -E TERM emacs emacs-transient \
   -- emacs --batch --eval "(progn (require 'transient) (print transient--buffer))"

Error: void-variable (transient--buffer)
  mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode 0x1a5b59c931aef3ca>))
  debug-early-backtrace()
  debug-early(error (void-variable transient--buffer))
  (print transient--buffer)
  (progn (require 'transient) (print transient--buffer))
  command-line-1(("--eval" "(progn (require 'transient) (print transient--buffer))"))
  command-line()
  normal-top-level()
Symbol's value as variable is void: transient--buffer
--8<---------------cut here---------------end--------------->8---

And built-in transient is used instead?

--8<---------------cut here---------------start------------->8---
$ ./pre-inst-env guix shell -C -E TERM emacs emacs-transient \
   -- emacs --batch --eval "(progn (require 'transient) (print transient--buffer-name))"

" *transient*"
--8<---------------cut here---------------end--------------->8---

Please note it works as expected with say Org:

--8<---------------cut here---------------start------------->8---
$ ./pre-inst-env guix shell -C -E TERM emacs \
   -- emacs --batch --eval "(print (org-version)))"

"9.6.15"

$ ./pre-inst-env guix shell -C -E TERM emacs emacs-org \
   -- emacs --batch --eval "(print (org-version)))"

"9.7.10"
--8<---------------cut here---------------end--------------->8---

Cheers,
simon