Package: emacs;
Reported by: Michelangelo Rodriguez <michelangelo.rodriguez <at> gmail.com>
Date: Wed, 29 Oct 2025 02:33:01 UTC
Severity: normal
Found in version 31.0.50
To reply to this bug, email your comments to 79716 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
bug-gnu-emacs <at> gnu.org:bug#79716; Package emacs.
(Wed, 29 Oct 2025 02:33:01 GMT) Full text and rfc822 format available.Michelangelo Rodriguez <michelangelo.rodriguez <at> gmail.com>:bug-gnu-emacs <at> gnu.org.
(Wed, 29 Oct 2025 02:33:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Michelangelo Rodriguez <michelangelo.rodriguez <at> gmail.com> To: bug-gnu-emacs <at> gnu.org Subject: 31.0.50; `package-vc-rebuild` fails for local packages installed as directories on master Date: Wed, 29 Oct 2025 03:31:56 +0100
Hi, Since the new installation method for local vc packages was introduced, it seems that `package-vc-rebuild` doesn't work when a package is installed using directories instead of symbolic links, while it works with the old method. After some debugging, it seems to me that the `package-vc--main-file` function looks for the "somepackage.el" file in the directory under "user-emacs-directory/elpa", but it is not there, but in the project's source directory. The generated backtrace is as follows (using emacs -q): ``` Debugger entered--Lisp error: (wrong-type-argument stringp nil) vc-file-getprop(nil vc-working-revision) vc-working-revision(nil) package-vc--unpack-1(#s(package-desc :name my-utils :version (0 1 0) :summary "my-utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil) "/Users/michelangelo/.emacs.d/elpa/my-utils") package-vc-rebuild(#s(package-desc :name my-utils :version (0 1 0) :summary "my-utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil)) #<subr funcall-interactively>(package-vc-rebuild #s(package-desc :name my-utils :version (0 1 0) :summary "My-Utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil)) apply(#<subr funcall-interactively> package-vc-rebuild #s(package-desc :name my-utils :version (0 1 0) :summary "My-Utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil)) ad-Advice-funcall-interactively(#<subr funcall-interactively> package-vc-rebuild #s(package-desc :name my-utils :version (0 1 0) :summary "My-Utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil)) apply(ad-Advice-funcall-interactively #<subr funcall-interactively> (package-vc-rebuild #s(package-desc :name my-utils :version (0 1 0) :summary "My-Utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil))) funcall-interactively(package-vc-rebuild #s(package-desc :name my-utils :version (0 1 0) :summary "My-Utils CLI interface." :reqs nil :kind vc :archive nil :dir "/Users/michelangelo/.emacs.d/elpa/my-utils" :extras ((:commit . "d9413592b48f93bfb5fa3b9163c695059a37e950")) :signed nil)) command-execute(package-vc-rebuild record) execute-extended-command(nil "package-vc-rebuild" "package-vc-rebuild") #<subr funcall-interactively>(execute-extended-command nil "package-vc-rebuild" "package-vc-rebuild") apply(#<subr funcall-interactively> execute-extended-command (nil "package-vc-rebuild" "package-vc-rebuild")) ad-Advice-funcall-interactively(#<subr funcall-interactively> execute-extended-command nil "package-vc-rebuild" "package-vc-rebuild") apply(ad-Advice-funcall-interactively #<subr funcall-interactively> (execute-extended-command nil "package-vc-rebuild" "package-vc-rebuild")) funcall-interactively(execute-extended-command nil "package-vc-rebuild" "package-vc-rebuild") command-execute(execute-extended-command)``` Regards In GNU Emacs 31.0.50 (build 1, aarch64-apple-darwin24.6.0, NS appkit-2575.70 Version 15.7 (Build 24G222)) of 2025-10-26 built on mac-mikey.local Repository revision: 515bbb859840d45fe0dd226c25ad0518fe413a63 Repository branch: master Windowing system distributor 'Apple', version 10.3.2575 System Description: macOS 15.7 Configured using: 'configure --with-native-compilation LDFLAGS=-L/usr/local/opt/openssl <at> 3/lib CPPFLAGS=-I/usr/local/opt/openssl <at> 3/include' Configured features: ACL DBUS GNUTLS LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY KQUEUE NS PDUMPER PNG SQLITE3 THREADS TOOLKIT_SCROLL_BARS TREE_SITTER WEBP ZLIB Important settings: value of $LANG: it_IT.UTF-8 locale-coding-system: utf-8-unix Major mode: Article Minor modes in effect: telega-root-auto-fill-mode: t telega-network-stats-mode: t telega-contact-birthdays-mode: t telega-active-video-chats-mode: t telega-active-locations-mode: t telega-patrons-mode: t telega-active-stories-mode: t greader-dict-mode: t greader-dict-toggle-filters: t projectile-mode: t override-global-mode: t eglot-booster-mode: t helm-mode: t helm-minibuffer-history-mode: t savehist-mode: t global-voice-lock-mode: t voice-lock-mode: t midnight-mode: t magit-wip-initial-backup-mode: t magit-wip-before-change-mode: t magit-wip-after-apply-mode: t magit-wip-after-save-mode: t magit-wip-mode: t global-git-commit-mode: t magit-auto-revert-mode: t server-mode: t greader-enriched-mode: t greader-auto-bookmark-mode: t greader-mode: t global-company-mode: t company-mode: t gcmh-mode: t dynamic-completion-mode: t auto-compile-on-load-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t minibuffer-nonselected-mode: t minibuffer-regexp-mode: t buffer-read-only: t indent-tabs-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /Users/michelangelo/my-utils/rust-utils hides /Users/michelangelo/.emacs.d/elpa/rust-mode-20250705.1444/rust-utils /Users/michelangelo/.emacs.d/elpa/transient-20251020.1535/transient hides /Applications/emacs.app/Contents/Resources/lisp/transient /Users/michelangelo/emacspeak.master/lisp/tetris hides /Applications/emacs.app/Contents/Resources/lisp/play/tetris Features: (shadow emacspeak-make-mode make-mode pcmpl-x cal-julian telega-obsolete telega telega-tdlib-events telega-match telega-root telega-info telega-chat telega-modes telega-company telega-emoji telega-user telega-notifications notifications telega-voip telega-msg telega-story telega-webpage visual-fill-column telega-tme telega-sticker telega-vvnote bindat telega-ffplay telega-i18n telega-sort telega-filter telega-ins telega-inline telega-util telega-folders telega-topic telega-media telega-tdlib telega-server telega-core telega-customize emacsbug pcmpl-gnu pcmpl-unix emacspeak-url-template emacspeak-feeds gmaps shr-color url-cache facemenu two-column help-fns radix-tree mailalias smtpmail string-edit gemini goto-addr vc-hg vc-git vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view emacsql-sqlite-builtin face-remap magit-extras sort gnus-cite smiley mm-archive mail-extr textsec uni-scripts idna-mapping uni-confusable textsec-check gnus-bcklg qp misearch multi-isearch gnus-async gnus-ml disp-table nndraft nnmh nnfolder utf-7 gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-cache copyright greader-dict winner tramp-archive tramp-gvfs helm-command emacspeak-xref emacspeak-widget emacspeak-view emacspeak-treesit emacspeak-transient emacspeak-tar emacspeak-tabulated-list emacspeak-tab-bar emacspeak-speedbar emacspeak-slime emacspeak-sh-script emacspeak-projectile emacspeak-project emacspeak-package emacspeak-outline emacspeak-org oc-basic ol-eww emacspeak-eww dom-addons eww vtable mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect ol-docview doc-view ol-bibtex emacspeak-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi org-element org-persist org-id org-refile org-element-ast emacspeak-amark emacspeak-nov emacspeak-message emacspeak-markdown emacspeak-magit emacspeak-kmacro emacspeak-info emacspeak-ido emacspeak-ibuffer emacspeak-helm emacspeak-gnus gm-nnir nnir emacspeak-hide emacspeak-forge emacspeak-flymake emacspeak-eshell emacspeak-epa emacspeak-elfeed emacspeak-eglot emacspeak-dired locate emacspeak-diff-mode emacspeak-custom emacspeak-compile emacspeak-company emacspeak-comint emacspeak-wizards emacspeak-calendar emacspeak-buff-menu emacspeak-bookmark emacspeak-arc emacspeak-add-log emacspeak-advice emacspeak-cedet checkdoc lisp-mnt gnus-demon nntp gnus-dired nov recentf org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src sh-script smie executable ob-comint org-pcomplete org-list org-footnote org-faces org-entities ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold org-fold-core org-keys oc org-loaddefs org-version org-compat org-macs esxml-query ebdb-message ebdb-gnus gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime smime dig gnus-sum gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win ebdb-mua ebdb-com ebdb-format ebdb eieio-opt speedbar ezimage dframe timezone helm-company helm-elisp helm-eval edebug helm-info slime-company slime apropos hyperspec projectile grep ibuf-ext ibuffer ibuffer-loaddefs use-package-bind-key bind-key use-package-ensure eglot-booster lua-ts-mode helm-mode helm-misc helm-files image-dired image-dired-tags image-dired-external image-dired-util image-mode exif helm-buffers helm-x-icons helm-occur helm-tags helm-locate helm-grep helm-regexp helm-utils helm-help helm-types helm helm-global-bindings helm-easymenu helm-core helm-source helm-multi-match helm-lib async ido-load-library cl magit-gitflow magit-popup forge-repos forge-tablist hl-line forge-topics forge-commands forge-semi forge-bitbucket forge-gogs forge-gitea forge-gitlab forge-github forge-client forge-forgejo forge-notify forge-revnote forge-pullreq forge-issue forge-discussion forge-topic yaml eieio-custom bug-reference forge-post forge-repo forge forge-core ghub-legacy ghub-graphql treepy gsexp ghub url-http url-gw url-auth let-alist gnutls forge-db closql emacsql-sqlite emacsql emacsql-compiler eieio-base magit-bookmark magit-submodule magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit magit-repos magit-apply dired-toggle-sudo vc vc-dispatcher c++-ts-mode c-ts-mode c-ts-common treesit tree-sitter-langs tree-sitter-langs-build tar-mode arc-mode archive-mode tree-sitter-hl tree-sitter tree-sitter-load tree-sitter-cli tsc tsc-dyn tsc-dyn-get tsc-obsolete remember ereader xml+ picture lsp-sourcekit lsp lsp-mode lsp-protocol spinner network-stream nsm markdown-mode color noutline outline lv inline ht f rust-playground elfeed-show elfeed-search bookmark message sendmail yank-media rfc822 mml mml-sec epa derived epg rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils mailheader elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib avl-tree url-queue xml-query tramp-sh shortdoc dired-rsync s dash dired-aux dired dired-loaddefs tramp-cache time-stamp tramp trampver tramp-integration tramp-message tramp-compat parse-time iso8601 tramp-loaddefs disk-usage dirtrack conto use-package-core eshell esh-cmd esh-ext esh-proc esh-opt esh-io esh-arg esh-module esh-module-loaddefs esh-util files-x cal-china lunar solar cal-dst cal-bahai cal-islam cal-hebrew holidays holiday-loaddefs appt diary-lib diary-loaddefs cal-menu calendar cal-loaddefs savehist eglot tree-widget external-completion jsonrpc flymake thingatpt ert ewoc debug backtrace compile greader-translate emacspeak-setup emacspeak-websearch emacspeak-google gweb g-utils emacspeak-we emacspeak-xslt swiftmac-voices emacspeak-loaddefs emacspeak emacspeak-speak battery dbus shr pixel-fill kinsoku url-file puny svg xml dom sox-gen emacspeak-keymap emacspeak-pronounce emacspeak-sounds voice-defs voice-setup dtk-speak emacspeak-preamble advice cus-edit company-oddmuse company-keywords company-etags etags fileloop generator xref project jka-compr company-gtags company-dabbrev-code company-dabbrev company-files company-clang company-capf company-cmake company-semantic company-template company-bbdb semantic/util-modes semantic/util semantic semantic/tag semantic/lex semantic/fw mode-local cedet midnight magit-wip magit-log which-func imenu magit-diff smerge-mode diff diff-mode track-changes easy-mmode git-commit log-edit pcvs-util add-log magit-core magit-autorevert autorevert filenotify magit-margin magit-transient magit-process with-editor shell pcomplete comint ansi-osc server ansi-color magit-mode transient pp edmacro kmacro benchmark magit-git magit-base magit-section format-spec cursor-sensor crm llama cond-let compat ido greader greader-piper greader-mac greader-speechd greader-espeak ring find-func view gnus nnheader gnus-util text-property-search time-date mail-utils range mm-util mail-prsvr wid-edit company gcmh completion auto-compile comp comp-cstr warnings comp-run comp-common rx cus-start cus-load 0blayout-autoloads addressbook-bookmark-autoloads ag-autoloads alarm-clock-autoloads auto-compile-autoloads auto-org-md-autoloads bbdb--autoloads bbdb-autoloads c-eldoc-autoloads cargo-autoloads casual-autoloads chatgpt-shell-autoloads company-ebdb-autoloads consult-autoloads conto-autoloads counsel-autoloads dart-mode-autoloads debbugs-autoloads denote-explore-autoloads denote-regexp-autoloads denote-search-autoloads denote-autoloads devdocs-autoloads devdocs-browser-autoloads dired-duplicates-autoloads dired-ranger-autoloads dired-hacks-utils-autoloads dired-rsync-autoloads dired-toggle-sudo-autoloads disk-usage-autoloads ebdb-autoloads cl-extra help-mode eglot-booster-autoloads el-search-autoloads elfeed-autotag-autoloads elfeed-goodies-autoloads elfeed-protocol-autoloads elfeed-tube-mpv-autoloads elfeed-tube-autoloads aio-autoloads elfeed-autoloads elgrep-autoloads elisp-lint-autoloads epl-autoloads ereader-autoloads espotify-autoloads flutter-autoloads flycheck-package-autoloads flymake-collection-autoloads forge-autoloads closql-autoloads gcmh-autoloads gemini-autoloads finder-inf github-explorer-autoloads glue-autoloads gnosis-autoloads google-this-autoloads google-translate-autoloads gpt-autoloads gpt-commit-autoloads gptai-autoloads gptel-autoloads graphql-autoloads greader-autoloads helm-ag-autoloads helm-company-autoloads helm-google-autoloads helm-rg-autoloads helm-slime-autoloads helm-youtube-autoloads helm-autoloads helm-core-autoloads async-autoloads html2org-autoloads hyperbole-autoloads kotl-autoloads hact set hhist ido-hacks-autoloads ido-load-library-autoloads ido-occasional-autoloads idomenu-autoloads liblouis-autoloads lice-autoloads lingva-autoloads link-hint-autoloads avy-autoloads listen-autoloads log4e-autoloads lsp-sourcekit-autoloads luwak-autoloads magit-annex-autoloads magit-diff-flycheck-autoloads flycheck-autoloads magit-filenotify-autoloads magit-gh-pulls-autoloads gh-autoloads logito-autoloads magit-gitflow-autoloads magit-gitlab-autoloads ghub-autoloads magit-imerge-autoloads magit-lfs-autoloads magit-autoloads pcase magit-popup-autoloads magit-stats-autoloads marshal-autoloads mastodon-autoloads md4rd-autoloads mhc-autoloads calfw-autoloads minuet-autoloads mpdired-autoloads mpv-autoloads my-utils-autoloads nnreddit-autoloads json-rpc-autoloads anaphora-autoloads nov-autoloads esxml-autoloads ob-applescript-autoloads ob-rust-autoloads ollama-buddy-autoloads org-contrib-autoloads org-gnosis-autoloads emacsql-autoloads osx-dictionary-autoloads osx-lib-autoloads osx-location-autoloads osx-plist-autoloads package-lint-autoloads pandoc-autoloads pandoc-mode-autoloads hydra-autoloads parinfer-rust-mode-autoloads password-generator-autoloads persist-autoloads persistent-soft-autoloads list-utils-autoloads pcache-autoloads plz-autoloads podcaster-autoloads popup-autoloads popwin-autoloads powerline-autoloads projectile-autoloads pydoc-autoloads relint-autoloads request-autoloads reveal-in-osx-finder-autoloads ripgrep-autoloads rsync-mode-autoloads rust-auto-use-autoloads rust-mode-autoloads rust-playground-autoloads shell-maker-autoloads signal-autoloads slime-company-autoloads company-autoloads slime-autoloads macrostep-autoloads slint-mode-autoloads smartparens-autoloads smex-autoloads stream-autoloads swift-helpful-autoloads lsp-mode-autoloads lv-autoloads markdown-mode-autoloads spinner-autoloads ht-autoloads f-autoloads swift-mode-autoloads swift3-mode-autoloads swiper-autoloads ivy-autoloads taxy-magit-section-autoloads taxy-autoloads magit-section-autoloads llama-autoloads telega-autoloads tmr-autoloads totp-auth-autoloads base32-autoloads tp-autoloads transient-autoloads cond-let-autoloads tree-mode-autoloads tree-sitter-langs-autoloads tree-sitter-autoloads treepy-autoloads tsc-autoloads unicad-autoloads virtualenvwrapper-autoloads s-autoloads visual-fill-column-autoloads w3m-load w3m-autoloads wfnames-autoloads wiki-summary-autoloads with-editor-autoloads world-time-mode-autoloads xml+-autoloads xr-autoloads yaml-autoloads yaxception-autoloads info dash-autoloads package browse-url xdg 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/ns-win ns-win ucs-normalize mule-util term/common-win 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 kqueue cocoa ns lcms2 multi-tty make-network-process tty-child-frames native-compile emacs) Memory information: ((conses 16 6050993 4060700) (symbols 48 122776 128) (strings 32 5511751 165620) (string-bytes 1 243587345) (vectors 16 1253716) (vector-slots 8 9975725 1234610) (floats 8 369308 1696376) (intervals 56 59002 5693) (buffers 1064 76))
bug-gnu-emacs <at> gnu.org:bug#79716; Package emacs.
(Sat, 01 Nov 2025 08:25:02 GMT) Full text and rfc822 format available.Message #8 received at 79716 <at> debbugs.gnu.org (full text, mbox):
From: Michelangelo Rodriguez <michelangelo.rodriguez <at> gmail.com> To: 79716 <at> debbugs.gnu.org Subject: Possible patch Date: Sat, 01 Nov 2025 09:24:27 +0100
Hi,
The patch I am proposing solves the problem in my case.
In essence, the `package-vc-install-from-checkout` function adds the actual directory where the project is located to the `:extra` slot of the package-desc.
The function `package-vc--main-file` behaves accordingly.
diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el
index 7433fce2d89..7b39b50b26f 100644
--- a/lisp/emacs-lisp/package-vc.el
+++ b/lisp/emacs-lisp/package-vc.el
@@ -244,7 +244,9 @@ package-vc--main-file
(let* ((pkg-spec (package-vc--desc->spec pkg-desc))
(name (symbol-name (package-desc-name pkg-desc)))
(directory (expand-file-name
- (or (plist-get pkg-spec :lisp-dir) ".")
+ (or (plist-get pkg-spec :lisp-dir)
+ (alist-get :vc-dir (package-desc-extras pkg-desc))
+ ".")
(or (package-desc-dir pkg-desc)
(expand-file-name name package-user-dir))))
(file (expand-file-name
@@ -946,6 +948,9 @@ package-vc-install-from-checkout
(package-desc-create
:name (intern name)
:dir pkg-dir
+ ;; We use the :extras slot of vc-desc to store the directory where the
+ ;; sources are actually located.
+ :extras (list (cons :vc-dir dir))
:kind 'vc)
(file-name-as-directory pkg-dir))))
Michelangelo
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.